diff --git a/.env b/.env deleted file mode 100644 index 6f809cc2..00000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -SKIP_PREFLIGHT_CHECK=true diff --git a/.eslintrc b/.eslintrc index 8f3d1b66..8d271634 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,62 +1,72 @@ { - "plugins": ["react"], - "parser": "babel-eslint", - "settings": { - "react": { - "createClass": "createReactClass", - "pragma": "React", - "version": "detect", - "flowVersion": "0.53" - } - }, - "env": { - "browser": true, - "node": true, - "jest": true - }, - "globals": { - "shallow": true - }, - "rules": { - "react/jsx-uses-react": "error", - "react/jsx-uses-vars": "error", - "react/prefer-es6-class" : [2], - "linebreak-style": "off", - "no-unused-vars": ["error"], - "no-alert": "off", - "no-underscore-dangle": "off", - "vars-on-top": "off", - "space-before-function-paren": ["warn", "never"], - "no-mixed-operators": "off", - "key-spacing": "off", - "spaced-comment": "off", - "func-names": "off", - "function-paren-newline": ["error", "never"], - "padded-blocks": "off", - "quote-props": "off", - "one-var-declaration-per-line": "off", - "max-len": [1, 200, 2, {"ignoreComments": true}], - "object-curly-spacing": ["error", "always"], - "no-param-reassign": "off", - "one-var": "off", - "no-undef": "off", - "no-console": "off", - "comma-dangle": "off", - "no-multi-spaces": "off", - "no-prototype-builtins": "off", - "wrap-iife": ["error", "any"], - "no-use-before-define": ["error", "nofunc"], - "object-property-newline": "off", - "no-restricted-syntax": "off", - "no-else-return": "off", - "no-cond-assign": ["error", "except-parens"], - "space-infix-ops": ["warn", {"int32Hint": true}], - "no-nested-ternary": "off", - "global-require": "off", - "no-continue": "off", - "no-bitwise": "off", - "no-plusplus": "off", - "no-multi-assign": "off", - "lines-between-class-members": ["error", "always"] + "env": { + "browser": true, + "node": true, + "jest": true, + "es6": true + }, + "root": true, + "parser": "babel-eslint", + "plugins": ["react", "prettier"], + "extends": ["eslint:recommended", "plugin:react/recommended", "prettier"], + "settings": { + "react": { + "createClass": "createReactClass", + "pragma": "React", + "version": "detect", + "flowVersion": "0.53" } + }, + "globals": { + "shallow": true + }, + "rules": { + "react/jsx-uses-react": "error", + "react/jsx-uses-vars": "error", + "react/prefer-es6-class": [2], + "react/prop-types": "off", + "react/no-string-refs": "off", + "react/jsx-no-undef": "off", + "react/jsx-key": "off", + "no-case-declarations": "off", + "react/no-unescaped-entities": "off", + "linebreak-style": "off", + "no-unused-vars": ["error"], + "no-alert": "off", + "no-underscore-dangle": "off", + "vars-on-top": "off", + "space-before-function-paren": ["warn", "never"], + "no-mixed-operators": "off", + "key-spacing": "off", + "spaced-comment": "off", + "func-names": "off", + "padded-blocks": "off", + "quote-props": "off", + "one-var-declaration-per-line": "off", + "max-len": [1, 200, 2, { "ignoreComments": true }], + "object-curly-spacing": ["error", "always"], + "no-param-reassign": "off", + "one-var": "off", + "no-undef": "off", + "no-console": "off", + "comma-dangle": "off", + "no-multi-spaces": "off", + "no-prototype-builtins": "off", + "wrap-iife": ["error", "any"], + "no-use-before-define": ["error", "nofunc"], + "object-property-newline": "off", + "no-restricted-syntax": "off", + "no-else-return": "off", + "no-cond-assign": ["error", "except-parens"], + "space-infix-ops": ["warn", { "int32Hint": true }], + "no-nested-ternary": "off", + "global-require": "off", + "no-continue": "off", + "no-bitwise": "off", + "no-plusplus": "off", + "no-multi-assign": "off", + "lines-between-class-members": ["error", "always"], + "no-debugger": "warn", + "prettier/prettier": ["error"] + } } diff --git a/.gitignore b/.gitignore index d18a37bd..291d2228 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ yarn-error.log* /.idea /.vscode +/mriviewer.sln +/.vs diff --git a/.husky/.gitignore b/.husky/.gitignore deleted file mode 100644 index 31354ec1..00000000 --- a/.husky/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_ diff --git a/.husky/pre-commit b/.husky/pre-push old mode 100755 new mode 100644 similarity index 57% rename from .husky/pre-commit rename to .husky/pre-push index 36af2198..db6a3cda --- a/.husky/pre-commit +++ b/.husky/pre-push @@ -1,4 +1,4 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" -npx lint-staged +npm run format && npm run lint diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..59d973b3 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "trailingComma": "es5", + "printWidth": 140, + "bracketSpacing": true, + "endOfLine": "auto", + "singleQuote": true, + "semi": true, + "tabWidth": 2 +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1e475041..9c75abbe 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,6 +10,10 @@ $ npm i $ npm start ``` +## IDE Configuration + +https://stackoverflow.com/questions/41920324/adding-spaces-between-imports-and-braces-in-webstorm + ## Submitting changes We are following [GitHub's Collaborating with Issues and Pull Requests Guide](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests) diff --git a/docker/Dockerfile b/docker/Dockerfile index bcceb04d..cdb3611b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -3,6 +3,6 @@ RUN apk update && apk upgrade && \ apk add --no-cache curl WORKDIR /usr/share/nginx/html COPY ./nginx.conf /etc/nginx/nginx.conf -COPY build . +COPY build /usr/share/nginx/html HEALTHCHECK --interval=10s --timeout=3s \ - CMD curl -f http://localhost:4010/user-count/metrics || exit 1 \ No newline at end of file + CMD curl -f http://localhost:4010/user-count/metrics || exit 1 diff --git a/package-lock.json b/package-lock.json index b1a427f1..01e211cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,61 +1,90 @@ { "name": "mri-viewer", - "version": "1.0.1", + "version": "1.0.2", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "1.0.1", + "name": "mri-viewer", + "version": "1.0.2", "license": "Apache-2.0", "dependencies": { - "@tensorflow/tfjs": "^1.7.4", - "bootstrap": "^4.5.0", + "@emotion/react": "^11.8.1", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.4.3", + "@popperjs/core": "^2.9.2", + "@tensorflow/tfjs": "^3.6.0", + "classnames": "^2.3.1", "daikon": "^1.2.42", "eslint": "^7.27.0", "filereader-stream": "^2.0.0", - "jquery": "^3.5.1", - "popper.js": "^1.16.1", - "react": "^16.13.1", - "react-bootstrap": "^1.0.1", - "react-bootstrap-table-next": "^3.3.5", - "react-dom": "^16.13.1", - "react-nouislider": "^2.0.1", - "react-redux": "^6.0.0", + "react": "^17.0.2", + "react-dnd": "^14.0.2", + "react-dnd-html5-backend": "^14.0.0", + "react-dom": "^17.0.2", + "react-modal": "^3.14.2", + "react-popper": "^2.2.5", + "react-redux": "7.2.4", "react-scripts": "4.0.3", - "redux": "^4.0.5", - "three": "^0.101.1", - "zlib": "^1.0.5" + "redux": "4.1.0", + "seedrandom": "^2.4.4", + "three": "0.101.1", + "zlib": "1.x.x" }, "devDependencies": { "@babel/core": "7.14.3", + "@testing-library/jest-dom": "^5.14.1", + "@testing-library/react": "^12.1.0", + "@testing-library/react-hooks": "^7.0.2", + "@testing-library/user-event": "^13.2.1", "canvas": "^2.6.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-react": "7.x.x", - "husky": "^6.0.0", + "husky": "^7.0.0", "lint-staged": "^11.0.0", - "node-pre-gyp": "^0.14.0" + "node-pre-gyp": "^0.14.0", + "prettier": "^2.4.1", + "puppeteer": "^10.2.0" + }, + "engines": { + "node": ">=12.20.1", + "npm": ">=7.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.1.2", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.0" }, "engines": { - "node": ">=12.16.1", - "npm": ">=6.13.4" + "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.14.5", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", - "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==" + "version": "7.17.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/core": { "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", - "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.14.3", @@ -81,103 +110,127 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", - "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", + "version": "7.14.8", + "license": "MIT", "dependencies": { - "@babel/types": "^7.14.2", + "@babel/types": "^7.14.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "version": "7.16.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "version": "7.16.7", + "license": "MIT", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", - "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.3.tgz", - "integrity": "sha512-BnEfi5+6J2Lte9LeiL6TxLWdIlEv9Woacc1qXzXBgbikcOzMRM2Oya5XGg/f/ngotv1ej2A/b+3iJH8wbS1+lQ==", + "version": "7.17.6", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.14.3", - "@babel/helper-split-export-declaration": "^7.12.13" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz", - "integrity": "sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA==", + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "regexpu-core": "^4.7.1" + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "version": "0.3.1", + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -192,873 +245,902 @@ "@babel/core": "^7.4.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/types": "^7.13.0" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" + "node_modules/@babel/helper-environment-visitor/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "node_modules/@babel/helper-environment-visitor/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz", - "integrity": "sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==", + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.16" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dependencies": { - "@babel/types": "^7.13.12" + "node_modules/@babel/helper-explode-assignable-expression/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "node_modules/@babel/helper-explode-assignable-expression/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/types": "^7.13.12" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", - "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", - "dependencies": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.14.0", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2" + "node_modules/@babel/helper-function-name": { + "version": "7.16.7", + "license": "MIT", + "dependencies": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "node_modules/@babel/helper-function-name/node_modules/@babel/code-frame": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" + "node_modules/@babel/helper-function-name/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz", - "integrity": "sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2" + "node_modules/@babel/helper-function-name/node_modules/@babel/parser": { + "version": "7.17.3", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "node_modules/@babel/helper-function-name/node_modules/@babel/template": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/types": "^7.13.12" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "node_modules/@babel/helper-function-name/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/types": "^7.12.1" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==" - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", - "dependencies": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "node_modules/@babel/helper-get-function-arity/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", - "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "node_modules/@babel/helper-get-function-arity/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.3.tgz", - "integrity": "sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ==", - "bin": { - "parser": "bin/babel-parser.js" - }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", - "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.13.12" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.13.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz", - "integrity": "sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/types": "^7.16.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz", - "integrity": "sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ==", + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.3", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-class-static-block": "^7.12.13" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.12.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", - "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", + "node_modules/@babel/helper-module-imports": { + "version": "7.14.5", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-decorators": "^7.12.1" + "@babel/types": "^7.14.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz", - "integrity": "sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.14.8", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.8", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz", - "integrity": "sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/types": "^7.16.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz", - "integrity": "sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz", - "integrity": "sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg==", + "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz", - "integrity": "sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz", - "integrity": "sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.2.tgz", - "integrity": "sha512-hBIQFxwZi8GIp934+nj5uV31mqclC1aYDhctDu5khTi9PCCUOczyy0b34W0oE9U/eJXiqQaKyVsmjeagOaSlbw==", - "dependencies": { - "@babel/compat-data": "^7.14.0", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz", - "integrity": "sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ==", + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz", - "integrity": "sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/code-frame": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/highlight": "^7.16.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz", - "integrity": "sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/generator": { + "version": "7.17.3", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-create-class-features-plugin": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-private-property-in-object": "^7.14.0" + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, + "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@babel/helper-replace-supers/node_modules/@babel/parser": { + "version": "7.17.3", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/traverse": { + "version": "7.17.3", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@babel/helper-replace-supers/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz", - "integrity": "sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A==", + "node_modules/@babel/helper-simple-access": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/types": "^7.16.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", - "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@babel/helper-simple-access/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@babel/helper-simple-access/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/types": "^7.16.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", - "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/types": "^7.16.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", - "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.8", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.16.8", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@babel/helper-wrap-function/node_modules/@babel/code-frame": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/highlight": "^7.16.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@babel/helper-wrap-function/node_modules/@babel/generator": { + "version": "7.17.3", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/parser": { + "version": "7.17.3", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/helper-wrap-function/node_modules/@babel/traverse": { + "version": "7.17.3", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz", - "integrity": "sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w==", + "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "node_modules/@babel/helpers": { + "version": "7.14.8", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", - "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", + "node_modules/@babel/highlight": { + "version": "7.16.10", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "node_modules/@babel/highlight/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.14.8", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.8", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.2.tgz", - "integrity": "sha512-neZZcP19NugZZqNwMTH+KoBjx5WyvESPSIOQb4JHpfd+zPfqcH65RMu5xJju5+6q/Y2VzYrleQTr+b6METyyxg==", + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.2.tgz", - "integrity": "sha512-7oafAVcucHquA/VZCsXv/gmuiHeYd64UJyyTYU+MPfNu0KeNlxw06IeENBO8bJjXVbolu+j1MM5aKQtH1OMCNg==", + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.17.6", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "globals": "^11.1.0" + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.17.2", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.17.1", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/plugin-syntax-decorators": "^7.17.0", + "charcodes": "^0.2.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz", - "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==", + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", - "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-flow": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.17.3", + "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz", - "integrity": "sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw==", + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.16.11", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helper-plugin-utils": "^7.13.0", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", - "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.13.12", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz", - "integrity": "sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { + "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -1066,1572 +1148,2529 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", - "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==", + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz", - "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.2.tgz", - "integrity": "sha512-zCubvP+jjahpnFJvPaHPiGVfuVUjXHhFvJKQdNnsmSsiU9kR/rCZ41jHc++tERD2zV+p7Hr6is+t5b6iWTCqSw==", + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.3.tgz", - "integrity": "sha512-uuxuoUNVhdgYzERiHHFkE4dWoJx+UFVyuAl0aqN8P2/AKFHwqgUC5w2+4/PjpKXJsFgBlYAFXlUmDQ3k3DUkXw==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/types": "^7.14.2" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", - "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.12.17" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", - "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.2.tgz", - "integrity": "sha512-OMorspVyjxghAjzgeAWc6O7W7vHbJhV69NeTGdl9Mxgz6PaweAuo7ffB9T5A1OQ9dGcw0As4SYMUhyNC4u7mVg==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", - "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", - "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "license": "MIT", "dependencies": { - "regenerator-transform": "^0.14.2" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", - "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.3.tgz", - "integrity": "sha512-G5Bb5pY6tJRTC4ag1visSgiDoGgJ1u1fMUgmc2ijLkcIdzP83Q1qyZX4ggFQ/SkR+PNOatkaYC+nKcTlpsX4ag==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.16.8", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.3", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-typescript": "^7.12.13" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.2.tgz", - "integrity": "sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.16.7", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.14.0", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.14.2", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-class-static-block": "^7.13.11", - "@babel/plugin-proposal-dynamic-import": "^7.14.2", - "@babel/plugin-proposal-export-namespace-from": "^7.14.2", - "@babel/plugin-proposal-json-strings": "^7.14.2", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.2", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.2", - "@babel/plugin-proposal-numeric-separator": "^7.14.2", - "@babel/plugin-proposal-object-rest-spread": "^7.14.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.2", - "@babel/plugin-proposal-optional-chaining": "^7.14.2", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-private-property-in-object": "^7.14.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.12.13", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.0", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.14.2", - "@babel/plugin-transform-classes": "^7.14.2", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.17", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.14.2", - "@babel/plugin-transform-modules-commonjs": "^7.14.0", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.14.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.14.2", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.13.15", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.2", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", - "core-js-compat": "^3.9.0", - "semver": "^6.3.0" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.17.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-react": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", - "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-transform-react-display-name": "^7.12.13", - "@babel/plugin-transform-react-jsx": "^7.13.12", - "@babel/plugin-transform-react-jsx-development": "^7.12.17", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", - "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.12.1" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.13.4" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-flow": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.0.tgz", - "integrity": "sha512-0R0HTZWHLk6G8jIk0FtoX+AatCtKnswS98VhXwGImFc759PJRp4Tru0PQYZofyijTFUr+gT8Mu7sgXVJLQ0ceg==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.4" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.12.13" + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/code-frame": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/generator": { + "version": "7.17.3", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" + "@babel/types": "^7.16.7" }, - "bin": { - "watch": "cli.js" + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-module-transforms": { + "version": "7.17.6", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" }, "engines": { - "node": ">=0.1.95" + "node": ">=6.9.0" } }, - "node_modules/@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", "engines": { - "node": ">=4.0.0" + "node": ">=6.9.0" } }, - "node_modules/@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/parser": { + "version": "7.17.3", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz", - "integrity": "sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==", + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/template": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/traverse": { + "version": "7.17.3", + "license": "MIT", "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "type-fest": "^0.8.1" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.16.8", + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/eslintrc/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/code-frame": { + "version": "7.16.7", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.16.7" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/generator": { + "version": "7.17.3", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "engines": { - "node": ">=8" - } - }, - "node_modules/@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "deprecated": "Moved to 'npm install @sideway/address'" - }, - "node_modules/@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", - "deprecated": "This version has been deprecated and is no longer supported or maintained" - }, - "node_modules/@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "deprecated": "This version has been deprecated and is no longer supported or maintained" - }, - "node_modules/@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "deprecated": "Switch to 'npm install joi'", - "dependencies": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" + "node": ">=6.9.0" } }, - "node_modules/@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", - "deprecated": "This version has been deprecated and is no longer supported or maintained", + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@hapi/hoek": "^8.3.0" + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-module-transforms": { + "version": "7.17.6", + "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/parser": { + "version": "7.17.3", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/template": { + "version": "7.16.7", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/traverse": { + "version": "7.17.3", + "license": "MIT", "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" } }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/code-frame": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@babel/highlight": "^7.16.7" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/generator": { + "version": "7.17.3", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@babel/types": "^7.16.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-module-transforms": { + "version": "7.17.6", + "license": "MIT", "dependencies": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" }, "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/parser": { + "version": "7.17.3", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6.0.0" } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/template": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/traverse": { + "version": "7.17.3", + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/core/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/code-frame": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "@babel/highlight": "^7.16.7" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/generator": { + "version": "7.17.3", + "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "@babel/types": "^7.16.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-module-transforms": { + "version": "7.17.6", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/parser": { + "version": "7.17.3", + "license": "MIT", "bin": { - "rimraf": "bin.js" + "parser": "bin/babel-parser.js" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@jest/core/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/template": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.0" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/traverse": { + "version": "7.17.3", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/core/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" } }, - "node_modules/@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.8", + "license": "MIT", "dependencies": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "@babel/helper-create-regexp-features-plugin": "^7.16.7" }, "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" }, "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" }, - "optionalDependencies": { - "node-notifier": "^8.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.17.6", + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/reporters/node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/reporters/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.17.3", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.16.7", + "@babel/types": "^7.17.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/reporters/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "@babel/plugin-transform-react-jsx": "^7.16.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/reporters/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "@babel/types": "^7.16.7" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/@jest/reporters/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@jest/reporters/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/reporters/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.16.7", + "license": "MIT", + "dependencies": { + "regenerator-transform": "^0.14.2" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/source-map/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.17.0", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, "engines": { - "node": ">=6" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/source-map/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.16.7" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, + "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" } }, - "node_modules/@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" } }, - "node_modules/@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/transform/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.16.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.16.8", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-typescript": "^7.16.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { - "node": ">= 10.14.2" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "node_modules/@babel/preset-env": { + "version": "7.16.11", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", + "semver": "^6.3.0" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/preset-env/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" } }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@babel/preset-react": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-react-display-name": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx-development": "^7.16.7", + "@babel/plugin-transform-react-pure-annotations": "^7.16.7" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "node_modules/@babel/preset-typescript": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.4", - "run-parallel": "^1.1.9" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.16.7" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "node_modules/@babel/runtime": { + "version": "7.17.2", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "node_modules/@babel/runtime-corejs3": { + "version": "7.17.2", + "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.4", - "fastq": "^1.6.0" + "core-js-pure": "^3.20.2", + "regenerator-runtime": "^0.13.4" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "node_modules/@babel/template": { + "version": "7.14.5", + "license": "MIT", "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" + "node_modules/@babel/traverse": { + "version": "7.14.8", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.8", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.8", + "@babel/types": "^7.14.8", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/@babel/types": { + "version": "7.14.8", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "@babel/helper-validator-identifier": "^7.14.8", + "to-fast-properties": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@popperjs/core": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.4.4.tgz", - "integrity": "sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg==" - }, - "node_modules/@restart/context": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", - "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "license": "MIT" }, - "node_modules/@restart/hooks": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.25.tgz", - "integrity": "sha512-m2v3N5pxTsIiSH74/sb1yW8D9RxkJidGW+5Mfwn/lHb2QzhZNlaU1su7abSyT9EGf0xS/0waLjrf7/XxQHUk7w==", + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "license": "Apache-2.0", "dependencies": { - "lodash": "^4.17.15", - "lodash-es": "^4.17.15" + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" } }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", - "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", - "dependencies": { - "@rollup/pluginutils": "^3.0.8", - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.14.2" - }, + "node_modules/@csstools/convert-colors": { + "version": "1.4.0", + "license": "CC0-1.0", "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" + "node": ">=4.0.0" } }, - "node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "node_modules/@csstools/normalize.css": { + "version": "10.1.0", + "license": "CC0-1.0" + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.7.2", + "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" + "@babel/helper-module-imports": "^7.12.13", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/runtime": "^7.13.10", + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.5", + "@emotion/serialize": "^1.0.2", + "babel-plugin-macros": "^2.6.1", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.0.13" }, "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">= 8.0.0" + "node": ">=10" }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "node_modules/@emotion/cache": { + "version": "11.7.1", + "license": "MIT", "dependencies": { - "type-detect": "4.0.8" + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "node_modules/@emotion/hash": { + "version": "0.8.0", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.1.2", + "license": "MIT", "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@emotion/memoize": "^0.7.4" } }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", - "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", + "node_modules/@emotion/memoize": { + "version": "0.7.5", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.8.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/cache": "^11.7.1", + "@emotion/serialize": "^1.0.2", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.1.0", + "@emotion/weak-memoize": "^0.2.5", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.8.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/is-prop-valid": "^1.1.2", + "@emotion/serialize": "^1.0.2", + "@emotion/utils": "^1.1.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "license": "MIT" + }, + "node_modules/@emotion/utils": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.2.5", + "license": "MIT" + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.12.1", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/joi": { + "version": "15.1.1", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "node_modules/@hapi/topo": { + "version": "3.1.6", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^8.3.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "26.6.2", + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "26.6.2", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/fake-timers": { + "version": "26.6.2", + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/globals": { + "version": "26.6.2", + "license": "MIT", + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/source-map": { + "version": "26.6.2", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "26.6.2", + "license": "MIT", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "26.6.3", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform": { + "version": "26.6.2", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.5", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.4", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-alpha.69", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.0", + "@emotion/is-prop-valid": "^1.1.1", + "@mui/utils": "^5.4.2", + "@popperjs/core": "^2.4.4", + "clsx": "^1.1.1", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^17.0.0", + "react-dom": "^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/react-is": { + "version": "17.0.2", + "license": "MIT" + }, + "node_modules/@mui/material": { + "version": "5.4.3", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.0", + "@mui/base": "5.0.0-alpha.69", + "@mui/system": "^5.4.3", + "@mui/types": "^7.1.2", + "@mui/utils": "^5.4.2", + "@types/react-transition-group": "^4.4.4", + "clsx": "^1.1.1", + "csstype": "^3.0.10", + "hoist-non-react-statics": "^3.3.2", + "prop-types": "^15.7.2", + "react-is": "^17.0.2", + "react-transition-group": "^4.4.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^17.0.0", + "react-dom": "^17.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "17.0.2", + "license": "MIT" + }, + "node_modules/@mui/private-theming": { + "version": "5.4.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.2", + "@mui/utils": "^5.4.4", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.4.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.2", + "@emotion/cache": "^11.7.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.4.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.2", + "@mui/private-theming": "^5.4.4", + "@mui/styled-engine": "^5.4.4", + "@mui/types": "^7.1.2", + "@mui/utils": "^5.4.4", + "clsx": "^1.1.1", + "csstype": "^3.0.10", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^17.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.1.2", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.4.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.2", + "@types/prop-types": "^15.7.4", + "@types/react-is": "^16.7.1 || ^17.0.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0" + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "17.0.2", + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.3.5", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.4.3", + "license": "MIT", + "dependencies": { + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.x" + }, + "peerDependencies": { + "@types/webpack": "4.x", + "react-refresh": ">=0.8.3 <0.10.0", + "sockjs-client": "^1.4.0", + "type-fest": "^0.13.1", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.3", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.9.2", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@react-dnd/asap": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/@react-dnd/invariant": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/@react-dnd/shallowequal": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "7.1.3", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "1.4.2", + "license": "Apache-2.0", "dependencies": { "ejs": "^2.6.1", "magic-string": "^0.25.0" @@ -2639,8 +3678,7 @@ }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -2651,380 +3689,661 @@ }, "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, "engines": { "node": ">=10" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@tensorflow/tfjs": { + "version": "3.8.0", + "license": "Apache-2.0", + "dependencies": { + "@tensorflow/tfjs-backend-cpu": "3.8.0", + "@tensorflow/tfjs-backend-webgl": "3.8.0", + "@tensorflow/tfjs-converter": "3.8.0", + "@tensorflow/tfjs-core": "3.8.0", + "@tensorflow/tfjs-data": "3.8.0", + "@tensorflow/tfjs-layers": "3.8.0", + "argparse": "^1.0.10", + "chalk": "^4.1.0", + "core-js": "3", + "regenerator-runtime": "^0.13.5", + "yargs": "^16.0.3" + }, + "bin": { + "tfjs-custom-module": "dist/tools/custom_module/cli.js" + } + }, + "node_modules/@tensorflow/tfjs-backend-cpu": { + "version": "3.8.0", + "license": "Apache-2.0", + "dependencies": { + "@types/seedrandom": "2.4.27", + "seedrandom": "2.4.3" + }, + "engines": { + "yarn": ">= 1.3.2" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "3.8.0" + } + }, + "node_modules/@tensorflow/tfjs-backend-cpu/node_modules/seedrandom": { + "version": "2.4.3", + "license": "MIT" + }, + "node_modules/@tensorflow/tfjs-backend-webgl": { + "version": "3.8.0", + "license": "Apache-2.0", + "dependencies": { + "@tensorflow/tfjs-backend-cpu": "3.8.0", + "@types/offscreencanvas": "~2019.3.0", + "@types/seedrandom": "2.4.27", + "@types/webgl-ext": "0.0.30", + "@types/webgl2": "0.0.5", + "seedrandom": "2.4.3" + }, + "engines": { + "yarn": ">= 1.3.2" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "3.8.0" + } + }, + "node_modules/@tensorflow/tfjs-backend-webgl/node_modules/seedrandom": { + "version": "2.4.3", + "license": "MIT" + }, + "node_modules/@tensorflow/tfjs-converter": { + "version": "3.8.0", + "license": "Apache-2.0", + "peerDependencies": { + "@tensorflow/tfjs-core": "3.8.0" + } + }, + "node_modules/@tensorflow/tfjs-core": { + "version": "3.8.0", + "license": "Apache-2.0", + "dependencies": { + "@types/long": "^4.0.1", + "@types/offscreencanvas": "~2019.3.0", + "@types/seedrandom": "2.4.27", + "@types/webgl-ext": "0.0.30", + "long": "4.0.0", + "node-fetch": "~2.6.1", + "seedrandom": "2.4.3" + }, + "engines": { + "yarn": ">= 1.3.2" + } + }, + "node_modules/@tensorflow/tfjs-core/node_modules/seedrandom": { + "version": "2.4.3", + "license": "MIT" + }, + "node_modules/@tensorflow/tfjs-data": { + "version": "3.8.0", + "license": "Apache-2.0", + "dependencies": { + "@types/node-fetch": "^2.1.2", + "node-fetch": "~2.6.1" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "3.8.0", + "seedrandom": "~2.4.3" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node_modules/@tensorflow/tfjs-layers": { + "version": "3.8.0", + "license": "Apache-2.0 AND MIT", + "peerDependencies": { + "@tensorflow/tfjs-core": "3.8.0" } }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "node_modules/@tensorflow/tfjs/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "node_modules/@tensorflow/tfjs/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "engines": { - "node": ">=10" + "node_modules/@tensorflow/tfjs/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "node_modules/@tensorflow/tfjs/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/@tensorflow/tfjs/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=8" } }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "engines": { - "node": ">=10" + "node_modules/@tensorflow/tfjs/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "engines": { + "node": ">=8" } }, - "node_modules/@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "node_modules/@testing-library/dom": { + "version": "8.11.3", + "dev": true, + "license": "MIT", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=12" } }, - "node_modules/@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", "dependencies": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": ">=6.0" } }, - "node_modules/@svgr/core/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@svgr/core/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/@testing-library/dom/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=7.0.0" } }, - "node_modules/@svgr/core/node_modules/resolve-from": { + "node_modules/@testing-library/dom/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/dom/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.12.6" + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "dependencies": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - }, + "node_modules/@testing-library/dom/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/dom/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=8" } }, - "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "node_modules/@testing-library/jest-dom": { + "version": "5.16.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/@svgr/plugin-svgo/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@svgr/plugin-svgo/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/@testing-library/jest-dom/node_modules/aria-query": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom/node_modules/css": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" } }, - "node_modules/@svgr/plugin-svgo/node_modules/resolve-from": { + "node_modules/@testing-library/jest-dom/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - }, + "node_modules/@testing-library/jest-dom/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=0.10.0" } }, - "node_modules/@svgr/webpack/node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "node_modules/@testing-library/jest-dom/node_modules/source-map-resolve": { + "version": "0.6.0", + "dev": true, + "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": ">=8.9.0" + "node": ">=8" } }, - "node_modules/@tensorflow/tfjs": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-1.7.4.tgz", - "integrity": "sha512-XWGwRQ/ECEoQacd74JY/dmbLdnMpwtq3H8tls45dQ+GJ553Advir1FDo/aQt0Yr6fTimQDeiOIG4Mcb5KduP/w==", + "node_modules/@testing-library/react": { + "version": "12.1.3", + "dev": true, + "license": "MIT", "dependencies": { - "@tensorflow/tfjs-converter": "1.7.4", - "@tensorflow/tfjs-core": "1.7.4", - "@tensorflow/tfjs-data": "1.7.4", - "@tensorflow/tfjs-layers": "1.7.4" + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.0.0", + "@types/react-dom": "*" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "node_modules/@tensorflow/tfjs-converter": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-1.7.4.tgz", - "integrity": "sha512-B/Ux9I3osI0CXoESGR0Xe5C6BsEfC04+g2xn5zVaW9KEuVEnGEgnuBQxgijRFzkqTwoyLv4ptAmjyIghVARX0Q==" - }, - "node_modules/@tensorflow/tfjs-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.7.4.tgz", - "integrity": "sha512-3G4VKJ6nPs7iCt6gs3bjRj8chihKrYWenf63R0pm7D9MhlrVoX/tpN4LYVMGgBL7jHPxMLKdOkoAZJrn/J88HQ==", + "node_modules/@testing-library/react-hooks": { + "version": "7.0.2", + "dev": true, + "license": "MIT", "dependencies": { - "@types/offscreencanvas": "~2019.3.0", - "@types/seedrandom": "2.4.27", - "@types/webgl-ext": "0.0.30", - "@types/webgl2": "0.0.4", - "node-fetch": "~2.1.2", - "seedrandom": "2.4.3" + "@babel/runtime": "^7.12.5", + "@types/react": ">=16.9.0", + "@types/react-dom": ">=16.9.0", + "@types/react-test-renderer": ">=16.9.0", + "react-error-boundary": "^3.1.0" }, "engines": { - "yarn": ">= 1.3.2" + "node": ">=12" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0", + "react-test-renderer": ">=16.9.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-test-renderer": { + "optional": true + } } }, - "node_modules/@tensorflow/tfjs-data": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-1.7.4.tgz", - "integrity": "sha512-WFYG9wWjNDi62x6o3O20Q0XJxToCw2J4/fBEXiK/Gr0hIqVhl2oLQ1OjTWq7O08NUxM6BRzuG+ra3gWYdQUzOw==", + "node_modules/@testing-library/user-event": { + "version": "13.5.0", + "dev": true, + "license": "MIT", "dependencies": { - "@types/node-fetch": "^2.1.2", - "node-fetch": "~2.1.2" + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" } }, - "node_modules/@tensorflow/tfjs-layers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-1.7.4.tgz", - "integrity": "sha512-5/K8Z8RBfXsucL6EaSeb3/8jB/I8oPaaXkxwKVsBPQ+u6lB6LEtSKzeiFc57nDr5OMtVaUZV+pKDNEzP0RUQlg==" - }, "node_modules/@tootallnate/once": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", "engines": { "node": ">= 6" } }, + "node_modules/@types/aria-query": { + "version": "4.2.2", + "dev": true, + "license": "MIT" + }, "node_modules/@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "version": "7.1.18", + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -3034,53 +4353,42 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "version": "7.6.4", + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "version": "7.4.1", + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "version": "7.14.2", + "license": "MIT", "dependencies": { "@babel/types": "^7.3.0" } }, - "node_modules/@types/classnames": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.10.tgz", - "integrity": "sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==" - }, "node_modules/@types/eslint": { - "version": "7.2.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.12.tgz", - "integrity": "sha512-HjikV/jX6e0Pg4DcB+rtOBKSrG6w5IaxWpmi3efL/eLxMz5lZTK+W1DKERrX5a+mNzL78axfsDNXu7JHFP4uLg==", + "version": "7.29.0", + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/estree": { - "version": "0.0.47", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", - "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==" + "version": "0.0.51", + "license": "MIT" }, "node_modules/@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.2.0", + "license": "MIT", "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -3088,182 +4396,348 @@ }, "node_modules/@types/graceful-fs": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } }, - "node_modules/@types/invariant": { - "version": "2.2.33", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.33.tgz", - "integrity": "sha512-/jUNmS8d4bCKdqslfxW6dg/9Gksfzxz67IYfqApHn+HvHlMVXwYv2zpTDnS/yaK9BB0i0GlBTaYci0EFE62Hmw==" + "node_modules/@types/html-minifier-terser": { + "version": "5.1.2", + "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + "version": "2.0.4", + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "version": "3.0.1", + "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jest": { + "version": "27.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-matcher-utils": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@types/jest/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jest/node_modules/diff-sequences": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@types/jest/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/jest/node_modules/jest-diff": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-get-type": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@types/jest/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jest/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" + "version": "7.0.9", + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + "license": "MIT" + }, + "node_modules/@types/long": { + "version": "4.0.1", + "license": "MIT" }, "node_modules/@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" + "version": "3.0.5", + "license": "MIT" }, "node_modules/@types/node": { - "version": "14.0.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", - "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==" + "version": "16.4.7", + "license": "MIT" }, "node_modules/@types/node-fetch": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", - "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", + "version": "2.6.1", + "license": "MIT", "dependencies": { "@types/node": "*", "form-data": "^3.0.0" } }, "node_modules/@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + "version": "2.4.1", + "license": "MIT" }, "node_modules/@types/offscreencanvas": { "version": "2019.3.0", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz", - "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==" + "license": "MIT" }, "node_modules/@types/parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "license": "MIT" }, "node_modules/@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==" + "version": "2.4.4", + "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "version": "15.7.4", + "license": "MIT" }, "node_modules/@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + "version": "1.5.5", + "license": "MIT" }, "node_modules/@types/react": { - "version": "16.9.45", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.45.tgz", - "integrity": "sha512-vv950slTF5UZ5eDOf13b8qC1SD4rTvkqg3HfaUKzr17U97oeJZAa+dUaIHn0QoOJflNTIt6Pem9MmapULs9dkA==", + "version": "17.0.39", + "license": "MIT", "dependencies": { "@types/prop-types": "*", + "@types/scheduler": "*", "csstype": "^3.0.2" } }, + "node_modules/@types/react-dom": { + "version": "17.0.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-is": { + "version": "17.0.3", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.22", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-test-renderer": { + "version": "17.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-transition-group": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.0.tgz", - "integrity": "sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==", + "version": "4.4.4", + "license": "MIT", "dependencies": { "@types/react": "*" } }, "node_modules/@types/resolve": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "license": "MIT" + }, "node_modules/@types/seedrandom": { "version": "2.4.27", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.27.tgz", - "integrity": "sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE=" + "license": "MIT" }, "node_modules/@types/source-list-map": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + "license": "MIT" }, "node_modules/@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" + "version": "2.0.1", + "license": "MIT" }, "node_modules/@types/tapable": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", - "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==" + "version": "1.0.8", + "license": "MIT" + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jest": "*" + } }, "node_modules/@types/uglify-js": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", - "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "version": "3.13.1", + "license": "MIT", "dependencies": { "source-map": "^0.6.1" } }, "node_modules/@types/uglify-js/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/@types/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" - }, "node_modules/@types/webgl-ext": { "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/webgl-ext/-/webgl-ext-0.0.30.tgz", - "integrity": "sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==" + "license": "MIT" }, "node_modules/@types/webgl2": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/webgl2/-/webgl2-0.0.4.tgz", - "integrity": "sha512-PACt1xdErJbMUOUweSrbVM7gSIYm1vTncW2hF6Os/EeWi6TXYAYMPp+8v6rzHmypE5gHrxaxZNXgMkJVIdZpHw==" + "version": "0.0.5", + "license": "MIT" }, "node_modules/@types/webpack": { - "version": "4.41.29", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.29.tgz", - "integrity": "sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q==", + "version": "4.41.32", + "license": "MIT", "dependencies": { "@types/node": "*", "@types/tapable": "^1", @@ -3274,9 +4748,8 @@ } }, "node_modules/@types/webpack-sources": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", - "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "version": "3.2.0", + "license": "MIT", "dependencies": { "@types/node": "*", "@types/source-list-map": "*", @@ -3285,46 +4758,50 @@ }, "node_modules/@types/webpack-sources/node_modules/source-map": { "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/@types/webpack/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "version": "15.0.14", + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" + "version": "20.2.1", + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.9.2", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.25.0.tgz", - "integrity": "sha512-Qfs3dWkTMKkKwt78xp2O/KZQB8MPS1UQ5D3YW2s6LQWBE1074BE+Rym+b1pXZIX3M3fSvPUDaCvZLKV2ylVYYQ==", + "version": "4.33.0", + "license": "MIT", "dependencies": { - "@typescript-eslint/experimental-utils": "4.25.0", - "@typescript-eslint/scope-manager": "4.25.0", - "debug": "^4.1.1", + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3343,10 +4820,16 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3358,16 +4841,15 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.25.0.tgz", - "integrity": "sha512-f0doRE76vq7NEEU0tw+ajv6CrmPelw5wLoaghEHkA2dNLFb3T/zJQqGPQ0OYt5XlZaS13MtnN+GTPCuUVg338w==", + "version": "4.33.0", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.25.0", - "@typescript-eslint/types": "4.25.0", - "@typescript-eslint/typescript-estree": "4.25.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3380,15 +4862,30 @@ "eslint": "*" } }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-utils": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, "node_modules/@typescript-eslint/parser": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.25.0.tgz", - "integrity": "sha512-OZFa1SKyEJpAhDx8FcbWyX+vLwh7OEtzoo2iQaeWwxucyfbi0mT4DijbOSsTgPKzGHr6GrF2V5p/CEpUH/VBxg==", + "version": "4.33.0", + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "4.25.0", - "@typescript-eslint/types": "4.25.0", - "@typescript-eslint/typescript-estree": "4.25.0", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.1" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3407,12 +4904,11 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.25.0.tgz", - "integrity": "sha512-2NElKxMb/0rya+NJG1U71BuNnp1TBd1JgzYsldsdA83h/20Tvnf/HrwhiSlNmuq6Vqa0EzidsvkTArwoq+tH6w==", + "version": "4.33.0", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "4.25.0", - "@typescript-eslint/visitor-keys": "4.25.0" + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -3423,9 +4919,8 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.25.0.tgz", - "integrity": "sha512-+CNINNvl00OkW6wEsi32wU5MhHti2J25TJsJJqgQmJu3B3dYDBcmOxcE5w9cgoM13TrdE/5ND2HoEnBohasxRQ==", + "version": "4.33.0", + "license": "MIT", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -3435,17 +4930,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.25.0.tgz", - "integrity": "sha512-1B8U07TGNAFMxZbSpF6jqiDs1cVGO0izVkf18Q/SPcUAc9LhHxzvSowXDTvkHMWUVuPpagupaW63gB6ahTXVlg==", + "version": "4.33.0", + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "4.25.0", - "@typescript-eslint/visitor-keys": "4.25.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3462,8 +4956,7 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3475,11 +4968,10 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.25.0.tgz", - "integrity": "sha512-AmkqV9dDJVKP/TcZrbf6s6i1zYXt5Hl8qOLrRDTFfRNae4+LB8A4N3i+FLZPW85zIxRy39BgeWOfMS3HoH5ngg==", + "version": "4.33.0", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "4.25.0", + "@typescript-eslint/types": "4.33.0", "eslint-visitor-keys": "^2.0.0" }, "engines": { @@ -3490,18 +4982,9 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "engines": { - "node": ">=10" - } - }, "node_modules/@webassemblyjs/ast": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "license": "MIT", "dependencies": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -3510,49 +4993,41 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + "license": "MIT" }, "node_modules/@webassemblyjs/helper-code-frame": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "license": "MIT", "dependencies": { "@webassemblyjs/wast-printer": "1.9.0" } }, "node_modules/@webassemblyjs/helper-fsm": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + "license": "ISC" }, "node_modules/@webassemblyjs/helper-module-context": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -3562,29 +5037,25 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "license": "MIT", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -3598,8 +5069,7 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -3610,8 +5080,7 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -3621,8 +5090,7 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-api-error": "1.9.0", @@ -3634,8 +5102,7 @@ }, "node_modules/@webassemblyjs/wast-parser": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/floating-point-hex-parser": "1.9.0", @@ -3647,8 +5114,7 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0", @@ -3657,41 +5123,35 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "license": "Apache-2.0" }, "node_modules/abab": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + "license": "BSD-3-Clause" }, "node_modules/abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "license": "MIT", "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" } }, "node_modules/acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "version": "7.4.1", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3701,41 +5161,36 @@ }, "node_modules/acorn-globals": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "license": "MIT", "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" } }, "node_modules/acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/address": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "license": "MIT", "engines": { "node": ">= 0.12.0" } }, "node_modules/adjust-sourcemap-loader": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", - "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" @@ -3744,23 +5199,9 @@ "node": ">=8.9" } }, - "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", "dependencies": { "debug": "4" }, @@ -3770,8 +5211,7 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -3782,8 +5222,7 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3797,31 +5236,32 @@ }, "node_modules/ajv-errors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + "license": "MIT", + "peerDependencies": { + "ajv": ">=5.0.0" + } }, "node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } }, "node_modules/alphanum-sort": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + "license": "MIT" }, "node_modules/ansi-colors": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -3832,29 +5272,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-html": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", "engines": [ "node >= 0.8.0" ], + "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } }, "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "5.0.1", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -3864,8 +5311,7 @@ }, "node_modules/anymatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3876,31 +5322,43 @@ }, "node_modules/aproba": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "license": "ISC" }, "node_modules/are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "version": "2.0.0", "devOptional": true, + "license": "ISC", "dependencies": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/aria-query": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.10.2", "@babel/runtime-corejs3": "^7.10.2" @@ -3911,48 +5369,42 @@ }, "node_modules/arity-n": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + "license": "MIT" }, "node_modules/arr-diff": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/arr-flatten": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/arr-union": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/array-flatten": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + "license": "MIT" }, "node_modules/array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "version": "3.1.4", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", + "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" + "is-string": "^1.0.7" }, "engines": { "node": ">= 0.4" @@ -3963,36 +5415,32 @@ }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/array-uniq": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/array-unique": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "version": "1.2.5", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "es-abstract": "^1.19.0" }, "engines": { "node": ">= 0.4" @@ -4002,14 +5450,12 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", - "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "version": "1.2.5", + "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "function-bind": "^1.1.1" + "es-abstract": "^1.19.0" }, "engines": { "node": ">= 0.4" @@ -4020,21 +5466,18 @@ }, "node_modules/arrify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "license": "MIT" }, "node_modules/asn1.js": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -4044,13 +5487,11 @@ }, "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/assert": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "license": "MIT", "dependencies": { "object-assign": "^4.1.1", "util": "0.10.3" @@ -4058,65 +5499,62 @@ }, "node_modules/assert/node_modules/inherits": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + "license": "ISC" }, "node_modules/assert/node_modules/util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "license": "MIT", "dependencies": { "inherits": "2.0.1" } }, "node_modules/assign-symbols": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/ast-types-flow": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + "license": "ISC" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/async": { "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "license": "MIT", "dependencies": { "lodash": "^4.17.14" } }, "node_modules/async-each": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + "license": "MIT" }, "node_modules/async-limiter": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/atob": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "license": "(MIT OR Apache-2.0)", "bin": { "atob": "bin/atob.js" }, @@ -4125,15 +5563,14 @@ } }, "node_modules/autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "version": "9.8.8", + "license": "MIT", "dependencies": { "browserslist": "^4.12.0", "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", "postcss": "^7.0.32", "postcss-value-parser": "^4.1.0" }, @@ -4145,24 +5582,24 @@ "url": "https://tidelift.com/funding/github/npm/autoprefixer" } }, + "node_modules/autoprefixer/node_modules/picocolors": { + "version": "0.2.1", + "license": "ISC" + }, "node_modules/axe-core": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.1.tgz", - "integrity": "sha512-evY7DN8qSIbsW2H/TWQ1bX3sXN1d4MNb5Vb4n7BzPuCwRHdkZ1H2eNLuSh73EoQqkGKUtju2G2HCcjCfhvZIAA==", + "version": "4.4.1", + "license": "MPL-2.0", "engines": { "node": ">=4" } }, "node_modules/axobject-query": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + "license": "Apache-2.0" }, "node_modules/babel-eslint": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.7.0", @@ -4178,10 +5615,16 @@ "eslint": ">= 4.12.1" } }, + "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, "node_modules/babel-extract-comments": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "license": "MIT", "dependencies": { "babylon": "^6.18.0" }, @@ -4191,8 +5634,7 @@ }, "node_modules/babel-jest": { "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "license": "MIT", "dependencies": { "@jest/transform": "^26.6.2", "@jest/types": "^26.6.2", @@ -4212,8 +5654,7 @@ }, "node_modules/babel-jest/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4225,9 +5666,8 @@ } }, "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4241,8 +5681,7 @@ }, "node_modules/babel-jest/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4252,21 +5691,18 @@ }, "node_modules/babel-jest/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/babel-jest/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4276,8 +5712,7 @@ }, "node_modules/babel-loader": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "license": "MIT", "dependencies": { "find-cache-dir": "^2.1.0", "loader-utils": "^1.4.0", @@ -4293,40 +5728,43 @@ "webpack": ">=2" } }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "minimist": "^1.2.0" }, - "engines": { - "node": ">= 8.9.0" + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "engines": { + "node": ">=4.0.0" } }, "node_modules/babel-plugin-dynamic-import-node": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", "dependencies": { "object.assign": "^4.1.0" } }, "node_modules/babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "version": "6.1.1", + "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" }, "engines": { @@ -4335,8 +5773,7 @@ }, "node_modules/babel-plugin-jest-hoist": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -4349,8 +5786,7 @@ }, "node_modules/babel-plugin-macros": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.7.2", "cosmiconfig": "^6.0.0", @@ -4359,8 +5795,7 @@ }, "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -4372,93 +5807,66 @@ "node": ">=8" } }, - "node_modules/babel-plugin-macros/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/babel-plugin-macros/node_modules/is-core-module": { + "version": "2.8.1", + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" + "has": "^1.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-plugin-macros/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/babel-plugin-macros/node_modules/resolve": { + "version": "1.22.0", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/babel-plugin-macros/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/babel-plugin-named-asset-import": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", - "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==", + "version": "0.3.8", + "license": "MIT", "peerDependencies": { "@babel/core": "^7.1.0" } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", - "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "version": "0.3.1", + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.2", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz", - "integrity": "sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A==", + "version": "0.5.2", + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.9.1" + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", - "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "version": "0.3.1", + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.2" + "@babel/helper-define-polyfill-provider": "^0.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -4466,13 +5874,11 @@ }, "node_modules/babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + "license": "MIT" }, "node_modules/babel-plugin-transform-object-rest-spread": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "license": "MIT", "dependencies": { "babel-plugin-syntax-object-rest-spread": "^6.8.0", "babel-runtime": "^6.26.0" @@ -4480,13 +5886,11 @@ }, "node_modules/babel-plugin-transform-react-remove-prop-types": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + "license": "MIT" }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -4507,8 +5911,7 @@ }, "node_modules/babel-preset-jest": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^26.6.2", "babel-preset-current-node-syntax": "^1.0.0" @@ -4521,48 +5924,56 @@ } }, "node_modules/babel-preset-react-app": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", - "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", - "dependencies": { - "@babel/core": "7.12.3", - "@babel/plugin-proposal-class-properties": "7.12.1", - "@babel/plugin-proposal-decorators": "7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", - "@babel/plugin-proposal-numeric-separator": "7.12.1", - "@babel/plugin-proposal-optional-chaining": "7.12.1", - "@babel/plugin-transform-flow-strip-types": "7.12.1", - "@babel/plugin-transform-react-display-name": "7.12.1", - "@babel/plugin-transform-runtime": "7.12.1", - "@babel/preset-env": "7.12.1", - "@babel/preset-react": "7.12.1", - "@babel/preset-typescript": "7.12.1", - "@babel/runtime": "7.12.1", - "babel-plugin-macros": "2.8.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" + "version": "10.0.1", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/code-frame": { + "version": "7.16.7", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/babel-preset-react-app/node_modules/@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "version": "7.17.5", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.17.2", + "@babel/parser": "^7.17.3", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -4572,163 +5983,147 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "node_modules/babel-preset-react-app/node_modules/@babel/generator": { + "version": "7.17.3", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "node_modules/babel-preset-react-app/node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/types": "^7.16.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", - "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", + "node_modules/babel-preset-react-app/node_modules/@babel/helper-module-transforms": { + "version": "7.17.6", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", - "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "node_modules/babel-preset-react-app/node_modules/@babel/helpers": { + "version": "7.17.2", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-preset-react-app/node_modules/@babel/parser": { + "version": "7.17.3", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/babel-preset-react-app/node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", - "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", + "node_modules/babel-preset-react-app/node_modules/@babel/template": { + "version": "7.16.7", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/babel-preset-react-app/node_modules/@babel/preset-env": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", - "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", - "dependencies": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-compilation-targets": "^7.12.1", - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.1", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.1", - "core-js-compat": "^3.6.2", - "semver": "^5.5.0" + "node_modules/babel-preset-react-app/node_modules/@babel/traverse": { + "version": "7.17.3", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/babel-preset-react-app/node_modules/@babel/preset-react": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", - "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", + "node_modules/babel-preset-react-app/node_modules/@babel/types": { + "version": "7.17.0", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.12.1", - "@babel/plugin-transform-react-jsx": "^7.12.1", - "@babel/plugin-transform-react-jsx-development": "^7.12.1", - "@babel/plugin-transform-react-jsx-self": "^7.12.1", - "@babel/plugin-transform-react-jsx-source": "^7.12.1", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/babel-preset-react-app/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-preset-react-app/node_modules/resolve": { + "version": "1.22.0", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/babel-runtime": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "license": "MIT", "dependencies": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" @@ -4736,33 +6131,27 @@ }, "node_modules/babel-runtime/node_modules/core-js": { "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true + "hasInstallScript": true, + "license": "MIT" }, "node_modules/babel-runtime/node_modules/regenerator-runtime": { "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "license": "MIT" }, "node_modules/babylon": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "license": "MIT", "bin": { "babylon": "bin/babylon.js" } }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "license": "MIT" }, "node_modules/base": { "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "license": "MIT", "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -4776,12 +6165,43 @@ "node": ">=0.10.0" } }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "is-descriptor": "^1.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" }, "engines": { "node": ">=0.10.0" @@ -4789,8 +6209,6 @@ }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -4804,17 +6222,16 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/batch": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + "license": "MIT" }, "node_modules/bfj": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", - "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "license": "MIT", "dependencies": { "bluebird": "^3.5.5", "check-types": "^11.1.1", @@ -4827,16 +6244,14 @@ }, "node_modules/big.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "license": "MIT", "optional": true, "engines": { "node": ">=8" @@ -4851,61 +6266,100 @@ "file-uri-to-path": "1.0.0" } }, + "node_modules/bl": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/bluebird": { "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "license": "MIT" }, "node_modules/bn.js": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + "license": "MIT" }, "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.2", + "license": "MIT", "dependencies": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" }, "engines": { "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "license": "MIT" }, "node_modules/bonjour": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "license": "MIT", "dependencies": { "array-flatten": "^2.1.0", "deep-equal": "^1.0.1", @@ -4917,18 +6371,11 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "node_modules/bootstrap": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz", - "integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A==" + "license": "ISC" }, "node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4936,8 +6383,7 @@ }, "node_modules/braces": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -4947,18 +6393,15 @@ }, "node_modules/brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + "license": "MIT" }, "node_modules/browser-process-hrtime": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + "license": "BSD-2-Clause" }, "node_modules/browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -4970,8 +6413,7 @@ }, "node_modules/browserify-cipher": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "license": "MIT", "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -4980,8 +6422,7 @@ }, "node_modules/browserify-des": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -4991,8 +6432,7 @@ }, "node_modules/browserify-rsa": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "license": "MIT", "dependencies": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -5000,8 +6440,7 @@ }, "node_modules/browserify-sign": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "license": "ISC", "dependencies": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -5016,8 +6455,7 @@ }, "node_modules/browserify-sign/node_modules/readable-stream": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5029,8 +6467,6 @@ }, "node_modules/browserify-sign/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -5044,26 +6480,25 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/browserify-zlib": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "license": "MIT", "dependencies": { "pako": "~1.0.5" } }, "node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.19.3", + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001312", + "electron-to-chromium": "^1.4.71", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" }, "bin": { "browserslist": "cli.js" @@ -5078,41 +6513,43 @@ }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } }, "node_modules/buffer": { "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "license": "MIT", "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "license": "MIT" }, "node_modules/buffer-indexof": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + "license": "MIT" }, "node_modules/buffer-xor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + "license": "MIT" }, "node_modules/builtin-modules": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -5122,22 +6559,20 @@ }, "node_modules/builtin-status-codes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + "license": "MIT" }, "node_modules/bytes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/cacache": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", - "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", + "version": "15.3.0", + "license": "ISC", "dependencies": { + "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -5160,52 +6595,9 @@ "node": ">= 10" } }, - "node_modules/cacache/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cacache/node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache/node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/cacache/node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -5213,45 +6605,9 @@ "node": ">=10" } }, - "node_modules/cacache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cacache/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/cache-base": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "license": "MIT", "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -5269,8 +6625,7 @@ }, "node_modules/call-bind": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -5281,8 +6636,7 @@ }, "node_modules/caller-callsite": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "license": "MIT", "dependencies": { "callsites": "^2.0.0" }, @@ -5290,10 +6644,16 @@ "node": ">=4" } }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/caller-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "license": "MIT", "dependencies": { "caller-callsite": "^2.0.0" }, @@ -5302,31 +6662,27 @@ } }, "node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "version": "3.1.0", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/camel-case": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "node_modules/camel-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1", + "license": "0BSD" }, "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "license": "MIT", "engines": { "node": ">=10" }, @@ -5336,8 +6692,7 @@ }, "node_modules/caniuse-api": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -5346,54 +6701,128 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001230", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", - "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", + "version": "1.0.30001312", + "license": "CC-BY-4.0", "funding": { "type": "opencollective", "url": "https://opencollective.com/browserslist" } }, "node_modules/canvas": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz", - "integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==", + "version": "2.8.0", "devOptional": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", "nan": "^2.14.0", - "node-pre-gyp": "^0.11.0", "simple-get": "^3.0.3" }, "engines": { "node": ">=6" } }, - "node_modules/canvas/node_modules/node-pre-gyp": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", - "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "node_modules/canvas/node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.8", "devOptional": true, + "license": "BSD-3-Clause", "dependencies": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.5", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/canvas/node_modules/mkdirp": { + "version": "1.0.4", + "devOptional": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/canvas/node_modules/node-fetch": { + "version": "2.6.7", + "devOptional": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/canvas/node_modules/semver": { + "version": "7.3.5", + "devOptional": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/canvas/node_modules/tar": { + "version": "6.1.11", + "devOptional": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/canvas/node_modules/tr46": { + "version": "0.0.3", + "devOptional": true, + "license": "MIT" + }, + "node_modules/canvas/node_modules/webidl-conversions": { + "version": "3.0.1", + "devOptional": true, + "license": "BSD-2-Clause" + }, + "node_modules/canvas/node_modules/whatwg-url": { + "version": "5.0.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/capture-exit": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "license": "ISC", "dependencies": { "rsvp": "^4.8.4" }, @@ -5403,16 +6832,14 @@ }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -5424,60 +6851,69 @@ }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", "engines": { "node": ">=10" } }, + "node_modules/charcodes": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/check-types": { "version": "11.1.2", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", - "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" + "license": "MIT" }, "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", "optional": true, "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } }, "node_modules/chrome-trace-event": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "license": "MIT", "engines": { "node": ">=6.0" } }, "node_modules/ci-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "license": "MIT" }, "node_modules/cipher-base": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -5485,13 +6921,11 @@ }, "node_modules/cjs-module-lexer": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==" + "license": "MIT" }, "node_modules/class-utils": { "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "license": "MIT", "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -5502,91 +6936,23 @@ "node": ">=0.10.0" } }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + "version": "2.3.1", + "license": "MIT" }, "node_modules/clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "version": "4.2.4", + "license": "MIT", "dependencies": { "source-map": "~0.6.0" }, @@ -5596,201 +6962,63 @@ }, "node_modules/clean-css/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "node_modules/cli-cursor": { + "version": "3.1.0", "dev": true, + "license": "MIT", "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" + "restore-cursor": "^3.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, "engines": { "node": ">=8" } }, - "node_modules/cli-truncate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/cli-truncate": { + "version": "2.1.0", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cli-truncate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" + "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, + "node_modules/clsx": { + "version": "1.1.1", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -5798,8 +7026,7 @@ }, "node_modules/coa": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "license": "MIT", "dependencies": { "@types/q": "^1.5.1", "chalk": "^2.4.1", @@ -5811,22 +7038,19 @@ }, "node_modules/code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "devOptional": true, + "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/collect-v8-coverage": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + "license": "MIT" }, "node_modules/collection-visit": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "license": "MIT", "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -5836,45 +7060,48 @@ } }, "node_modules/color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "version": "3.2.1", + "license": "MIT", "dependencies": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "license": "MIT" }, "node_modules/color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "version": "1.9.0", + "license": "MIT", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, + "node_modules/color-support": { + "version": "1.1.3", + "devOptional": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + "version": "2.0.16", + "dev": true, + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5883,43 +7110,38 @@ } }, "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "version": "7.2.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">= 10" } }, "node_modules/common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "version": "1.8.2", + "license": "MIT", "engines": { "node": ">=4.0.0" } }, "node_modules/commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + "license": "MIT" }, "node_modules/component-emitter": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "license": "MIT" }, "node_modules/compose-function": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "license": "MIT", "dependencies": { "arity-n": "^1.0.4" } }, "node_modules/compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -5929,8 +7151,7 @@ }, "node_modules/compression": { "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -5946,29 +7167,25 @@ }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "license": "MIT" }, "node_modules/concat-stream": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "engines": [ "node >= 0.8" ], + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -5977,78 +7194,84 @@ } }, "node_modules/confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" + "version": "1.0.11", + "license": "MIT" }, "node_modules/connect-history-api-fallback": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + "version": "1.2.0" }, "node_modules/console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/constants-browserify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + "license": "MIT" }, "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "license": "MIT", "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/content-type": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.1" } }, "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.4.2", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "license": "MIT" }, "node_modules/copy-concurrently": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "license": "ISC", "dependencies": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -6058,30 +7281,37 @@ "run-queue": "^1.0.0" } }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/copy-descriptor": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/core-js": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.13.0.tgz", - "integrity": "sha512-iWDbiyha1M5vFwPFmQnvRv+tJzGbFAm6XimJUT0NgHYW3xZEs1SkCAcasWSVFxpI2Xb/V1DDJckq3v90+bQnog==", + "version": "3.21.1", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.13.0.tgz", - "integrity": "sha512-jhbI2zpVskgfDC9mGRaDo1gagd0E0i/kYW0+WvibL/rafEHKAHO653hEXIxJHqRlRLITluXtRH3AGTL5qJmifQ==", + "version": "3.21.1", + "license": "MIT", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.19.1", "semver": "7.0.0" }, "funding": { @@ -6091,45 +7321,41 @@ }, "node_modules/core-js-compat/node_modules/semver": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/core-js-pure": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.13.0.tgz", - "integrity": "sha512-7VTvXbsMxROvzPAVczLgfizR8CyYnvWPrb1eGrtlZAJfjQWEHLofVfCKljLHdpazTfpaziRORwUH/kfGDKvpdA==", + "version": "3.21.1", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "7.0.0", + "license": "MIT", "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, "node_modules/create-ecdh": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -6137,13 +7363,11 @@ }, "node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -6154,8 +7378,7 @@ }, "node_modules/create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -6167,8 +7390,7 @@ }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6180,8 +7402,7 @@ }, "node_modules/crypto-browserify": { "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "license": "MIT", "dependencies": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -6201,16 +7422,14 @@ }, "node_modules/crypto-random-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/css": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "source-map": "^0.6.1", @@ -6220,8 +7439,7 @@ }, "node_modules/css-blank-pseudo": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.5" }, @@ -6234,16 +7452,14 @@ }, "node_modules/css-color-names": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/css-declaration-sorter": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "license": "MIT", "dependencies": { "postcss": "^7.0.1", "timsort": "^0.3.0" @@ -6254,8 +7470,7 @@ }, "node_modules/css-has-pseudo": { "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.6", "postcss-selector-parser": "^5.0.0-rc.4" @@ -6269,8 +7484,7 @@ }, "node_modules/css-has-pseudo/node_modules/cssesc": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -6280,8 +7494,7 @@ }, "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "license": "MIT", "dependencies": { "cssesc": "^2.0.0", "indexes-of": "^1.0.1", @@ -6293,8 +7506,7 @@ }, "node_modules/css-loader": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", - "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "license": "MIT", "dependencies": { "camelcase": "^6.0.0", "cssesc": "^3.0.0", @@ -6320,40 +7532,9 @@ "webpack": "^4.27.0 || ^5.0.0" } }, - "node_modules/css-loader/node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/css-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/css-loader/node_modules/semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -6366,8 +7547,7 @@ }, "node_modules/css-prefers-color-scheme": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.5" }, @@ -6380,8 +7560,7 @@ }, "node_modules/css-select": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^3.2.1", @@ -6391,13 +7570,11 @@ }, "node_modules/css-select-base-adapter": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + "license": "MIT" }, "node_modules/css-tree": { "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.4", "source-map": "^0.6.1" @@ -6408,16 +7585,14 @@ }, "node_modules/css-tree/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/css-what": { "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -6425,23 +7600,25 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css.escape": { + "version": "1.5.1", + "dev": true, + "license": "MIT" + }, "node_modules/css/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/cssdb": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + "license": "CC0-1.0" }, "node_modules/cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -6451,8 +7628,7 @@ }, "node_modules/cssnano": { "version": "4.1.11", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", - "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "license": "MIT", "dependencies": { "cosmiconfig": "^5.0.0", "cssnano-preset-default": "^4.0.8", @@ -6465,8 +7641,7 @@ }, "node_modules/cssnano-preset-default": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", - "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "license": "MIT", "dependencies": { "css-declaration-sorter": "^4.0.1", "cssnano-util-raw-cache": "^4.0.1", @@ -6500,48 +7675,85 @@ "postcss-unique-selectors": "^4.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano/node_modules/cosmiconfig": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "node_modules/cssnano/node_modules/import-fresh": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=4" } }, - "node_modules/cssnano-util-get-match": { + "node_modules/cssnano/node_modules/parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "license": "MIT", "dependencies": { - "postcss": "^7.0.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=4" } }, - "node_modules/cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "node_modules/cssnano/node_modules/resolve-from": { + "version": "3.0.0", + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=4" } }, "node_modules/csso": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "license": "MIT", "dependencies": { "css-tree": "^1.1.2" }, @@ -6551,8 +7763,7 @@ }, "node_modules/csso/node_modules/css-tree": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -6563,26 +7774,22 @@ }, "node_modules/csso/node_modules/mdn-data": { "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + "license": "CC0-1.0" }, "node_modules/csso/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/cssom": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + "license": "MIT" }, "node_modules/cssstyle": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", "dependencies": { "cssom": "~0.3.6" }, @@ -6592,23 +7799,19 @@ }, "node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "license": "MIT" }, "node_modules/csstype": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", - "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==" + "version": "3.0.10", + "license": "MIT" }, "node_modules/cyclist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + "license": "MIT" }, "node_modules/d": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "license": "ISC", "dependencies": { "es5-ext": "^0.10.50", "type": "^1.0.1" @@ -6616,25 +7819,23 @@ }, "node_modules/daikon": { "version": "1.2.42", - "resolved": "https://registry.npmjs.org/daikon/-/daikon-1.2.42.tgz", - "integrity": "sha512-uEJKRNpJo6lWCMr1UehBJLCnpsmoY4cmaedjL03UCeUmyoV2SsCYiEo8I+rhfuoj2FHqtDJFRGfZAW729berww==", + "license": "MIT", "dependencies": { "jpeg-lossless-decoder-js": "git+https://github.com/rii-mango/JPEGLosslessDecoderJS.git", "pako": "^1.0.6" } }, "node_modules/daikon/node_modules/jpeg-lossless-decoder-js": { - "resolved": "git+ssh://git@github.com/rii-mango/JPEGLosslessDecoderJS.git#78fe90c7cae985b1a394a66f99c81633144bb867" + "version": "2.0.4", + "license": "MIT" }, "node_modules/damerau-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", - "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" + "version": "1.0.8", + "license": "BSD-2-Clause" }, "node_modules/data-urls": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "license": "MIT", "dependencies": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", @@ -6645,9 +7846,8 @@ } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -6662,30 +7862,26 @@ }, "node_modules/decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" + "version": "10.3.1", + "license": "MIT" }, "node_modules/decode-uri-component": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/decompress-response": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", "devOptional": true, + "license": "MIT", "dependencies": { "mimic-response": "^2.0.0" }, @@ -6695,13 +7891,11 @@ }, "node_modules/dedent": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + "license": "MIT" }, "node_modules/deep-equal": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "license": "MIT", "dependencies": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -6716,30 +7910,26 @@ }, "node_modules/deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "devOptional": true, + "dev": true, + "license": "MIT", "engines": { "node": ">=4.0.0" } }, "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "version": "0.1.4", + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/default-gateway": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "license": "BSD-2-Clause", "dependencies": { "execa": "^1.0.0", "ip-regex": "^2.1.0" @@ -6750,8 +7940,7 @@ }, "node_modules/default-gateway/node_modules/cross-spawn": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -6765,8 +7954,7 @@ }, "node_modules/default-gateway/node_modules/execa": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "license": "MIT", "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -6782,8 +7970,7 @@ }, "node_modules/default-gateway/node_modules/get-stream": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -6793,16 +7980,14 @@ }, "node_modules/default-gateway/node_modules/is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/default-gateway/node_modules/npm-run-path": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "license": "MIT", "dependencies": { "path-key": "^2.0.0" }, @@ -6812,16 +7997,21 @@ }, "node_modules/default-gateway/node_modules/path-key": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/default-gateway/node_modules/semver": { + "version": "5.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/default-gateway/node_modules/shebang-command": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "license": "MIT", "dependencies": { "shebang-regex": "^1.0.0" }, @@ -6831,16 +8021,14 @@ }, "node_modules/default-gateway/node_modules/shebang-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/default-gateway/node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -6850,8 +8038,7 @@ }, "node_modules/define-properties": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "license": "MIT", "dependencies": { "object-keys": "^1.0.12" }, @@ -6861,8 +8048,7 @@ }, "node_modules/define-property": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "license": "MIT", "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -6871,10 +8057,41 @@ "node": ">=0.10.0" } }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/del": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "license": "MIT", "dependencies": { "@types/glob": "^7.1.1", "globby": "^6.1.0", @@ -6890,8 +8107,7 @@ }, "node_modules/del/node_modules/array-union": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "license": "MIT", "dependencies": { "array-uniq": "^1.0.1" }, @@ -6901,8 +8117,7 @@ }, "node_modules/del/node_modules/globby": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "license": "MIT", "dependencies": { "array-union": "^1.0.1", "glob": "^7.0.3", @@ -6916,46 +8131,50 @@ }, "node_modules/del/node_modules/globby/node_modules/pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/del/node_modules/p-map": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/des.js": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -6963,14 +8182,12 @@ }, "node_modules/destroy": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "license": "MIT" }, "node_modules/detect-libc": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "devOptional": true, + "license": "Apache-2.0", "bin": { "detect-libc": "bin/detect-libc.js" }, @@ -6980,21 +8197,18 @@ }, "node_modules/detect-newline": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/detect-node": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + "license": "MIT" }, "node_modules/detect-port-alt": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "license": "MIT", "dependencies": { "address": "^1.0.1", "debug": "^2.6.0" @@ -7009,29 +8223,30 @@ }, "node_modules/detect-port-alt/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/detect-port-alt/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "license": "MIT" + }, + "node_modules/devtools-protocol": { + "version": "0.0.901419", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/diff-sequences": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "license": "MIT", "engines": { "node": ">= 10.14.2" } }, "node_modules/diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -7040,13 +8255,11 @@ }, "node_modules/diffie-hellman/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -7054,15 +8267,22 @@ "node": ">=8" } }, + "node_modules/dnd-core": { + "version": "14.0.0", + "license": "MIT", + "dependencies": { + "@react-dnd/asap": "^4.0.0", + "@react-dnd/invariant": "^2.0.0", + "redux": "^4.0.5" + } + }, "node_modules/dns-equal": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + "license": "MIT" }, "node_modules/dns-packet": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "license": "MIT", "dependencies": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -7070,35 +8290,36 @@ }, "node_modules/dns-txt": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "license": "MIT", "dependencies": { "buffer-indexof": "^1.0.0" } }, "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, + "node_modules/dom-accessibility-api": { + "version": "0.5.13", + "dev": true, + "license": "MIT" + }, "node_modules/dom-converter": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", "dependencies": { "utila": "~0.4" } }, "node_modules/dom-helpers": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz", - "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==", + "version": "5.2.1", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -7106,8 +8327,7 @@ }, "node_modules/dom-serializer": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" @@ -7115,19 +8335,17 @@ }, "node_modules/dom-serializer/node_modules/domelementtype": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domain-browser": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "license": "MIT", "engines": { "node": ">=0.4", "npm": ">=1.2" @@ -7135,13 +8353,11 @@ }, "node_modules/domelementtype": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "license": "BSD-2-Clause" }, "node_modules/domexception": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "license": "MIT", "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -7151,24 +8367,37 @@ }, "node_modules/domexception/node_modules/webidl-conversions": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "license": "BSD-2-Clause", "engines": { "node": ">=8" } }, "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "version": "4.3.0", + "license": "BSD-2-Clause", "dependencies": { - "domelementtype": "1" + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/domhandler/node_modules/domelementtype": { + "version": "2.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, "node_modules/domutils": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "0", "domelementtype": "1" @@ -7176,22 +8405,19 @@ }, "node_modules/dot-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/dot-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1", + "license": "0BSD" }, "node_modules/dot-prop": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -7199,28 +8425,31 @@ "node": ">=8" } }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/dotenv": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "license": "BSD-2-Clause", "engines": { "node": ">=8" } }, "node_modules/dotenv-expand": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + "license": "BSD-2-Clause" }, "node_modules/duplexer": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "license": "MIT" }, "node_modules/duplexify": { "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -7230,27 +8459,23 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "license": "MIT" }, "node_modules/ejs": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { "node": ">=0.10.0" } }, "node_modules/electron-to-chromium": { - "version": "1.3.740", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.740.tgz", - "integrity": "sha512-Mi2m55JrX2BFbNZGKYR+2ItcGnR4O5HhrvgoRRyZQlaMGQULqDhoGkLWHzJoshSzi7k1PUofxcDbNhlFrDZNhg==" + "version": "1.4.75", + "license": "ISC" }, "node_modules/elliptic": { "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -7263,13 +8488,11 @@ }, "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/emittery": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -7278,38 +8501,32 @@ } }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "version": "8.0.0", + "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/end-of-stream": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "dependencies": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", @@ -7321,8 +8538,7 @@ }, "node_modules/enhanced-resolve/node_modules/memory-fs": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "license": "MIT", "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -7333,8 +8549,7 @@ }, "node_modules/enquirer": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1" }, @@ -7344,16 +8559,14 @@ }, "node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/errno": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "license": "MIT", "dependencies": { "prr": "~1.0.1" }, @@ -7363,36 +8576,37 @@ }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "version": "2.0.7", + "license": "MIT", "dependencies": { "stackframe": "^1.1.1" } }, "node_modules/es-abstract": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.2.tgz", - "integrity": "sha512-byRiNIQXE6HWNySaU6JohoNXzYgbBjztwFnBLUTiJmWXjaU9bSq3urQLUlNLQ292tc+gc07zYZXNZjaOoAX3sw==", + "version": "1.19.1", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -7408,8 +8622,7 @@ }, "node_modules/es-to-primitive": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -7424,8 +8637,7 @@ }, "node_modules/es5-ext": { "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "license": "ISC", "dependencies": { "es6-iterator": "~2.0.3", "es6-symbol": "~3.1.3", @@ -7434,8 +8646,7 @@ }, "node_modules/es6-iterator": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "license": "MIT", "dependencies": { "d": "1", "es5-ext": "^0.10.35", @@ -7444,8 +8655,7 @@ }, "node_modules/es6-symbol": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "license": "ISC", "dependencies": { "d": "^1.0.1", "ext": "^1.1.2" @@ -7453,29 +8663,25 @@ }, "node_modules/escalade": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/escodegen": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -7494,29 +8700,69 @@ } }, "node_modules/escodegen/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/eslint": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.27.0.tgz", - "integrity": "sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA==", + "version": "7.31.0", + "license": "MIT", "dependencies": { "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.1", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -7533,7 +8779,7 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", + "glob-parent": "^5.1.2", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", @@ -7565,10 +8811,20 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-prettier": { + "version": "8.3.0", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-config-react-app": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", - "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "license": "MIT", "dependencies": { "confusing-browser-globals": "^1.0.10" }, @@ -7598,34 +8854,41 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "version": "0.3.6", + "license": "MIT", "dependencies": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "debug": "^3.2.7", + "resolve": "^1.20.0" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "node_modules/eslint-import-resolver-node/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.22.0", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/eslint-module-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", - "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "version": "2.7.3", + "license": "MIT", "dependencies": { "debug": "^3.2.7", - "pkg-dir": "^2.0.0" + "find-up": "^2.1.0" }, "engines": { "node": ">=4" @@ -7633,16 +8896,69 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, + "node_modules/eslint-module-utils/node_modules/find-up": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/locate-path": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-limit": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-locate": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-try": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/path-exists": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/eslint-plugin-flowtype": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.7.2.tgz", - "integrity": "sha512-7Oq/N0+3nijBnYWQYzz/Mp/7ZCpwxYvClRyW/PLAmimY9uLCBvoXsNsERcJdkKceyOjgRbFhhxs058KTrne9Mg==", + "version": "5.10.0", + "license": "BSD-3-Clause", "dependencies": { "lodash": "^4.17.15", "string-natural-compare": "^3.0.1" @@ -7655,111 +8971,69 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.23.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.3.tgz", - "integrity": "sha512-wDxdYbSB55F7T5CC7ucDjY641VvKmlRwT0Vxh7PkY1mI4rclVRFWYfsrjDgZvwYYDZ5ee0ZtfFKXowWjqvEoRQ==", + "version": "2.25.4", + "license": "MIT", "dependencies": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", "debug": "^2.6.9", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.1", - "find-up": "^2.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.2", "has": "^1.0.3", - "is-core-module": "^2.4.0", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.3", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", + "object.values": "^1.1.5", "resolve": "^1.20.0", - "tsconfig-paths": "^3.9.0" + "tsconfig-paths": "^3.12.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, - "node_modules/eslint-plugin-import/node_modules/find-up": { + "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/eslint-plugin-import/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "license": "Apache-2.0", "dependencies": { - "p-try": "^1.0.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/p-locate": { + "node_modules/eslint-plugin-import/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "license": "MIT" + }, + "node_modules/eslint-plugin-import/node_modules/resolve": { + "version": "1.22.0", + "license": "MIT", "dependencies": { - "p-limit": "^1.1.0" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/eslint-plugin-jest": { - "version": "24.3.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz", - "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==", + "version": "24.7.0", + "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "^4.0.1" }, @@ -7777,33 +9051,56 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", - "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "version": "6.5.1", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.11.2", + "@babel/runtime": "^7.16.3", "aria-query": "^4.2.2", - "array-includes": "^3.1.1", + "array-includes": "^3.1.4", "ast-types-flow": "^0.0.7", - "axe-core": "^4.0.2", + "axe-core": "^4.3.5", "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.6", - "emoji-regex": "^9.0.0", + "damerau-levenshtein": "^1.0.7", + "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.1.0", - "language-tags": "^1.0.5" + "jsx-ast-utils": "^3.2.1", + "language-tags": "^1.0.5", + "minimatch": "^3.0.4" }, "engines": { "node": ">=4.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } } }, "node_modules/eslint-plugin-react": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.23.2.tgz", - "integrity": "sha512-AfjgFQB+nYszudkxRkTFu0UR1zEQig0ArVMPloKhxwlwkzaw/fBiH0QWcBBhZONlXqQC51+nfqFrkn4EzHcGBw==", + "version": "7.24.0", + "license": "MIT", "dependencies": { "array-includes": "^3.1.3", "array.prototype.flatmap": "^1.2.4", @@ -7811,12 +9108,12 @@ "has": "^1.0.3", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.0.4", - "object.entries": "^1.1.3", + "object.entries": "^1.1.4", "object.fromentries": "^2.0.4", - "object.values": "^1.1.3", + "object.values": "^1.1.4", "prop-types": "^15.7.2", "resolve": "^2.0.0-next.3", - "string.prototype.matchall": "^4.0.4" + "string.prototype.matchall": "^4.0.5" }, "engines": { "node": ">=4" @@ -7826,20 +9123,28 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", - "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", + "version": "4.3.0", + "license": "MIT", "engines": { "node": ">=10" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "license": "MIT", "dependencies": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -7850,8 +9155,7 @@ }, "node_modules/eslint-plugin-testing-library": { "version": "3.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", - "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", + "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "^3.10.1" }, @@ -7865,8 +9169,7 @@ }, "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/experimental-utils": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", - "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.3", "@typescript-eslint/types": "3.10.1", @@ -7887,8 +9190,7 @@ }, "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", - "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", + "license": "MIT", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -7899,8 +9201,7 @@ }, "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", - "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "3.10.1", "@typescript-eslint/visitor-keys": "3.10.1", @@ -7926,8 +9227,7 @@ }, "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", - "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -7939,10 +9239,16 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/eslint-plugin-testing-library/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, "node_modules/eslint-plugin-testing-library/node_modules/semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -7955,8 +9261,7 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -7967,8 +9272,7 @@ }, "node_modules/eslint-utils": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -7979,25 +9283,30 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/eslint-visitor-keys": { + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "license": "Apache-2.0", "engines": { "node": ">=4" } }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-webpack-plugin": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", - "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", + "version": "2.6.0", + "license": "MIT", "dependencies": { - "@types/eslint": "^7.2.6", + "@types/eslint": "^7.28.2", "arrify": "^2.0.1", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", + "jest-worker": "^27.3.1", + "micromatch": "^4.0.4", "normalize-path": "^3.0.0", - "schema-utils": "^3.0.0" + "schema-utils": "^3.1.1" }, "engines": { "node": ">= 10.13.0" @@ -8007,16 +9316,34 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "eslint": "^7.0.0", + "eslint": "^7.0.0 || ^8.0.0", "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/eslint-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -8028,18 +9355,29 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" } }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8050,18 +9388,9 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8075,8 +9404,7 @@ }, "node_modules/eslint/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8086,265 +9414,54 @@ }, "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/eslint/node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eslint/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/eslint/node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/eslint/node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", - "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/eslint/node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint/node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint/node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, + "version": "4.0.0", + "license": "MIT", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "node_modules/eslint/node_modules/globals": { + "version": "13.12.1", + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/eslint/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" + "node_modules/eslint/node_modules/semver": { + "version": "7.3.5", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8352,63 +9469,38 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dependencies": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/eslint/node_modules/table/node_modules/ajv": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.5.0.tgz", - "integrity": "sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/espree": { + "version": "7.3.1", + "license": "BSD-2-Clause", "dependencies": { - "prelude-ls": "^1.2.1" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" }, "engines": { - "node": ">= 0.8.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "license": "Apache-2.0", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -8419,8 +9511,7 @@ }, "node_modules/esquery": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -8429,17 +9520,15 @@ } }, "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -8448,59 +9537,51 @@ } }, "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/eventemitter3": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { "node": ">=0.8.x" } }, "node_modules/eventsource": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "license": "MIT", "dependencies": { "original": "^1.0.0" }, @@ -8510,8 +9591,7 @@ }, "node_modules/evp_bytestokey": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "license": "MIT", "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -8519,22 +9599,21 @@ }, "node_modules/exec-sh": { "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" + "license": "MIT" }, "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "version": "5.1.1", + "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" }, "engines": { @@ -8544,26 +9623,19 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "engines": { - "node": ">=8.12.0" - } + "node_modules/exenv": { + "version": "1.2.2", + "license": "BSD-3-Clause" }, "node_modules/exit": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "engines": { "node": ">= 0.8.0" } }, "node_modules/expand-brackets": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "license": "MIT", "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -8579,16 +9651,14 @@ }, "node_modules/expand-brackets/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/expand-brackets/node_modules/define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "license": "MIT", "dependencies": { "is-descriptor": "^0.1.0" }, @@ -8598,8 +9668,7 @@ }, "node_modules/expand-brackets/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -8607,88 +9676,13 @@ "node": ">=0.10.0" } }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/expand-brackets/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "license": "MIT" }, "node_modules/expect": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "license": "MIT", "dependencies": { "@jest/types": "^26.6.2", "ansi-styles": "^4.0.0", @@ -8703,8 +9697,7 @@ }, "node_modules/expect/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8717,8 +9710,7 @@ }, "node_modules/expect/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8728,20 +9720,18 @@ }, "node_modules/expect/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.3", + "license": "MIT", "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -8755,13 +9745,13 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", @@ -8773,39 +9763,51 @@ }, "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "license": "MIT" }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "license": "MIT" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, "node_modules/ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "version": "1.6.0", + "license": "ISC", "dependencies": { - "type": "^2.0.0" + "type": "^2.5.0" } }, "node_modules/ext/node_modules/type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + "version": "2.6.0", + "license": "ISC" }, "node_modules/extend-shallow": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "license": "MIT", "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -8814,10 +9816,19 @@ "node": ">=0.10.0" } }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/extglob": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "license": "MIT", "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -8834,8 +9845,7 @@ }, "node_modules/extglob/node_modules/define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "license": "MIT", "dependencies": { "is-descriptor": "^1.0.0" }, @@ -8845,8 +9855,7 @@ }, "node_modules/extglob/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -8854,57 +9863,112 @@ "node": ">=0.10.0" } }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, "engines": { "node": ">=0.10.0" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.11", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "license": "MIT" }, "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/faye-websocket": { "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -8914,21 +9978,36 @@ }, "node_modules/fb-watchman": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/figgy-pudding": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + "license": "ISC" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } }, "node_modules/file-loader": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", - "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" @@ -8937,32 +10016,18 @@ "node": ">= 10.13.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "engines": { - "node": ">=8.9.0" + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -8982,8 +10047,7 @@ }, "node_modules/filereader-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filereader-stream/-/filereader-stream-2.0.0.tgz", - "integrity": "sha1-sw1aW/bRTGONfrVeGTq7mG+ASKE=", + "license": "BSD-2-Clause", "dependencies": { "from2": "^2.1.0", "typedarray-to-buffer": "^3.0.4" @@ -8991,16 +10055,14 @@ }, "node_modules/filesize": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", - "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==", + "license": "BSD-3-Clause", "engines": { "node": ">= 0.4.0" } }, "node_modules/fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9010,8 +10072,7 @@ }, "node_modules/finalhandler": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -9027,21 +10088,18 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -9051,63 +10109,31 @@ "node": ">=6" } }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "2.1.0", + "license": "MIT", "dependencies": { - "p-limit": "^2.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { "node": ">=6" } }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" + "node_modules/find-cache-dir/node_modules/semver": { + "version": "5.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "node_modules/find-root": { + "version": "1.1.0", + "license": "MIT" }, "node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -9116,35 +10142,42 @@ "node": ">=8" } }, + "node_modules/flat-cache": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" + "version": "3.2.5", + "license": "ISC" }, "node_modules/flatten": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" + "license": "MIT" }, "node_modules/flush-write-stream": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" } }, "node_modules/follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", + "version": "1.14.9", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -9156,16 +10189,14 @@ }, "node_modules/for-in": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "4.1.6", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", - "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.5.5", "chalk": "^2.4.1", @@ -9182,8 +10213,7 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "license": "MIT", "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -9202,8 +10232,7 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -9213,8 +10242,7 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -9227,8 +10255,7 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -9236,18 +10263,9 @@ "node": ">=0.10.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -9257,8 +10275,7 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -9268,8 +10285,7 @@ }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "license": "MIT", "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -9289,10 +10305,16 @@ "node": ">=0.10.0" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/to-regex-range": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "license": "MIT", "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -9302,9 +10324,8 @@ } }, "node_modules/form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "version": "3.0.1", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -9315,17 +10336,15 @@ } }, "node_modules/forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "version": "0.2.0", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fragment-cache": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "license": "MIT", "dependencies": { "map-cache": "^0.2.2" }, @@ -9335,25 +10354,27 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/from2": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, "node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -9365,18 +10386,18 @@ } }, "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "devOptional": true, + "version": "2.1.0", + "license": "ISC", "dependencies": { - "minipass": "^2.6.0" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, "node_modules/fs-write-stream-atomic": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "license": "ISC", "dependencies": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -9386,8 +10407,7 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.2", @@ -9404,50 +10424,72 @@ }, "node_modules/function-bind": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "license": "MIT" }, "node_modules/functional-red-black-tree": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + "license": "MIT" }, "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "version": "3.0.2", "devOptional": true, + "license": "ISC", "dependencies": { - "aproba": "^1.0.3", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "devOptional": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -9459,43 +10501,50 @@ }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + "license": "ISC" }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "pump": "^3.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-value": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9506,12 +10555,14 @@ }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -9521,8 +10572,7 @@ }, "node_modules/global-modules": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, @@ -9532,8 +10582,7 @@ }, "node_modules/global-prefix": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -9545,8 +10594,7 @@ }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -9556,22 +10604,20 @@ }, "node_modules/globals": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.1.0", + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -9582,28 +10628,24 @@ } }, "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.9", + "license": "ISC" }, "node_modules/growly": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "license": "MIT", "optional": true }, "node_modules/gzip-size": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "license": "MIT", "dependencies": { "duplexer": "^0.1.1", "pify": "^4.0.1" @@ -9614,18 +10656,15 @@ }, "node_modules/handle-thing": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + "license": "MIT" }, "node_modules/harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" + "version": "1.6.2", + "license": "(Apache-2.0 OR MPL-1.1)" }, "node_modules/has": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1" }, @@ -9635,24 +10674,34 @@ }, "node_modules/has-bigints": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/has-symbols": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, "engines": { "node": ">= 0.4" }, @@ -9662,14 +10711,12 @@ }, "node_modules/has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/has-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "license": "MIT", "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -9681,8 +10728,7 @@ }, "node_modules/has-values": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "license": "MIT", "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -9693,8 +10739,7 @@ }, "node_modules/has-values/node_modules/is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -9704,8 +10749,7 @@ }, "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -9715,8 +10759,7 @@ }, "node_modules/has-values/node_modules/kind-of": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -9726,8 +10769,7 @@ }, "node_modules/hash-base": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -9739,8 +10781,7 @@ }, "node_modules/hash-base/node_modules/readable-stream": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9752,8 +10793,6 @@ }, "node_modules/hash-base/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -9767,12 +10806,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/hash.js": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -9780,21 +10819,18 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/hex-color-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + "license": "MIT" }, "node_modules/hmac-drbg": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "license": "MIT", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -9803,29 +10839,25 @@ }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } }, "node_modules/hoopy": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "license": "MIT", "engines": { "node": ">= 6.0.0" } }, "node_modules/hosted-git-info": { "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "license": "ISC" }, "node_modules/hpack.js": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -9835,18 +10867,15 @@ }, "node_modules/hsl-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + "license": "MIT" }, "node_modules/hsla-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + "license": "MIT" }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "license": "MIT", "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -9856,18 +10885,15 @@ }, "node_modules/html-entities": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + "license": "MIT" }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "license": "MIT" }, "node_modules/html-minifier-terser": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "license": "MIT", "dependencies": { "camel-case": "^4.1.1", "clean-css": "^4.2.3", @@ -9884,10 +10910,16 @@ "node": ">=6" } }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/html-webpack-plugin": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", - "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^5.0.0", "@types/tapable": "^1.0.5", @@ -9906,71 +10938,112 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/util.promisify": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "version": "6.1.0", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "node_modules/htmlparser2/node_modules/dom-serializer": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } }, - "node_modules/htmlparser2/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/htmlparser2/node_modules/domelementtype": { + "version": "2.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "2.8.0", + "license": "BSD-2-Clause", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/http-deceiver": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + "license": "MIT" }, "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "license": "MIT", "dependencies": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.6" } }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, "node_modules/http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + "version": "0.5.5", + "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -9982,8 +11055,7 @@ }, "node_modules/http-proxy-agent": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -9995,8 +11067,7 @@ }, "node_modules/http-proxy-middleware": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "license": "MIT", "dependencies": { "http-proxy": "^1.17.0", "is-glob": "^4.0.0", @@ -10009,8 +11080,7 @@ }, "node_modules/http-proxy-middleware/node_modules/braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "license": "MIT", "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -10029,8 +11099,7 @@ }, "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -10040,8 +11109,7 @@ }, "node_modules/http-proxy-middleware/node_modules/fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -10054,8 +11122,7 @@ }, "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -10063,18 +11130,9 @@ "node": ">=0.10.0" } }, - "node_modules/http-proxy-middleware/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/http-proxy-middleware/node_modules/is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -10084,8 +11142,7 @@ }, "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -10095,8 +11152,7 @@ }, "node_modules/http-proxy-middleware/node_modules/micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "license": "MIT", "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -10118,8 +11174,7 @@ }, "node_modules/http-proxy-middleware/node_modules/to-regex-range": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "license": "MIT", "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -10130,13 +11185,11 @@ }, "node_modules/https-browserify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + "license": "MIT" }, "node_modules/https-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -10147,29 +11200,29 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/husky": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", - "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", + "version": "7.0.2", "dev": true, + "license": "MIT", "bin": { "husky": "lib/bin.js" }, + "engines": { + "node": ">=12" + }, "funding": { "url": "https://github.com/sponsors/typicode" } }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -10179,8 +11232,7 @@ }, "node_modules/icss-utils": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "license": "ISC", "dependencies": { "postcss": "^7.0.14" }, @@ -10190,8 +11242,7 @@ }, "node_modules/identity-obj-proxy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "license": "MIT", "dependencies": { "harmony-reflect": "^1.4.6" }, @@ -10201,8 +11252,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -10216,34 +11265,31 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/iferr": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + "license": "MIT" }, "node_modules/ignore": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "devOptional": true, + "version": "3.0.4", + "dev": true, + "license": "ISC", "dependencies": { "minimatch": "^3.0.4" } }, "node_modules/immer": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", - "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -10251,8 +11297,7 @@ }, "node_modules/import-cwd": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "license": "MIT", "dependencies": { "import-from": "^2.1.0" }, @@ -10261,21 +11306,22 @@ } }, "node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "version": "3.3.0", + "license": "MIT", "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-from": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "license": "MIT", "dependencies": { "resolve-from": "^3.0.0" }, @@ -10283,10 +11329,16 @@ "node": ">=4" } }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "version": "3.1.0", + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -10296,12 +11348,14 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-local/node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -10311,34 +11365,29 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/indexes-of": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + "license": "MIT" }, "node_modules/infer-owner": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + "license": "ISC" }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -10346,18 +11395,15 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "license": "ISC" }, "node_modules/internal-ip": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "license": "MIT", "dependencies": { "default-gateway": "^4.2.0", "ipaddr.js": "^1.9.0" @@ -10368,8 +11414,7 @@ }, "node_modules/internal-slot": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.0", "has": "^1.0.3", @@ -10379,60 +11424,57 @@ "node": ">= 0.4" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/ip": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + "license": "MIT" }, "node_modules/ip-regex": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/is-absolute-url": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "version": "0.1.6", + "license": "MIT", "dependencies": { - "kind-of": "^6.0.0" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "version": "1.1.1", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10443,21 +11485,21 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "license": "MIT" }, "node_modules/is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "optional": true, "dependencies": { "binary-extensions": "^2.0.0" @@ -10467,11 +11509,11 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "version": "1.1.2", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10482,13 +11524,11 @@ }, "node_modules/is-buffer": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "license": "MIT" }, "node_modules/is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "version": "1.2.4", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10498,8 +11538,7 @@ }, "node_modules/is-ci": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "license": "MIT", "dependencies": { "ci-info": "^2.0.0" }, @@ -10509,8 +11548,7 @@ }, "node_modules/is-color-stop": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "license": "MIT", "dependencies": { "css-color-names": "^0.0.4", "hex-color-regex": "^1.1.0", @@ -10521,9 +11559,8 @@ } }, "node_modules/is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "version": "2.8.1", + "license": "MIT", "dependencies": { "has": "^1.0.3" }, @@ -10532,20 +11569,31 @@ } }, "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "version": "0.1.4", + "license": "MIT", "dependencies": { - "kind-of": "^6.0.0" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -10554,30 +11602,34 @@ } }, "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "0.1.6", + "license": "MIT", "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "engines": { "node": ">=0.10.0" } }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-directory": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -10589,48 +11641,36 @@ } }, "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, + "version": "0.1.1", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "devOptional": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, + "version": "3.0.0", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/is-generator-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -10640,13 +11680,11 @@ }, "node_modules/is-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + "license": "MIT" }, "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10656,16 +11694,17 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "version": "1.0.6", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -10674,25 +11713,22 @@ } }, "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "version": "1.0.1", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/is-path-cwd": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-path-in-cwd": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "license": "MIT", "dependencies": { "is-path-inside": "^2.1.0" }, @@ -10702,8 +11738,7 @@ }, "node_modules/is-path-inside": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "license": "MIT", "dependencies": { "path-is-inside": "^1.0.2" }, @@ -10713,16 +11748,14 @@ }, "node_modules/is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -10732,16 +11765,14 @@ }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + "license": "MIT" }, "node_modules/is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "version": "1.1.4", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10752,37 +11783,45 @@ }, "node_modules/is-regexp": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-resolvable": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + "license": "ISC" }, "node_modules/is-root": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -10792,8 +11831,7 @@ }, "node_modules/is-symbol": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -10806,14 +11844,12 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -10821,18 +11857,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-windows": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -10842,56 +11886,43 @@ }, "node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "version": "5.1.0", + "license": "BSD-3-Clause", "dependencies": { - "@babel/core": "^7.7.5", + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", @@ -10903,38 +11934,14 @@ }, "node_modules/istanbul-lib-report/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, + "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" } }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -10943,30 +11950,27 @@ } }, "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.4", + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -10975,39 +11979,9 @@ "node": ">=8" } }, - "node_modules/jest": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", - "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", - "dependencies": { - "@jest/core": "^26.6.0", - "import-local": "^3.0.2", - "jest-cli": "^26.6.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dependencies": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, "node_modules/jest-circus": { "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", - "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", + "license": "MIT", "dependencies": { "@babel/traverse": "^7.1.0", "@jest/environment": "^26.6.0", @@ -11018,117 +11992,26 @@ "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^26.6.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.0", - "jest-matcher-utils": "^26.6.0", - "jest-message-util": "^26.6.0", - "jest-runner": "^26.6.0", - "jest-runtime": "^26.6.0", - "jest-snapshot": "^26.6.0", - "jest-util": "^26.6.0", - "pretty-format": "^26.6.0", - "stack-utils": "^2.0.2", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dependencies": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - }, - "bin": { - "jest": "bin/jest.js" + "expect": "^26.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" }, "engines": { "node": ">= 10.14.2" } }, - "node_modules/jest-cli/node_modules/ansi-styles": { + "node_modules/jest-circus/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -11139,10 +12022,9 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11154,10 +12036,9 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-cli/node_modules/color-convert": { + "node_modules/jest-circus/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -11165,23 +12046,20 @@ "node": ">=7.0.0" } }, - "node_modules/jest-cli/node_modules/color-name": { + "node_modules/jest-circus/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, - "node_modules/jest-cli/node_modules/has-flag": { + "node_modules/jest-circus/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/jest-cli/node_modules/supports-color": { + "node_modules/jest-circus/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11191,8 +12069,7 @@ }, "node_modules/jest-config": { "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "license": "MIT", "dependencies": { "@babel/core": "^7.1.0", "@jest/test-sequencer": "^26.6.3", @@ -11227,8 +12104,7 @@ }, "node_modules/jest-config/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -11240,9 +12116,8 @@ } }, "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11256,8 +12131,7 @@ }, "node_modules/jest-config/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -11267,21 +12141,18 @@ }, "node_modules/jest-config/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-config/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-config/node_modules/jest-resolve": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "license": "MIT", "dependencies": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", @@ -11296,65 +12167,9 @@ "node": ">= 10.14.2" } }, - "node_modules/jest-config/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-config/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-config/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-config/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11362,18 +12177,9 @@ "node": ">=8" } }, - "node_modules/jest-config/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-diff": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^26.6.2", @@ -11386,8 +12192,7 @@ }, "node_modules/jest-diff/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -11399,9 +12204,8 @@ } }, "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11415,8 +12219,7 @@ }, "node_modules/jest-diff/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -11426,21 +12229,18 @@ }, "node_modules/jest-diff/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-diff/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-diff/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11450,8 +12250,7 @@ }, "node_modules/jest-docblock": { "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, @@ -11461,8 +12260,7 @@ }, "node_modules/jest-each": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "license": "MIT", "dependencies": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", @@ -11476,8 +12274,7 @@ }, "node_modules/jest-each/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -11489,9 +12286,8 @@ } }, "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11505,8 +12301,7 @@ }, "node_modules/jest-each/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -11516,21 +12311,18 @@ }, "node_modules/jest-each/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-each/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-each/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11540,8 +12332,7 @@ }, "node_modules/jest-environment-jsdom": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "license": "MIT", "dependencies": { "@jest/environment": "^26.6.2", "@jest/fake-timers": "^26.6.2", @@ -11557,8 +12348,7 @@ }, "node_modules/jest-environment-node": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "license": "MIT", "dependencies": { "@jest/environment": "^26.6.2", "@jest/fake-timers": "^26.6.2", @@ -11573,16 +12363,14 @@ }, "node_modules/jest-get-type": { "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "license": "MIT", "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-haste-map": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "license": "MIT", "dependencies": { "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", @@ -11607,8 +12395,7 @@ }, "node_modules/jest-jasmine2": { "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "license": "MIT", "dependencies": { "@babel/traverse": "^7.1.0", "@jest/environment": "^26.6.2", @@ -11635,8 +12422,7 @@ }, "node_modules/jest-jasmine2/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -11648,9 +12434,8 @@ } }, "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11664,8 +12449,7 @@ }, "node_modules/jest-jasmine2/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -11675,21 +12459,18 @@ }, "node_modules/jest-jasmine2/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-jasmine2/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-jasmine2/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11699,8 +12480,7 @@ }, "node_modules/jest-leak-detector": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "license": "MIT", "dependencies": { "jest-get-type": "^26.3.0", "pretty-format": "^26.6.2" @@ -11711,8 +12491,7 @@ }, "node_modules/jest-matcher-utils": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^26.6.2", @@ -11725,8 +12504,7 @@ }, "node_modules/jest-matcher-utils/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -11738,9 +12516,8 @@ } }, "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11754,8 +12531,7 @@ }, "node_modules/jest-matcher-utils/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -11765,21 +12541,18 @@ }, "node_modules/jest-matcher-utils/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-matcher-utils/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-matcher-utils/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11789,8 +12562,7 @@ }, "node_modules/jest-message-util": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "@jest/types": "^26.6.2", @@ -11808,8 +12580,7 @@ }, "node_modules/jest-message-util/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -11821,9 +12592,8 @@ } }, "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11837,8 +12607,7 @@ }, "node_modules/jest-message-util/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -11848,21 +12617,18 @@ }, "node_modules/jest-message-util/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-message-util/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11872,8 +12638,7 @@ }, "node_modules/jest-mock": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "license": "MIT", "dependencies": { "@jest/types": "^26.6.2", "@types/node": "*" @@ -11884,8 +12649,7 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -11900,16 +12664,14 @@ }, "node_modules/jest-regex-util": { "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "license": "MIT", "engines": { "node": ">= 10.14.2" } }, "node_modules/jest-resolve": { "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", - "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", + "license": "MIT", "dependencies": { "@jest/types": "^26.6.0", "chalk": "^4.0.0", @@ -11924,23 +12686,9 @@ "node": ">= 10.14.2" } }, - "node_modules/jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "dependencies": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, "node_modules/jest-resolve/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -11952,9 +12700,8 @@ } }, "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11968,8 +12715,7 @@ }, "node_modules/jest-resolve/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -11979,76 +12725,18 @@ }, "node_modules/jest-resolve/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-resolve/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-resolve/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-resolve/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12056,18 +12744,9 @@ "node": ">=8" } }, - "node_modules/jest-resolve/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-runner": { "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "license": "MIT", "dependencies": { "@jest/console": "^26.6.2", "@jest/environment": "^26.6.2", @@ -12096,8 +12775,7 @@ }, "node_modules/jest-runner/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -12109,9 +12787,8 @@ } }, "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12125,8 +12802,7 @@ }, "node_modules/jest-runner/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -12136,21 +12812,18 @@ }, "node_modules/jest-runner/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-runner/node_modules/jest-resolve": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "license": "MIT", "dependencies": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", @@ -12165,65 +12838,9 @@ "node": ">= 10.14.2" } }, - "node_modules/jest-runner/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-runner/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-runner/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-runner/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12231,18 +12848,9 @@ "node": ">=8" } }, - "node_modules/jest-runner/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-runtime": { "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "license": "MIT", "dependencies": { "@jest/console": "^26.6.2", "@jest/environment": "^26.6.2", @@ -12281,8 +12889,7 @@ }, "node_modules/jest-runtime/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -12293,10 +12900,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-runtime/node_modules/camelcase": { + "version": "5.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12308,10 +12921,18 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-runtime/node_modules/cliui": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, "node_modules/jest-runtime/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -12321,21 +12942,18 @@ }, "node_modules/jest-runtime/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-runtime/node_modules/jest-resolve": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "license": "MIT", "dependencies": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", @@ -12350,84 +12968,73 @@ "node": ">= 10.14.2" } }, - "node_modules/jest-runtime/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-runtime/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/jest-runtime/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/jest-runtime/node_modules/wrap-ansi": { + "version": "6.2.0", + "license": "MIT", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-runtime/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } + "node_modules/jest-runtime/node_modules/y18n": { + "version": "4.0.3", + "license": "ISC" }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-runtime/node_modules/yargs": { + "version": "15.4.1", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, "engines": { "node": ">=8" } }, - "node_modules/jest-runtime/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/jest-runtime/node_modules/yargs-parser": { + "version": "18.1.3", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/jest-serializer": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "license": "MIT", "dependencies": { "@types/node": "*", "graceful-fs": "^4.2.4" @@ -12438,8 +13045,7 @@ }, "node_modules/jest-snapshot": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0", "@jest/types": "^26.6.2", @@ -12464,8 +13070,7 @@ }, "node_modules/jest-snapshot/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -12477,9 +13082,8 @@ } }, "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12493,8 +13097,7 @@ }, "node_modules/jest-snapshot/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -12504,21 +13107,18 @@ }, "node_modules/jest-snapshot/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-snapshot/node_modules/jest-resolve": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "license": "MIT", "dependencies": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", @@ -12533,65 +13133,9 @@ "node": ">= 10.14.2" } }, - "node_modules/jest-snapshot/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-snapshot/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-snapshot/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-snapshot/node_modules/semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -12604,8 +13148,7 @@ }, "node_modules/jest-snapshot/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12613,18 +13156,9 @@ "node": ">=8" } }, - "node_modules/jest-snapshot/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-util": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "license": "MIT", "dependencies": { "@jest/types": "^26.6.2", "@types/node": "*", @@ -12639,8 +13173,7 @@ }, "node_modules/jest-util/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -12652,9 +13185,8 @@ } }, "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12668,8 +13200,7 @@ }, "node_modules/jest-util/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -12679,21 +13210,18 @@ }, "node_modules/jest-util/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-util/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12703,8 +13231,7 @@ }, "node_modules/jest-validate": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "license": "MIT", "dependencies": { "@jest/types": "^26.6.2", "camelcase": "^6.0.0", @@ -12719,8 +13246,7 @@ }, "node_modules/jest-validate/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -12732,9 +13258,8 @@ } }, "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12748,8 +13273,7 @@ }, "node_modules/jest-validate/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -12759,21 +13283,18 @@ }, "node_modules/jest-validate/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-validate/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12783,8 +13304,7 @@ }, "node_modules/jest-watch-typeahead": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", - "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", + "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", @@ -12801,18 +13321,9 @@ "jest": "^26.0.0" } }, - "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -12824,9 +13335,8 @@ } }, "node_modules/jest-watch-typeahead/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12840,8 +13350,7 @@ }, "node_modules/jest-watch-typeahead/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -12851,32 +13360,18 @@ }, "node_modules/jest-watch-typeahead/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-watch-typeahead/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-watch-typeahead/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12886,8 +13381,7 @@ }, "node_modules/jest-watcher": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "license": "MIT", "dependencies": { "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", @@ -12903,8 +13397,7 @@ }, "node_modules/jest-watcher/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -12916,9 +13409,8 @@ } }, "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12932,8 +13424,7 @@ }, "node_modules/jest-watcher/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -12943,21 +13434,18 @@ }, "node_modules/jest-watcher/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-watcher/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12967,8 +13455,7 @@ }, "node_modules/jest-worker": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -12980,16 +13467,14 @@ }, "node_modules/jest-worker/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-worker/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12997,20 +13482,13 @@ "node": ">=8" } }, - "node_modules/jquery": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" - }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -13020,9 +13498,8 @@ } }, "node_modules/jsdom": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", - "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "version": "16.7.0", + "license": "MIT", "dependencies": { "abab": "^2.0.5", "acorn": "^8.2.4", @@ -13049,7 +13526,7 @@ "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.5.0", - "ws": "^7.4.5", + "ws": "^7.4.6", "xml-name-validator": "^3.0.0" }, "engines": { @@ -13065,9 +13542,8 @@ } }, "node_modules/jsdom/node_modules/acorn": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.2.4.tgz", - "integrity": "sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg==", + "version": "8.7.0", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -13077,8 +13553,7 @@ }, "node_modules/jsesc": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -13088,33 +13563,23 @@ }, "node_modules/json-parse-better-errors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "node_modules/json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + "license": "MIT" }, "node_modules/json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.0", + "license": "MIT", "dependencies": { "minimist": "^1.2.5" }, @@ -13127,8 +13592,7 @@ }, "node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -13137,11 +13601,10 @@ } }, "node_modules/jsx-ast-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", - "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "version": "3.2.1", + "license": "MIT", "dependencies": { - "array-includes": "^3.1.2", + "array-includes": "^3.1.3", "object.assign": "^4.1.2" }, "engines": { @@ -13150,319 +13613,102 @@ }, "node_modules/killable": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + "license": "ISC" }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "version": "2.0.5", + "license": "MIT", "engines": { "node": ">= 8" } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", - "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "dependencies": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" - }, - "node_modules/lint-staged": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz", - "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.1", - "cli-truncate": "^2.1.0", - "commander": "^7.2.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.3.1", - "dedent": "^0.7.0", - "enquirer": "^2.3.6", - "execa": "^5.0.0", - "listr2": "^3.8.2", - "log-symbols": "^4.1.0", - "micromatch": "^4.0.4", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "string-argv": "0.3.1", - "stringify-object": "^3.3.0" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/lint-staged/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/lint-staged/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/lint-staged/node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lint-staged/node_modules/execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lint-staged/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + }, + "node_modules/language-subtag-registry": { + "version": "0.3.21", + "license": "ODC-By-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "language-subtag-registry": "~0.3.2" } }, - "node_modules/lint-staged/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, + "node_modules/last-call-webpack-plugin": { + "version": "3.0.0", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" } }, - "node_modules/lint-staged/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, + "node_modules/leven": { + "version": "3.1.0", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/lint-staged/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/levn": { + "version": "0.4.1", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/listr2": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.8.4.tgz", - "integrity": "sha512-DX+iKRcxaGbBjoLJBQlGceZoqdhV6Z54wpsvIVoVKNJ/lEXK8KhGhLaZnIGKRQmDmtJOtyNSnnKFUS1qn+jqsw==", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/lint-staged": { + "version": "11.1.1", "dev": true, + "license": "MIT", "dependencies": { + "chalk": "^4.1.1", "cli-truncate": "^2.1.0", - "colorette": "^1.2.2", - "figures": "^3.2.0", - "indent-string": "^4.0.0", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rxjs": "^6.6.7", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" }, - "engines": { - "node": ">=10.0.0" + "bin": { + "lint-staged": "bin/lint-staged.js" }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" + "funding": { + "url": "https://opencollective.com/lint-staged" } }, - "node_modules/listr2/node_modules/ansi-styles": { + "node_modules/lint-staged/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -13473,163 +13719,104 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/lint-staged/node_modules/chalk": { + "version": "4.1.2", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/listr2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/listr2/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/lint-staged/node_modules/color-convert": { + "version": "2.0.1", "dev": true, + "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=7.0.0" } }, - "node_modules/listr2/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/lint-staged/node_modules/color-name": { + "version": "1.1.4", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/listr2/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "node_modules/lint-staged/node_modules/has-flag": { + "version": "4.0.0", "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "node_modules/lint-staged/node_modules/supports-color": { + "version": "7.2.0", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/listr2": { + "version": "3.14.0", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=10.0.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "engines": { - "node": ">=4" + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } } }, "node_modules/loader-runner": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "license": "MIT", "engines": { "node": ">=4.3.0 <5.0.0 || >=5.10" } }, "node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.2", + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "json5": "^2.1.2" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/loader-utils/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" + "node": ">=8.9.0" } }, "node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -13639,43 +13826,27 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", - "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + "license": "MIT" }, "node_modules/lodash._reinterpolate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "license": "MIT" }, "node_modules/lodash.template": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "license": "MIT", "dependencies": { "lodash._reinterpolate": "^3.0.0", "lodash.templatesettings": "^4.0.0" @@ -13683,27 +13854,23 @@ }, "node_modules/lodash.templatesettings": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "license": "MIT", "dependencies": { "lodash._reinterpolate": "^3.0.0" } }, "node_modules/lodash.truncate": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -13717,9 +13884,8 @@ }, "node_modules/log-symbols/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -13731,10 +13897,9 @@ } }, "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13748,9 +13913,8 @@ }, "node_modules/log-symbols/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -13760,24 +13924,21 @@ }, "node_modules/log-symbols/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/log-symbols/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -13787,9 +13948,8 @@ }, "node_modules/log-update": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.0", "cli-cursor": "^3.1.0", @@ -13805,9 +13965,8 @@ }, "node_modules/log-update/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -13818,32 +13977,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/log-update/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -13853,37 +13990,13 @@ }, "node_modules/log-update/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/log-update/node_modules/slice-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -13896,10 +14009,22 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "version": "1.8.0", + "license": "MIT", "engines": { "node": ">= 0.6.0" }, @@ -13908,10 +14033,13 @@ "url": "https://tidelift.com/funding/github/npm/loglevel" } }, + "node_modules/long": { + "version": "4.0.0", + "license": "Apache-2.0" + }, "node_modules/loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -13921,21 +14049,18 @@ }, "node_modules/lower-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/lower-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1", + "license": "0BSD" }, "node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -13943,51 +14068,51 @@ "node": ">=10" } }, - "node_modules/lru-cache/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "node_modules/lz-string": { + "version": "1.4.4", + "dev": true, + "license": "WTFPL", + "bin": { + "lz-string": "bin/bin.js" + } }, "node_modules/magic-string": { "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.4" } }, "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "license": "MIT", "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "version": "1.0.12", + "license": "BSD-3-Clause", "dependencies": { - "tmpl": "1.0.x" + "tmpl": "1.0.5" } }, "node_modules/map-cache": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/map-visit": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "license": "MIT", "dependencies": { "object-visit": "^1.0.0" }, @@ -13997,8 +14122,7 @@ }, "node_modules/md5.js": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -14007,21 +14131,18 @@ }, "node_modules/mdn-data": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + "license": "CC0-1.0" }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/memory-fs": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "license": "MIT", "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -14029,39 +14150,33 @@ }, "node_modules/merge-descriptors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/microevent.ts": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "license": "MIT", "dependencies": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -14072,8 +14187,7 @@ }, "node_modules/miller-rabin": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -14084,13 +14198,11 @@ }, "node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -14099,19 +14211,17 @@ } }, "node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.51.0", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.34", + "license": "MIT", "dependencies": { - "mime-db": "1.44.0" + "mime-db": "1.51.0" }, "engines": { "node": ">= 0.6" @@ -14119,25 +14229,33 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "devOptional": true, + "node_modules/mimic-response": { + "version": "2.1.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/mini-css-extract-plugin": { "version": "0.11.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", - "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", + "license": "MIT", "dependencies": { "loader-utils": "^1.1.0", "normalize-url": "1.9.1", @@ -14155,20 +14273,51 @@ "webpack": "^4.4.0 || ^5.0.0" } }, + "node_modules/mini-css-extract-plugin/node_modules/json5": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/loader-utils": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "license": "ISC" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + "license": "MIT" }, "node_modules/minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14178,23 +14327,21 @@ }, "node_modules/minimist": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "license": "MIT" }, "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "devOptional": true, + "version": "3.1.3", + "license": "ISC", "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/minipass-collect": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -14202,26 +14349,9 @@ "node": ">= 8" } }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/minipass-flush": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -14229,26 +14359,9 @@ "node": ">= 8" } }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/minipass-pipeline": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -14256,35 +14369,20 @@ "node": ">=8" } }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "node_modules/minizlib": { + "version": "2.1.2", + "license": "MIT", "dependencies": { + "minipass": "^3.0.0", "yallist": "^4.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "devOptional": true, - "dependencies": { - "minipass": "^2.9.0" + "node": ">= 8" } }, "node_modules/mississippi": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "license": "BSD-2-Clause", "dependencies": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -14303,8 +14401,7 @@ }, "node_modules/mixin-deep": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "license": "MIT", "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -14313,10 +14410,19 @@ "node": ">=0.10.0" } }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/mkdirp": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "license": "MIT", "dependencies": { "minimist": "^1.2.5" }, @@ -14326,8 +14432,7 @@ }, "node_modules/move-concurrently": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "license": "ISC", "dependencies": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -14337,15 +14442,23 @@ "run-queue": "^1.0.3" } }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "license": "MIT" }, "node_modules/multicast-dns": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "license": "MIT", "dependencies": { "dns-packet": "^1.3.1", "thunky": "^1.0.2" @@ -14356,19 +14469,16 @@ }, "node_modules/multicast-dns-service-types": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + "license": "MIT" }, "node_modules/nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "devOptional": true + "version": "2.15.0", + "devOptional": true, + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "version": "3.3.1", + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -14378,8 +14488,7 @@ }, "node_modules/nanomatch": { "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "license": "MIT", "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -14399,22 +14508,19 @@ }, "node_modules/native-url": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", - "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", + "license": "Apache-2.0", "dependencies": { "querystring": "^0.2.0" } }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "license": "MIT" }, "node_modules/needle": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz", - "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==", - "devOptional": true, + "version": "2.9.1", + "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", @@ -14428,76 +14534,92 @@ } }, "node_modules/needle/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "devOptional": true, + "version": "3.2.7", + "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "license": "MIT" }, "node_modules/next-tick": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + "license": "MIT" }, "node_modules/nice-try": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "license": "MIT" }, "node_modules/no-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "node_modules/no-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1", + "license": "0BSD" }, "node_modules/node-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", - "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=", + "version": "2.6.7", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, "engines": { "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/node-forge": { "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.0.0" } }, "node_modules/node-int64": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + "license": "MIT" }, "node_modules/node-libs-browser": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "license": "MIT", "dependencies": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -14526,21 +14648,11 @@ }, "node_modules/node-libs-browser/node_modules/punycode": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, "node_modules/node-notifier": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "license": "MIT", "optional": true, "dependencies": { "growly": "^1.3.0", @@ -14553,8 +14665,7 @@ }, "node_modules/node-notifier/node_modules/semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "license": "ISC", "optional": true, "dependencies": { "lru-cache": "^6.0.0" @@ -14568,10 +14679,8 @@ }, "node_modules/node-pre-gyp": { "version": "0.14.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", @@ -14584,32 +14693,211 @@ "semver": "^5.3.0", "tar": "^4.4.2" }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/node-pre-gyp/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-pre-gyp/node_modules/are-we-there-yet": { + "version": "1.1.7", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/node-pre-gyp/node_modules/chownr": { + "version": "1.1.4", + "dev": true, + "license": "ISC" + }, + "node_modules/node-pre-gyp/node_modules/fs-minipass": { + "version": "1.2.7", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/node-pre-gyp/node_modules/gauge": { + "version": "2.7.4", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/node-pre-gyp/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-pre-gyp/node_modules/minipass": { + "version": "2.9.0", + "dev": true, + "license": "ISC", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/node-pre-gyp/node_modules/minizlib": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^2.9.0" + } + }, + "node_modules/node-pre-gyp/node_modules/nopt": { + "version": "4.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/node-pre-gyp/node_modules/npmlog": { + "version": "4.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/node-pre-gyp/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/node-pre-gyp/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/node-pre-gyp/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-pre-gyp/node_modules/string-width": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-pre-gyp/node_modules/strip-ansi": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-pre-gyp/node_modules/tar": { + "version": "4.4.19", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "engines": { + "node": ">=4.5" } }, + "node_modules/node-pre-gyp/node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, "node_modules/node-releases": { - "version": "1.1.72", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", - "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==" + "version": "2.0.2", + "license": "MIT" }, "node_modules/nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "version": "5.0.0", "devOptional": true, + "license": "ISC", "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1" }, "bin": { "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/normalize-package-data": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -14617,26 +14905,30 @@ "validate-npm-package-license": "^3.0.1" } }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-range": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "license": "MIT", "dependencies": { "object-assign": "^4.0.1", "prepend-http": "^1.0.0", @@ -14647,31 +14939,23 @@ "node": ">=4" } }, - "node_modules/nouislider": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/nouislider/-/nouislider-9.2.0.tgz", - "integrity": "sha1-6HxQfeKwtNB1A4taQlR8fbvrr2k=" - }, "node_modules/npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "devOptional": true, + "version": "1.1.2", + "dev": true, + "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^1.0.1" } }, "node_modules/npm-normalize-package-bin": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "devOptional": true + "dev": true, + "license": "ISC" }, "node_modules/npm-packlist": { "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "devOptional": true, + "dev": true, + "license": "ISC", "dependencies": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1", @@ -14680,8 +14964,7 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -14690,56 +14973,49 @@ } }, "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "version": "5.0.1", "devOptional": true, + "license": "ISC", "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" } }, "node_modules/nth-check": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "~1.0.0" } }, "node_modules/num2fraction": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + "license": "MIT" }, "node_modules/number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "devOptional": true, + "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/nwsapi": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + "license": "MIT" }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-copy": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "license": "MIT", "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -14751,8 +15027,7 @@ }, "node_modules/object-copy/node_modules/define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "license": "MIT", "dependencies": { "is-descriptor": "^0.1.0" }, @@ -14760,53 +15035,9 @@ "node": ">=0.10.0" } }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-copy/node_modules/kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -14815,17 +15046,15 @@ } }, "node_modules/object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "version": "1.12.0", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-is": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -14839,16 +15068,14 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object-visit": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "license": "MIT", "dependencies": { "isobject": "^3.0.0" }, @@ -14858,8 +15085,7 @@ }, "node_modules/object.assign": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -14874,27 +15100,24 @@ } }, "node_modules/object.entries": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", - "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "version": "1.1.5", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", - "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "version": "2.0.5", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.4" @@ -14904,13 +15127,12 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "version": "2.1.3", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.8" @@ -14921,8 +15143,7 @@ }, "node_modules/object.pick": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -14931,13 +15152,12 @@ } }, "node_modules/object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "version": "1.1.5", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.4" @@ -14948,13 +15168,11 @@ }, "node_modules/obuf": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + "license": "MIT" }, "node_modules/on-finished": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -14964,24 +15182,21 @@ }, "node_modules/on-headers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -14994,8 +15209,7 @@ }, "node_modules/open": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "license": "MIT", "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -15009,8 +15223,7 @@ }, "node_modules/opn": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "license": "MIT", "dependencies": { "is-wsl": "^1.1.0" }, @@ -15020,16 +15233,14 @@ }, "node_modules/opn/node_modules/is-wsl": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/optimize-css-assets-webpack-plugin": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", - "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "license": "MIT", "dependencies": { "cssnano": "^4.1.10", "last-call-webpack-plugin": "^3.0.0" @@ -15039,16 +15250,15 @@ } }, "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "license": "MIT", "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" }, "engines": { "node": ">= 0.8.0" @@ -15056,40 +15266,35 @@ }, "node_modules/original": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "license": "MIT", "dependencies": { "url-parse": "^1.4.3" } }, "node_modules/os-browserify": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + "license": "MIT" }, "node_modules/os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "devOptional": true, + "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "devOptional": true, + "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/osenv": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "devOptional": true, + "dev": true, + "license": "ISC", "dependencies": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -15097,8 +15302,7 @@ }, "node_modules/p-each-series": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -15108,16 +15312,14 @@ }, "node_modules/p-finally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -15130,8 +15332,7 @@ }, "node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -15141,8 +15342,7 @@ }, "node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -15155,8 +15355,7 @@ }, "node_modules/p-retry": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "license": "MIT", "dependencies": { "retry": "^0.12.0" }, @@ -15166,21 +15365,18 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pako": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "license": "(MIT AND Zlib)" }, "node_modules/parallel-transform": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "license": "MIT", "dependencies": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -15189,22 +15385,19 @@ }, "node_modules/param-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/param-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1", + "license": "0BSD" }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -15212,18 +15405,9 @@ "node": ">=6" } }, - "node_modules/parent-module/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/parse-asn1": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "license": "ISC", "dependencies": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -15233,113 +15417,102 @@ } }, "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.2.0", + "license": "MIT", "dependencies": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse5": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "license": "MIT" }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/pascal-case": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/pascal-case/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1", + "license": "0BSD" }, "node_modules/pascalcase": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-browserify": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + "license": "MIT" }, "node_modules/path-dirname": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-is-inside": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "license": "(WTFPL OR MIT)" }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "version": "1.0.7", + "license": "MIT" }, "node_modules/path-to-regexp": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pbkdf2": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "license": "MIT", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -15351,15 +15524,22 @@ "node": ">=0.12" } }, + "node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, "node_modules/performance-now": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -15369,24 +15549,21 @@ }, "node_modules/pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pinkie": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/pinkie-promise": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "license": "MIT", "dependencies": { "pinkie": "^2.0.0" }, @@ -15395,173 +15572,119 @@ } }, "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, + "version": "4.0.5", + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "version": "3.0.0", + "license": "MIT", "dependencies": { - "find-up": "^2.1.0" + "find-up": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/pkg-dir/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "3.0.0", + "license": "MIT", "dependencies": { - "locate-path": "^2.0.0" + "locate-path": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/pkg-dir/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "3.0.0", + "license": "MIT", "dependencies": { - "p-locate": "^2.0.0", + "p-locate": "^3.0.0", "path-exists": "^3.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/pkg-dir/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "3.0.0", + "license": "MIT", "dependencies": { - "p-limit": "^1.1.0" + "p-limit": "^2.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/pkg-dir/node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "version": "3.1.0", + "license": "MIT", "dependencies": { - "find-up": "^2.1.0" + "find-up": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "3.0.0", + "license": "MIT", "dependencies": { - "locate-path": "^2.0.0" + "locate-path": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "3.0.0", + "license": "MIT", "dependencies": { - "p-locate": "^2.0.0", + "p-locate": "^3.0.0", "path-exists": "^3.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "3.0.0", + "license": "MIT", "dependencies": { - "p-limit": "^1.1.0" + "p-limit": "^2.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/pkg-up/node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/please-upgrade-node": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, + "license": "MIT", "dependencies": { "semver-compare": "^1.0.0" } }, "node_modules/pnp-webpack-plugin": { "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "license": "MIT", "dependencies": { "ts-pnp": "^1.1.6" }, @@ -15569,15 +15692,9 @@ "node": ">=6" } }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" - }, "node_modules/portfinder": { "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "license": "MIT", "dependencies": { "async": "^2.6.2", "debug": "^3.1.1", @@ -15589,28 +15706,24 @@ }, "node_modules/portfinder/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/posix-character-classes": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.39", + "license": "MIT", "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" }, "engines": { "node": ">=6.0.0" @@ -15622,8 +15735,7 @@ }, "node_modules/postcss-attribute-case-insensitive": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "license": "MIT", "dependencies": { "postcss": "^7.0.2", "postcss-selector-parser": "^6.0.2" @@ -15631,8 +15743,7 @@ }, "node_modules/postcss-browser-comments": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7" }, @@ -15645,8 +15756,7 @@ }, "node_modules/postcss-calc": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "license": "MIT", "dependencies": { "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", @@ -15655,8 +15765,7 @@ }, "node_modules/postcss-color-functional-notation": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -15667,8 +15776,7 @@ }, "node_modules/postcss-color-gray": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "license": "ISC", "dependencies": { "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.5", @@ -15680,8 +15788,7 @@ }, "node_modules/postcss-color-hex-alpha": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "license": "MIT", "dependencies": { "postcss": "^7.0.14", "postcss-values-parser": "^2.0.1" @@ -15692,8 +15799,7 @@ }, "node_modules/postcss-color-mod-function": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "license": "CC0-1.0", "dependencies": { "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.2", @@ -15705,8 +15811,7 @@ }, "node_modules/postcss-color-rebeccapurple": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "license": "MIT", "dependencies": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -15717,8 +15822,7 @@ }, "node_modules/postcss-colormin": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "color": "^3.0.0", @@ -15732,13 +15836,11 @@ }, "node_modules/postcss-colormin/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-convert-values": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "license": "MIT", "dependencies": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" @@ -15749,13 +15851,11 @@ }, "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-custom-media": { "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "license": "MIT", "dependencies": { "postcss": "^7.0.14" }, @@ -15765,8 +15865,7 @@ }, "node_modules/postcss-custom-properties": { "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "license": "MIT", "dependencies": { "postcss": "^7.0.17", "postcss-values-parser": "^2.0.1" @@ -15777,8 +15876,7 @@ }, "node_modules/postcss-custom-selectors": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "license": "MIT", "dependencies": { "postcss": "^7.0.2", "postcss-selector-parser": "^5.0.0-rc.3" @@ -15789,8 +15887,7 @@ }, "node_modules/postcss-custom-selectors/node_modules/cssesc": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -15800,8 +15897,7 @@ }, "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "license": "MIT", "dependencies": { "cssesc": "^2.0.0", "indexes-of": "^1.0.1", @@ -15813,8 +15909,7 @@ }, "node_modules/postcss-dir-pseudo-class": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.2", "postcss-selector-parser": "^5.0.0-rc.3" @@ -15825,8 +15920,7 @@ }, "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -15836,8 +15930,7 @@ }, "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "license": "MIT", "dependencies": { "cssesc": "^2.0.0", "indexes-of": "^1.0.1", @@ -15849,8 +15942,7 @@ }, "node_modules/postcss-discard-comments": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "license": "MIT", "dependencies": { "postcss": "^7.0.0" }, @@ -15860,8 +15952,7 @@ }, "node_modules/postcss-discard-duplicates": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "license": "MIT", "dependencies": { "postcss": "^7.0.0" }, @@ -15871,8 +15962,7 @@ }, "node_modules/postcss-discard-empty": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "license": "MIT", "dependencies": { "postcss": "^7.0.0" }, @@ -15882,8 +15972,7 @@ }, "node_modules/postcss-discard-overridden": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "license": "MIT", "dependencies": { "postcss": "^7.0.0" }, @@ -15893,8 +15982,7 @@ }, "node_modules/postcss-double-position-gradients": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.5", "postcss-values-parser": "^2.0.0" @@ -15905,8 +15993,7 @@ }, "node_modules/postcss-env-function": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -15917,16 +16004,14 @@ }, "node_modules/postcss-flexbugs-fixes": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", - "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", + "license": "MIT", "dependencies": { "postcss": "^7.0.26" } }, "node_modules/postcss-focus-visible": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.2" }, @@ -15936,8 +16021,7 @@ }, "node_modules/postcss-focus-within": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.2" }, @@ -15947,16 +16031,14 @@ }, "node_modules/postcss-font-variant": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", - "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", + "license": "MIT", "dependencies": { "postcss": "^7.0.2" } }, "node_modules/postcss-gap-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.2" }, @@ -15966,53 +16048,94 @@ }, "node_modules/postcss-image-set-function": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "license": "CC0-1.0", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-lab-function": { + "version": "2.0.1", + "license": "CC0-1.0", "dependencies": { + "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-load-config/node_modules/cosmiconfig": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/postcss-initial": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", - "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "node_modules/postcss-load-config/node_modules/import-fresh": { + "version": "2.0.0", + "license": "MIT", "dependencies": { - "postcss": "^7.0.2" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "node_modules/postcss-load-config/node_modules/parse-json": { + "version": "4.0.0", + "license": "MIT", "dependencies": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, - "node_modules/postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", - "dependencies": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - }, + "node_modules/postcss-load-config/node_modules/resolve-from": { + "version": "3.0.0", + "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=4" } }, "node_modules/postcss-loader": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "license": "MIT", "dependencies": { "loader-utils": "^1.1.0", "postcss": "^7.0.0", @@ -16023,10 +16146,43 @@ "node": ">= 6" } }, + "node_modules/postcss-loader/node_modules/json5": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/postcss-loader/node_modules/loader-utils": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/postcss-logical": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.2" }, @@ -16036,8 +16192,7 @@ }, "node_modules/postcss-media-minmax": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "license": "MIT", "dependencies": { "postcss": "^7.0.2" }, @@ -16047,8 +16202,7 @@ }, "node_modules/postcss-merge-longhand": { "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "license": "MIT", "dependencies": { "css-color-names": "0.0.4", "postcss": "^7.0.0", @@ -16061,13 +16215,11 @@ }, "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-merge-rules": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-api": "^3.0.0", @@ -16082,8 +16234,7 @@ }, "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "license": "MIT", "dependencies": { "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", @@ -16095,8 +16246,7 @@ }, "node_modules/postcss-minify-font-values": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "license": "MIT", "dependencies": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" @@ -16107,13 +16257,11 @@ }, "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-minify-gradients": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "license": "MIT", "dependencies": { "cssnano-util-get-arguments": "^4.0.0", "is-color-stop": "^1.0.0", @@ -16126,13 +16274,11 @@ }, "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-minify-params": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "license": "MIT", "dependencies": { "alphanum-sort": "^1.0.0", "browserslist": "^4.0.0", @@ -16147,13 +16293,11 @@ }, "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-minify-selectors": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "license": "MIT", "dependencies": { "alphanum-sort": "^1.0.0", "has": "^1.0.0", @@ -16166,8 +16310,7 @@ }, "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "license": "MIT", "dependencies": { "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", @@ -16179,8 +16322,7 @@ }, "node_modules/postcss-modules-extract-imports": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "license": "ISC", "dependencies": { "postcss": "^7.0.5" }, @@ -16190,8 +16332,7 @@ }, "node_modules/postcss-modules-local-by-default": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "license": "MIT", "dependencies": { "icss-utils": "^4.1.1", "postcss": "^7.0.32", @@ -16204,8 +16345,7 @@ }, "node_modules/postcss-modules-scope": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "license": "ISC", "dependencies": { "postcss": "^7.0.6", "postcss-selector-parser": "^6.0.0" @@ -16216,8 +16356,7 @@ }, "node_modules/postcss-modules-values": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "license": "ISC", "dependencies": { "icss-utils": "^4.0.0", "postcss": "^7.0.6" @@ -16225,8 +16364,7 @@ }, "node_modules/postcss-nesting": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.2" }, @@ -16236,8 +16374,7 @@ }, "node_modules/postcss-normalize": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", + "license": "CC0-1.0", "dependencies": { "@csstools/normalize.css": "^10.1.0", "browserslist": "^4.6.2", @@ -16251,8 +16388,7 @@ }, "node_modules/postcss-normalize-charset": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "license": "MIT", "dependencies": { "postcss": "^7.0.0" }, @@ -16262,8 +16398,7 @@ }, "node_modules/postcss-normalize-display-values": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "license": "MIT", "dependencies": { "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", @@ -16275,13 +16410,11 @@ }, "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-normalize-positions": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "license": "MIT", "dependencies": { "cssnano-util-get-arguments": "^4.0.0", "has": "^1.0.0", @@ -16294,13 +16427,11 @@ }, "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-normalize-repeat-style": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "license": "MIT", "dependencies": { "cssnano-util-get-arguments": "^4.0.0", "cssnano-util-get-match": "^4.0.0", @@ -16313,13 +16444,11 @@ }, "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-normalize-string": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "license": "MIT", "dependencies": { "has": "^1.0.0", "postcss": "^7.0.0", @@ -16331,13 +16460,11 @@ }, "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-normalize-timing-functions": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "license": "MIT", "dependencies": { "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", @@ -16349,13 +16476,11 @@ }, "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-normalize-unicode": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "postcss": "^7.0.0", @@ -16367,13 +16492,11 @@ }, "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-normalize-url": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "license": "MIT", "dependencies": { "is-absolute-url": "^2.0.0", "normalize-url": "^3.0.0", @@ -16386,21 +16509,18 @@ }, "node_modules/postcss-normalize-url/node_modules/normalize-url": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-normalize-whitespace": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "license": "MIT", "dependencies": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" @@ -16411,13 +16531,11 @@ }, "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-ordered-values": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "license": "MIT", "dependencies": { "cssnano-util-get-arguments": "^4.0.0", "postcss": "^7.0.0", @@ -16429,13 +16547,11 @@ }, "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-overflow-shorthand": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.2" }, @@ -16445,16 +16561,14 @@ }, "node_modules/postcss-page-break": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "license": "MIT", "dependencies": { "postcss": "^7.0.2" } }, "node_modules/postcss-place": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -16465,8 +16579,7 @@ }, "node_modules/postcss-preset-env": { "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "license": "CC0-1.0", "dependencies": { "autoprefixer": "^9.6.1", "browserslist": "^4.6.4", @@ -16512,8 +16625,7 @@ }, "node_modules/postcss-pseudo-class-any-link": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "license": "CC0-1.0", "dependencies": { "postcss": "^7.0.2", "postcss-selector-parser": "^5.0.0-rc.3" @@ -16524,8 +16636,7 @@ }, "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -16535,8 +16646,7 @@ }, "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "license": "MIT", "dependencies": { "cssesc": "^2.0.0", "indexes-of": "^1.0.1", @@ -16548,8 +16658,7 @@ }, "node_modules/postcss-reduce-initial": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-api": "^3.0.0", @@ -16562,8 +16671,7 @@ }, "node_modules/postcss-reduce-transforms": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "license": "MIT", "dependencies": { "cssnano-util-get-match": "^4.0.0", "has": "^1.0.0", @@ -16576,21 +16684,18 @@ }, "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-replace-overflow-wrap": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "license": "MIT", "dependencies": { "postcss": "^7.0.2" } }, "node_modules/postcss-safe-parser": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", - "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", + "license": "MIT", "dependencies": { "postcss": "^8.1.0" }, @@ -16603,13 +16708,12 @@ } }, "node_modules/postcss-safe-parser/node_modules/postcss": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz", - "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==", + "version": "8.4.7", + "license": "MIT", "dependencies": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" @@ -16621,8 +16725,7 @@ }, "node_modules/postcss-selector-matches": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "postcss": "^7.0.2" @@ -16630,17 +16733,15 @@ }, "node_modules/postcss-selector-not": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", - "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "postcss": "^7.0.2" } }, "node_modules/postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.9", + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -16651,8 +16752,7 @@ }, "node_modules/postcss-svgo": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", - "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "license": "MIT", "dependencies": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", @@ -16664,13 +16764,11 @@ }, "node_modules/postcss-svgo/node_modules/postcss-value-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "license": "MIT" }, "node_modules/postcss-unique-selectors": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "license": "MIT", "dependencies": { "alphanum-sort": "^1.0.0", "postcss": "^7.0.0", @@ -16681,14 +16779,12 @@ } }, "node_modules/postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + "version": "4.2.0", + "license": "MIT" }, "node_modules/postcss-values-parser": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "license": "MIT", "dependencies": { "flatten": "^1.0.2", "indexes-of": "^1.0.1", @@ -16698,45 +16794,56 @@ "node": ">=6.14.4" } }, + "node_modules/postcss/node_modules/picocolors": { + "version": "0.2.1", + "license": "ISC" + }, "node_modules/postcss/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/postcss/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prepend-http": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/prettier": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -16746,8 +16853,7 @@ }, "node_modules/pretty-error": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^2.0.4" @@ -16755,8 +16861,7 @@ }, "node_modules/pretty-format": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "license": "MIT", "dependencies": { "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", @@ -16767,18 +16872,9 @@ "node": ">= 10" } }, - "node_modules/pretty-format/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -16791,8 +16887,7 @@ }, "node_modules/pretty-format/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -16802,52 +16897,44 @@ }, "node_modules/pretty-format/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/pretty-format/node_modules/react-is": { "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "license": "MIT" }, "node_modules/process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "license": "MIT", "engines": { "node": ">= 0.6.0" } }, "node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/promise": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "license": "MIT", "dependencies": { "asap": "~2.0.6" } }, "node_modules/promise-inflight": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + "license": "ISC" }, "node_modules/prompts": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -16858,49 +16945,40 @@ }, "node_modules/prop-types": { "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.8.1" } }, - "node_modules/prop-types-extra": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", - "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", - "dependencies": { - "react-is": "^16.3.2", - "warning": "^4.0.0" - } - }, "node_modules/proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "license": "MIT", "dependencies": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, "engines": { "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, "node_modules/prr": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + "license": "MIT" }, "node_modules/psl": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "license": "MIT" }, "node_modules/public-encrypt": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -16912,13 +16990,11 @@ }, "node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/pump": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -16926,8 +17002,7 @@ }, "node_modules/pumpify": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "license": "MIT", "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -16936,8 +17011,7 @@ }, "node_modules/pumpify/node_modules/pump": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -16945,33 +17019,132 @@ }, "node_modules/punycode": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/puppeteer": { + "version": "10.2.0", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "4.3.1", + "devtools-protocol": "0.0.901419", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0", + "node-fetch": "2.6.1", + "pkg-dir": "4.2.0", + "progress": "2.0.1", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.0.0", + "unbzip2-stream": "1.3.3", + "ws": "7.4.6" + }, + "engines": { + "node": ">=10.18.1" + } + }, + "node_modules/puppeteer/node_modules/debug": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/puppeteer/node_modules/node-fetch": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/puppeteer/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/puppeteer/node_modules/progress": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/puppeteer/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/puppeteer/node_modules/ws": { + "version": "7.4.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/q": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "license": "MIT", "engines": { "node": ">=0.6.0", "teleport": ">=0.2.0" } }, "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.9.7", + "license": "BSD-3-Clause", "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/query-string": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "license": "MIT", "dependencies": { "object-assign": "^4.1.0", "strict-uri-encode": "^1.0.0" @@ -16981,30 +17154,24 @@ } }, "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "version": "0.2.1", + "license": "MIT", "engines": { "node": ">=0.4.x" } }, "node_modules/querystring-es3": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "engines": { "node": ">=0.4.x" } }, "node_modules/querystringify": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -17018,28 +17185,26 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/raf": { "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "license": "MIT", "dependencies": { "performance-now": "^2.1.0" } }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/randomfill": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "license": "MIT", "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -17047,19 +17212,17 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.3", + "license": "MIT", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -17068,18 +17231,16 @@ } }, "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.2", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "devOptional": true, + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -17090,14 +17251,20 @@ "rc": "cli.js" } }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", - "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "version": "17.0.2", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" + "object-assign": "^4.1.1" }, "engines": { "node": ">=0.10.0" @@ -17105,8 +17272,7 @@ }, "node_modules/react-app-polyfill": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", - "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", + "license": "MIT", "dependencies": { "core-js": "^3.6.5", "object-assign": "^4.1.1", @@ -17119,64 +17285,9 @@ "node": ">=10" } }, - "node_modules/react-bootstrap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.3.0.tgz", - "integrity": "sha512-GYj0c6FO9mx7DaO8Xyz2zs0IcQ6CGCtM3O6/feIoCaG4N8B0+l4eqL7stlMcLpqO4d8NG2PoMO/AbUOD+MO7mg==", - "dependencies": { - "@babel/runtime": "^7.4.2", - "@restart/context": "^2.1.4", - "@restart/hooks": "^0.3.21", - "@types/classnames": "^2.2.10", - "@types/invariant": "^2.2.33", - "@types/prop-types": "^15.7.3", - "@types/react": "^16.9.35", - "@types/react-transition-group": "^4.4.0", - "@types/warning": "^3.0.0", - "classnames": "^2.2.6", - "dom-helpers": "^5.1.2", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "prop-types-extra": "^1.1.0", - "react-overlays": "^4.1.0", - "react-transition-group": "^4.4.1", - "uncontrollable": "^7.0.0", - "warning": "^4.0.3" - } - }, - "node_modules/react-bootstrap-table-next": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/react-bootstrap-table-next/-/react-bootstrap-table-next-3.3.5.tgz", - "integrity": "sha512-vBO+y2Y483Y1QnpxvgY8jTz6gwIPYpfc26AKZhwgESL6cpjhxSsoFGXNp3KKnT5krW5SF9zpcf/98jIJefv+RQ==", - "dependencies": { - "classnames": "^2.2.5", - "react-transition-group": "2.5.3", - "underscore": "1.9.1" - } - }, - "node_modules/react-bootstrap-table-next/node_modules/dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "dependencies": { - "@babel/runtime": "^7.1.2" - } - }, - "node_modules/react-bootstrap-table-next/node_modules/react-transition-group": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.5.3.tgz", - "integrity": "sha512-2DGFck6h99kLNr8pOFk+z4Soq3iISydwOFeeEVPjTN6+Y01CmvbWmnN02VuTWyFdnRtIDPe+wy2q6Ui8snBPZg==", - "dependencies": { - "dom-helpers": "^3.3.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" - } - }, "node_modules/react-dev-utils": { "version": "11.0.4", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", - "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "license": "MIT", "dependencies": { "@babel/code-frame": "7.10.4", "address": "1.1.2", @@ -17209,24 +17320,14 @@ }, "node_modules/react-dev-utils/node_modules/@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "license": "MIT", "dependencies": { "@babel/highlight": "^7.10.4" } }, - "node_modules/react-dev-utils/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, "node_modules/react-dev-utils/node_modules/browserslist": { "version": "4.14.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", - "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001125", "electron-to-chromium": "^1.3.564", @@ -17246,16 +17347,14 @@ }, "node_modules/react-dev-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/react-dev-utils/node_modules/globby": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -17272,164 +17371,168 @@ } }, "node_modules/react-dev-utils/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/react-dev-utils/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/react-dev-utils/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/react-dev-utils/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/react-dev-utils/node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "2.0.0", + "license": "MIT", "dependencies": { - "find-up": "^3.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, "engines": { - "node": ">=8" + "node": ">=8.9.0" } }, - "node_modules/react-dev-utils/node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/react-dev-utils/node_modules/node-releases": { + "version": "1.1.77", + "license": "MIT" + }, + "node_modules/react-dnd": { + "version": "14.0.2", + "license": "MIT", "dependencies": { - "locate-path": "^3.0.0" + "@react-dnd/invariant": "^2.0.0", + "@react-dnd/shallowequal": "^2.0.0", + "dnd-core": "14.0.0", + "fast-deep-equal": "^3.1.3", + "hoist-non-react-statics": "^3.3.2" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "@types/hoist-non-react-statics": ">= 3.3.1", + "@types/node": ">= 12", + "@types/react": ">= 16", + "react": ">= 16.14" + }, + "peerDependenciesMeta": { + "@types/hoist-non-react-statics": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@types/react": { + "optional": true + } } }, - "node_modules/react-dev-utils/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "node_modules/react-dnd-html5-backend": { + "version": "14.0.0", + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" + "dnd-core": "14.0.0" } }, "node_modules/react-dom": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", - "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "version": "17.0.2", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-error-boundary": { + "version": "3.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "react": ">=16.13.1" } }, "node_modules/react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + "version": "6.0.10", + "license": "MIT" + }, + "node_modules/react-fast-compare": { + "version": "3.2.0", + "license": "MIT" }, "node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "license": "MIT" }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + "license": "MIT" }, - "node_modules/react-nouislider": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/react-nouislider/-/react-nouislider-2.0.1.tgz", - "integrity": "sha512-/K5cHKkvsvZ/fwgFATxkORAEtuiWVrQOqNchEInRn7qlv9mDh+LEq+NydFu91v7Cy2XjHzVPD9ZU12wg5t9yCg==", + "node_modules/react-modal": { + "version": "3.14.4", + "license": "MIT", "dependencies": { - "nouislider": "^9.2.0" + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17" } }, - "node_modules/react-overlays": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-4.1.0.tgz", - "integrity": "sha512-vdRpnKe0ckWOOD9uWdqykLUPHLPndIiUV7XfEKsi5008xiyHCfL8bxsx4LbMrfnxW1LzRthLyfy50XYRFNQqqw==", + "node_modules/react-popper": { + "version": "2.2.5", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.4.5", + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { "@popperjs/core": "^2.0.0", - "@restart/hooks": "^0.3.12", - "@types/warning": "^3.0.0", - "dom-helpers": "^5.1.0", - "prop-types": "^15.7.2", - "uncontrollable": "^7.0.0", - "warning": "^4.0.3" + "react": "^16.8.0 || ^17" } }, "node_modules/react-redux": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-6.0.1.tgz", - "integrity": "sha512-T52I52Kxhbqy/6TEfBv85rQSDz6+Y28V/pf52vDWs1YRXG19mcFOGfHnY2HsNFHyhP+ST34Aih98fvt6tqwVcQ==", + "version": "7.2.4", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.3.1", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.2.4", + "@babel/runtime": "^7.12.1", + "@types/react-redux": "^7.1.16", + "hoist-non-react-statics": "^3.3.2", "loose-envify": "^1.4.0", "prop-types": "^15.7.2", - "react-is": "^16.8.2" + "react-is": "^16.13.1" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } } }, "node_modules/react-refresh": { "version": "0.8.3", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", - "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-scripts": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz", - "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==", + "license": "MIT", "dependencies": { "@babel/core": "7.12.3", "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", @@ -17494,146 +17597,356 @@ "react-scripts": "bin/react-scripts.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.1.3" + "node": "^10.12.0 || >=12.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.1.3" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/@babel/core": { + "version": "7.12.3", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/react-scripts/node_modules/@babel/core/node_modules/semver": { + "version": "5.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/react-scripts/node_modules/@jest/core": { + "version": "26.6.3", + "license": "MIT", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/react-scripts/node_modules/@jest/core/node_modules/jest-resolve": { + "version": "26.6.2", + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/react-scripts/node_modules/@jest/reporters": { + "version": "26.6.2", + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" + } + }, + "node_modules/react-scripts/node_modules/@jest/reporters/node_modules/jest-resolve": { + "version": "26.6.2", + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/react-scripts/node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-scripts/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-scripts/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/react-scripts/node_modules/cliui": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/react-scripts/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/react-scripts/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/react-scripts/node_modules/execa": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" }, - "peerDependencies": { - "react": ">= 16", - "typescript": "^3.2.1 || ^4" + "engines": { + "node": ">=10" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/react-scripts/node_modules/@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "node_modules/react-scripts/node_modules/get-stream": { + "version": "5.2.0", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "pump": "^3.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-scripts/node_modules/@babel/core/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "node_modules/react-scripts/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/react-scripts/node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", - "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==", + "node_modules/react-scripts/node_modules/human-signals": { + "version": "1.1.1", + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/react-scripts/node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "license": "BSD-3-Clause", "dependencies": { - "ansi-html": "^0.0.7", - "error-stack-parser": "^2.0.6", - "html-entities": "^1.2.1", - "native-url": "^0.2.6", - "schema-utils": "^2.6.5", - "source-map": "^0.7.3" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" }, "engines": { - "node": ">= 10.x" + "node": ">=8" + } + }, + "node_modules/react-scripts/node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/react-scripts/node_modules/jest": { + "version": "26.6.0", + "license": "MIT", + "dependencies": { + "@jest/core": "^26.6.0", + "import-local": "^3.0.2", + "jest-cli": "^26.6.0" }, - "peerDependencies": { - "@types/webpack": "4.x", - "react-refresh": ">=0.8.3 <0.10.0", - "sockjs-client": "^1.4.0", - "type-fest": "^0.13.1", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" + "bin": { + "jest": "bin/jest.js" }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/react-scripts/node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "node_modules/react-scripts/node_modules/jest-changed-files": { + "version": "26.6.2", + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, "engines": { - "node": ">= 8" + "node": ">= 10.14.2" } }, - "node_modules/react-scripts/node_modules/resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "node_modules/react-scripts/node_modules/jest-resolve-dependencies": { + "version": "26.6.3", + "license": "MIT", "dependencies": { - "is-core-module": "^2.0.0", - "path-parse": "^1.0.6" + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 10.14.2" } }, - "node_modules/react-scripts/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "node_modules/react-scripts/node_modules/jest/node_modules/jest-cli": { + "version": "26.6.3", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" }, - "engines": { - "node": ">= 8.9.0" + "bin": { + "jest": "bin/jest.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "engines": { + "node": ">= 10.14.2" } }, "node_modules/react-scripts/node_modules/semver": { "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -17641,139 +17954,141 @@ "node": ">=10" } }, - "node_modules/react-scripts/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "node_modules/react-scripts/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "node_modules/react-scripts/node_modules/v8-to-istanbul": { + "version": "7.1.2", + "license": "ISC", "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" }, "engines": { - "node": ">=4" + "node": ">=10.10.0" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dependencies": { - "locate-path": "^2.0.0" - }, + "node_modules/react-scripts/node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "license": "BSD-3-Clause", "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "node_modules/react-scripts/node_modules/wrap-ansi": { + "version": "6.2.0", + "license": "MIT", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/react-scripts/node_modules/y18n": { + "version": "4.0.3", + "license": "ISC" + }, + "node_modules/react-scripts/node_modules/yargs": { + "version": "15.4.1", + "license": "MIT", "dependencies": { - "p-try": "^1.0.0" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "node_modules/react-scripts/node_modules/yargs-parser": { + "version": "18.1.3", + "license": "ISC", "dependencies": { - "p-limit": "^1.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "node_modules/react-scripts/node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.2", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" } }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "node_modules/read-pkg": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "node_modules/read-pkg-up": { + "version": "7.0.1", + "license": "MIT", "dependencies": { - "pify": "^3.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/readable-stream": { "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -17785,9 +18100,8 @@ } }, "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "license": "MIT", "optional": true, "dependencies": { "picomatch": "^2.2.1" @@ -17798,8 +18112,7 @@ }, "node_modules/recursive-readdir": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "license": "MIT", "dependencies": { "minimatch": "3.0.4" }, @@ -17807,48 +18120,53 @@ "node": ">=0.10.0" } }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "version": "4.1.0", + "license": "MIT", "dependencies": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" + "@babel/runtime": "^7.9.2" } }, "node_modules/regenerate": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "version": "10.0.1", + "license": "MIT", "dependencies": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" }, "engines": { "node": ">=4" } }, "node_modules/regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.13.9", + "license": "MIT" }, "node_modules/regenerator-transform": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regex-not": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "license": "MIT", "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -17859,13 +18177,11 @@ }, "node_modules/regex-parser": { "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + "license": "MIT" }, "node_modules/regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "version": "1.4.1", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -17878,9 +18194,8 @@ } }, "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "license": "MIT", "engines": { "node": ">=8" }, @@ -17889,30 +18204,27 @@ } }, "node_modules/regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "version": "5.0.1", + "license": "MIT", "dependencies": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + "version": "0.6.0", + "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "version": "0.8.4", + "license": "BSD-2-Clause", "dependencies": { "jsesc": "~0.5.0" }, @@ -17922,85 +18234,158 @@ }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "bin": { "jsesc": "bin/jsesc" } }, "node_modules/relateurl": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/remove-trailing-separator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + "license": "ISC" }, "node_modules/renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "version": "2.0.7", + "license": "MIT", "dependencies": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.2.1", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/css-what": { + "version": "5.1.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domelementtype": { + "version": "2.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/nth-check": { + "version": "2.0.1", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/repeat-element": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/repeat-string": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "license": "ISC" }, "node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "license": "MIT" }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.18.1", + "license": "MIT", "dependencies": { - "is-core-module": "^2.2.0", + "is-core-module": "^2.0.0", "path-parse": "^1.0.6" }, "funding": { @@ -18009,8 +18394,7 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -18020,30 +18404,25 @@ }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "4.0.0", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/resolve-url": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" + "license": "MIT" }, "node_modules/resolve-url-loader": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.3.tgz", - "integrity": "sha512-WbDSNFiKPPLem1ln+EVTE+bFUBdTTytfQZWbmghroaFNFaAVmGq0Saqw6F/306CwgPXsGwXVxbODE+3xAo/YbA==", + "version": "3.1.4", + "license": "MIT", "dependencies": { "adjust-sourcemap-loader": "3.0.0", "camelcase": "5.3.1", @@ -18051,7 +18430,7 @@ "convert-source-map": "1.7.0", "es6-iterator": "2.0.3", "loader-utils": "1.2.3", - "postcss": "7.0.21", + "postcss": "7.0.36", "rework": "1.0.1", "rework-visit": "1.0.0", "source-map": "0.6.1" @@ -18062,24 +18441,28 @@ }, "node_modules/resolve-url-loader/node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.7.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, "node_modules/resolve-url-loader/node_modules/emojis-list": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/resolve-url-loader/node_modules/json5": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -18089,8 +18472,7 @@ }, "node_modules/resolve-url-loader/node_modules/loader-utils": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^2.0.0", @@ -18101,9 +18483,8 @@ } }, "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "version": "7.0.36", + "license": "MIT", "dependencies": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -18111,20 +18492,22 @@ }, "engines": { "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" } }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve-url-loader/node_modules/supports-color": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -18132,26 +18515,35 @@ "node": ">=6" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ret": { "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "license": "MIT", "engines": { "node": ">=0.12" } }, "node_modules/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -18159,8 +18551,6 @@ }, "node_modules/rework": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", "dependencies": { "convert-source-map": "^0.3.3", "css": "^2.0.0" @@ -18168,39 +18558,41 @@ }, "node_modules/rework-visit": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + "license": "MIT" }, "node_modules/rework/node_modules/convert-source-map": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + "license": "MIT" + }, + "node_modules/rfdc": { + "version": "1.3.0", + "dev": true, + "license": "MIT" }, "node_modules/rgb-regex": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + "license": "MIT" }, "node_modules/rgba-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + "license": "MIT" }, "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ripemd160": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -18208,8 +18600,7 @@ }, "node_modules/rollup": { "version": "1.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", - "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/node": "*", @@ -18221,9 +18612,7 @@ }, "node_modules/rollup-plugin-babel": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", - "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel.", + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.0.0", "rollup-pluginutils": "^2.8.1" @@ -18235,8 +18624,7 @@ }, "node_modules/rollup-plugin-terser": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", - "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.5.5", "jest-worker": "^24.9.0", @@ -18250,8 +18638,7 @@ }, "node_modules/rollup-plugin-terser/node_modules/jest-worker": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "license": "MIT", "dependencies": { "merge-stream": "^2.0.0", "supports-color": "^6.1.0" @@ -18262,16 +18649,14 @@ }, "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/rollup-plugin-terser/node_modules/supports-color": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -18281,29 +18666,24 @@ }, "node_modules/rollup-pluginutils": { "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "license": "MIT", "dependencies": { "estree-walker": "^0.6.1" } }, "node_modules/rollup-pluginutils/node_modules/estree-walker": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + "license": "MIT" }, "node_modules/rsvp": { "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "license": "MIT", "engines": { "node": "6.* || >= 7.*" } }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -18318,52 +18698,49 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/run-queue": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "license": "ISC", "dependencies": { "aproba": "^1.1.1" } }, "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "version": "7.5.4", "dev": true, + "license": "Apache-2.0", "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" + "tslib": "^2.1.0" } }, + "node_modules/rxjs/node_modules/tslib": { + "version": "2.3.1", + "dev": true, + "license": "0BSD" + }, "node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "license": "MIT" }, "node_modules/safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "license": "MIT", "dependencies": { "ret": "~0.1.10" } }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "license": "MIT" }, "node_modules/sane": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "license": "MIT", "dependencies": { "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", @@ -18384,8 +18761,7 @@ }, "node_modules/sane/node_modules/anymatch": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "license": "ISC", "dependencies": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -18393,8 +18769,7 @@ }, "node_modules/sane/node_modules/braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "license": "MIT", "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -18413,8 +18788,7 @@ }, "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -18424,8 +18798,7 @@ }, "node_modules/sane/node_modules/cross-spawn": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -18439,8 +18812,7 @@ }, "node_modules/sane/node_modules/execa": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "license": "MIT", "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -18456,8 +18828,7 @@ }, "node_modules/sane/node_modules/fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -18470,8 +18841,7 @@ }, "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -18481,8 +18851,7 @@ }, "node_modules/sane/node_modules/get-stream": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -18490,18 +18859,9 @@ "node": ">=6" } }, - "node_modules/sane/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sane/node_modules/is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -18511,8 +18871,7 @@ }, "node_modules/sane/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -18522,16 +18881,14 @@ }, "node_modules/sane/node_modules/is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "license": "MIT", "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -18553,8 +18910,7 @@ }, "node_modules/sane/node_modules/normalize-path": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "license": "MIT", "dependencies": { "remove-trailing-separator": "^1.0.1" }, @@ -18564,8 +18920,7 @@ }, "node_modules/sane/node_modules/npm-run-path": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "license": "MIT", "dependencies": { "path-key": "^2.0.0" }, @@ -18575,16 +18930,21 @@ }, "node_modules/sane/node_modules/path-key": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/sane/node_modules/semver": { + "version": "5.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/sane/node_modules/shebang-command": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "license": "MIT", "dependencies": { "shebang-regex": "^1.0.0" }, @@ -18594,16 +18954,14 @@ }, "node_modules/sane/node_modules/shebang-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/sane/node_modules/to-regex-range": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "license": "MIT", "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -18614,8 +18972,7 @@ }, "node_modules/sane/node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -18625,13 +18982,11 @@ }, "node_modules/sanitize.css": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" + "license": "CC0-1.0" }, "node_modules/sass-loader": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", - "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", + "version": "10.2.1", + "license": "MIT", "dependencies": { "klona": "^2.0.4", "loader-utils": "^2.0.0", @@ -18664,25 +19019,11 @@ } } }, - "node_modules/sass-loader/node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/sass-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -18696,8 +19037,7 @@ }, "node_modules/sass-loader/node_modules/semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -18710,13 +19050,11 @@ }, "node_modules/sax": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "license": "ISC" }, "node_modules/saxes": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -18725,63 +19063,59 @@ } }, "node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "version": "0.20.2", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "2.7.1", + "license": "MIT", "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 4" + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/seedrandom": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz", - "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=" + "version": "2.4.4", + "license": "MIT" }, "node_modules/select-hose": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + "license": "MIT" }, "node_modules/selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "version": "1.10.14", + "license": "MIT", "dependencies": { "node-forge": "^0.10.0" } }, "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "license": "ISC", "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" } }, "node_modules/semver-compare": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "~1.1.2", @@ -18790,9 +19124,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -18803,34 +19137,29 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "license": "MIT" }, "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "license": "MIT" }, "node_modules/serialize-javascript": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-index": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -18846,16 +19175,14 @@ }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -18868,28 +19195,24 @@ }, "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "license": "MIT" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "license": "ISC" }, "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" }, "engines": { "node": ">= 0.8.0" @@ -18897,13 +19220,11 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "license": "ISC" }, "node_modules/set-value": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -18916,8 +19237,7 @@ }, "node_modules/set-value/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -18925,28 +19245,17 @@ "node": ">=0.10.0" } }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/setimmediate": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "license": "MIT" }, "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -18957,8 +19266,7 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -18968,27 +19276,23 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + "license": "MIT" }, "node_modules/shellwords": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "license": "MIT", "optional": true }, "node_modules/side-channel": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -19000,20 +19304,31 @@ }, "node_modules/signal-exit": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "license": "ISC" }, "node_modules/simple-concat": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "devOptional": true + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, "node_modules/simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "version": "3.1.1", "devOptional": true, + "license": "MIT", "dependencies": { "decompress-response": "^4.2.0", "once": "^1.3.1", @@ -19022,34 +19337,72 @@ }, "node_modules/simple-swizzle": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "license": "MIT" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", "dependencies": { - "is-arrayish": "^0.3.1" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, "node_modules/snapdragon": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "license": "MIT", "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", @@ -19066,8 +19419,7 @@ }, "node_modules/snapdragon-node": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "license": "MIT", "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -19079,8 +19431,7 @@ }, "node_modules/snapdragon-node/node_modules/define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "license": "MIT", "dependencies": { "is-descriptor": "^1.0.0" }, @@ -19088,73 +19439,51 @@ "node": ">=0.10.0" } }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "is-buffer": "^1.1.5" + "kind-of": "^6.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "is-descriptor": "^0.1.0" + "kind-of": "^6.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "is-extendable": "^0.1.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "node_modules/snapdragon-util": { + "version": "3.0.1", + "license": "MIT", "dependencies": { - "kind-of": "^3.0.2" + "kind-of": "^3.2.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "node_modules/snapdragon-util/node_modules/kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -19162,105 +19491,73 @@ "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "ms": "2.0.0" } }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "license": "MIT", "dependencies": { - "is-buffer": "^1.1.5" + "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-extendable": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/snapdragon/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "license": "MIT" }, "node_modules/sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", + "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, "node_modules/sockjs-client": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", - "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "version": "1.6.0", + "license": "MIT", "dependencies": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", + "debug": "^3.2.7", + "eventsource": "^1.1.0", + "faye-websocket": "^0.11.4", "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.1" + "url-parse": "^1.5.10" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://tidelift.com/funding/github/npm/sockjs-client" } }, "node_modules/sockjs-client/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, - "node_modules/sockjs/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/sort-keys": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "license": "MIT", "dependencies": { "is-plain-obj": "^1.0.0" }, @@ -19270,29 +19567,25 @@ }, "node_modules/source-list-map": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + "license": "MIT" }, "node_modules/source-map": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "version": "1.0.2", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-resolve": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "license": "MIT", "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", @@ -19302,9 +19595,8 @@ } }, "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -19312,26 +19604,22 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-url": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + "license": "MIT" }, "node_modules/sourcemap-codec": { "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + "license": "MIT" }, "node_modules/spdx-correct": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -19339,27 +19627,23 @@ }, "node_modules/spdx-exceptions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + "version": "3.0.11", + "license": "CC0-1.0" }, "node_modules/spdy": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -19373,8 +19657,7 @@ }, "node_modules/spdy-transport": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -19386,8 +19669,7 @@ }, "node_modules/spdy-transport/node_modules/readable-stream": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -19399,8 +19681,7 @@ }, "node_modules/split-string": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "license": "MIT", "dependencies": { "extend-shallow": "^3.0.0" }, @@ -19410,13 +19691,11 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "license": "BSD-3-Clause" }, "node_modules/ssri": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "license": "ISC", "dependencies": { "minipass": "^3.1.1" }, @@ -19424,31 +19703,13 @@ "node": ">= 8" } }, - "node_modules/ssri/node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ssri/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/stable": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + "license": "MIT" }, "node_modules/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "version": "2.0.5", + "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -19458,21 +19719,18 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + "version": "1.2.1", + "license": "MIT" }, "node_modules/static-extend": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "license": "MIT", "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -19483,8 +19741,7 @@ }, "node_modules/static-extend/node_modules/define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "license": "MIT", "dependencies": { "is-descriptor": "^0.1.0" }, @@ -19492,83 +19749,16 @@ "node": ">=0.10.0" } }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/stream-browserify": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "license": "MIT", "dependencies": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" @@ -19576,8 +19766,7 @@ }, "node_modules/stream-each": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -19585,8 +19774,7 @@ }, "node_modules/stream-http": { "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "license": "MIT", "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", @@ -19597,38 +19785,33 @@ }, "node_modules/stream-shift": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + "license": "MIT" }, "node_modules/strict-uri-encode": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/string-argv": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.19" } }, "node_modules/string-length": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -19637,52 +19820,29 @@ "node": ">=10" } }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string-natural-compare": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + "license": "MIT" }, "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "devOptional": true, + "version": "4.2.2", + "license": "MIT", "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/string.prototype.matchall": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", - "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "version": "4.0.6", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.2", + "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", "has-symbols": "^1.0.2", "internal-slot": "^1.0.3", @@ -19695,8 +19855,7 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -19707,8 +19866,7 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -19719,8 +19877,7 @@ }, "node_modules/stringify-object": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -19730,37 +19887,26 @@ "node": ">=4" } }, - "node_modules/stringify-object/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.0", + "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "version": "3.0.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/strip-comments": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "license": "MIT", "dependencies": { "babel-extract-comments": "^1.0.0", "babel-plugin-transform-object-rest-spread": "^6.26.0" @@ -19771,69 +19917,45 @@ }, "node_modules/strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/style-loader": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", - "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", + "node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.7.0" + "min-indent": "^1.0.0" }, "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "node": ">=8" } }, - "node_modules/style-loader/node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "license": "MIT", "engines": { - "node": ">=8.9.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/style-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "node_modules/style-loader": { + "version": "1.3.0", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" }, "engines": { "node": ">= 8.9.0" @@ -19841,12 +19963,14 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/stylehacks": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "postcss": "^7.0.0", @@ -19858,8 +19982,7 @@ }, "node_modules/stylehacks/node_modules/postcss-selector-parser": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "license": "MIT", "dependencies": { "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", @@ -19869,10 +19992,13 @@ "node": ">=8" } }, + "node_modules/stylis": { + "version": "4.0.13", + "license": "MIT" + }, "node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -19882,8 +20008,7 @@ }, "node_modules/supports-hyperlinks": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -19894,16 +20019,14 @@ }, "node_modules/supports-hyperlinks/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/supports-hyperlinks/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -19911,15 +20034,23 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/svg-parser": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + "license": "MIT" }, "node_modules/svgo": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "license": "MIT", "dependencies": { "chalk": "^2.4.1", "coa": "^2.0.2", @@ -19942,57 +20073,192 @@ "node": ">=4.0.0" } }, - "node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "node_modules/symbol-tree": { + "version": "3.2.4", + "license": "MIT" + }, + "node_modules/table": { + "version": "6.8.0", + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + "node_modules/table/node_modules/ajv": { + "version": "8.10.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/table/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/table/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/tapable": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "devOptional": true, + "version": "6.1.11", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar-fs": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "dependencies": { "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "mkdirp": "^0.5.1", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "dev": true, + "license": "ISC" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" }, "engines": { - "node": ">=4.5" + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/temp-dir": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tempy": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", - "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "license": "MIT", "dependencies": { "temp-dir": "^1.0.0", "type-fest": "^0.3.1", @@ -20004,16 +20270,14 @@ }, "node_modules/tempy/node_modules/type-fest": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=6" } }, "node_modules/terminal-link": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -20027,8 +20291,7 @@ }, "node_modules/terser": { "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "license": "BSD-2-Clause", "dependencies": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -20043,8 +20306,7 @@ }, "node_modules/terser-webpack-plugin": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "license": "MIT", "dependencies": { "cacache": "^15.0.5", "find-cache-dir": "^3.3.1", @@ -20067,15 +20329,23 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/terser-webpack-plugin/node_modules/acorn": { + "version": "8.7.0", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/terser-webpack-plugin/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "license": "MIT" }, "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -20088,24 +20358,9 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/terser-webpack-plugin/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/terser-webpack-plugin/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -20118,8 +20373,7 @@ }, "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -20128,11 +20382,10 @@ } }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -20144,30 +20397,21 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/terser-webpack-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/terser-webpack-plugin/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", - "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==", + "version": "5.11.0", + "license": "BSD-2-Clause", "dependencies": { + "acorn": "^8.5.0", "commander": "^2.20.0", "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" @@ -20178,29 +20422,25 @@ }, "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": { "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "license": "MIT" }, "node_modules/terser/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -20212,29 +20452,24 @@ }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "license": "MIT" }, "node_modules/three": { "version": "0.101.1", - "resolved": "https://registry.npmjs.org/three/-/three-0.101.1.tgz", - "integrity": "sha512-8ufimUVmRLtH+BTpEIbDjdGEKQOVWLMLgGynaKin1KbYTE136ZNOepJ8EgByi0tN43dQ7B1YrKLCJgXGy4bLmw==" + "license": "MIT" }, "node_modules/throat": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + "license": "MIT" }, "node_modules/through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/through2": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -20242,13 +20477,11 @@ }, "node_modules/thunky": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + "license": "MIT" }, "node_modules/timers-browserify": { "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "license": "MIT", "dependencies": { "setimmediate": "^1.0.4" }, @@ -20258,31 +20491,26 @@ }, "node_modules/timsort": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + "license": "MIT" }, "node_modules/tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + "version": "1.0.5", + "license": "BSD-3-Clause" }, "node_modules/to-arraybuffer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + "license": "MIT" }, "node_modules/to-fast-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/to-object-path": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -20292,8 +20520,7 @@ }, "node_modules/to-object-path/node_modules/kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -20303,8 +20530,7 @@ }, "node_modules/to-regex": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "license": "MIT", "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -20317,8 +20543,7 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -20327,17 +20552,15 @@ } }, "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/tough-cookie": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -20349,16 +20572,14 @@ }, "node_modules/tough-cookie/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/tr46": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "license": "MIT", "dependencies": { "punycode": "^2.1.1" }, @@ -20368,13 +20589,11 @@ }, "node_modules/tryer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + "license": "MIT" }, "node_modules/ts-pnp": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -20385,9 +20604,8 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "version": "3.12.0", + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.1", @@ -20397,8 +20615,7 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -20406,23 +20623,13 @@ "json5": "lib/cli.js" } }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + "version": "1.14.1", + "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -20435,20 +20642,17 @@ }, "node_modules/tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + "license": "MIT" }, "node_modules/type": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + "license": "ISC" }, "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" @@ -20456,27 +20660,21 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.8.1", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -20487,34 +20685,18 @@ }, "node_modules/typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "license": "MIT" }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", - "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/unbox-primitive": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "has-bigints": "^1.0.1", @@ -20525,62 +20707,73 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/uncontrollable": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.1.1.tgz", - "integrity": "sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q==", + "node_modules/unbzip2-stream": { + "version": "1.3.3", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.6.3", - "@types/react": "^16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" + "buffer": "^5.2.1", + "through": "^2.3.8" } }, - "node_modules/underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "version": "2.0.0", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "version": "2.0.0", + "license": "MIT", "dependencies": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "version": "2.0.0", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "version": "2.0.0", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/union-value": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "license": "MIT", "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -20591,44 +20784,31 @@ "node": ">=0.10.0" } }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/uniq": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + "license": "MIT" }, "node_modules/uniqs": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + "license": "MIT" }, "node_modules/unique-filename": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "license": "ISC", "dependencies": { "unique-slug": "^2.0.0" } }, "node_modules/unique-slug": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" } }, "node_modules/unique-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "license": "MIT", "dependencies": { "crypto-random-string": "^1.0.0" }, @@ -20638,29 +20818,25 @@ }, "node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/unquote": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + "license": "MIT" }, "node_modules/unset-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "license": "MIT", "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -20671,8 +20847,7 @@ }, "node_modules/unset-value/node_modules/has-value": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "license": "MIT", "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -20684,8 +20859,7 @@ }, "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "license": "MIT", "dependencies": { "isarray": "1.0.0" }, @@ -20695,39 +20869,33 @@ }, "node_modules/unset-value/node_modules/has-values": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/upath": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "license": "MIT", "engines": { "node": ">=4", "yarn": "*" } }, "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/urix": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated" + "license": "MIT" }, "node_modules/url": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "license": "MIT", "dependencies": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -20735,8 +20903,7 @@ }, "node_modules/url-loader": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", @@ -20759,25 +20926,11 @@ } } }, - "node_modules/url-loader/node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -20790,9 +20943,8 @@ } }, "node_modules/url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.10", + "license": "MIT", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -20800,96 +20952,74 @@ }, "node_modules/url/node_modules/punycode": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "license": "MIT" + }, + "node_modules/url/node_modules/querystring": { + "version": "0.2.0", + "engines": { + "node": ">=0.4.x" + } }, "node_modules/use": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/util": { "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "license": "MIT", "dependencies": { "inherits": "2.0.3" } }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "license": "MIT" }, "node_modules/util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "version": "1.0.1", + "license": "MIT", "dependencies": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/util/node_modules/inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "license": "ISC" }, "node_modules/utila": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true, + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - }, - "node_modules/v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } + "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -20897,16 +21027,14 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vendors": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -20914,21 +21042,18 @@ }, "node_modules/vm-browserify": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + "license": "MIT" }, "node_modules/w3c-hr-time": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "license": "MIT", "dependencies": { "browser-process-hrtime": "^1.0.0" } }, "node_modules/w3c-xmlserializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "license": "MIT", "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -20937,25 +21062,22 @@ } }, "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "version": "1.0.8", + "license": "Apache-2.0", "dependencies": { - "makeerror": "1.0.x" + "makeerror": "1.0.12" } }, "node_modules/warning": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } }, "node_modules/watchpack": { "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" @@ -20967,8 +21089,7 @@ }, "node_modules/watchpack-chokidar2": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "license": "MIT", "optional": true, "dependencies": { "chokidar": "^2.1.8" @@ -20976,8 +21097,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/anymatch": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "license": "ISC", "optional": true, "dependencies": { "micromatch": "^3.1.4", @@ -20986,8 +21106,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "license": "MIT", "optional": true, "dependencies": { "remove-trailing-separator": "^1.0.1" @@ -20998,8 +21117,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "license": "MIT", "optional": true, "engines": { "node": ">=0.10.0" @@ -21007,8 +21125,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "license": "MIT", "optional": true, "dependencies": { "arr-flatten": "^1.1.0", @@ -21028,8 +21145,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "optional": true, "dependencies": { "is-extendable": "^0.1.0" @@ -21040,9 +21156,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/chokidar": { "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "license": "MIT", "optional": true, "dependencies": { "anymatch": "^2.0.0", @@ -21063,8 +21177,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "license": "MIT", "optional": true, "dependencies": { "extend-shallow": "^2.0.1", @@ -21078,8 +21191,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "optional": true, "dependencies": { "is-extendable": "^0.1.0" @@ -21108,8 +21220,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/glob-parent": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "license": "ISC", "optional": true, "dependencies": { "is-glob": "^3.1.0", @@ -21118,8 +21229,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "license": "MIT", "optional": true, "dependencies": { "is-extglob": "^2.1.0" @@ -21130,8 +21240,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "license": "MIT", "optional": true, "dependencies": { "binary-extensions": "^1.0.0" @@ -21140,19 +21249,9 @@ "node": ">=0.10.0" } }, - "node_modules/watchpack-chokidar2/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/watchpack-chokidar2/node_modules/is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "license": "MIT", "optional": true, "dependencies": { "kind-of": "^3.0.2" @@ -21163,8 +21262,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "license": "MIT", "optional": true, "dependencies": { "is-buffer": "^1.1.5" @@ -21175,8 +21273,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "license": "MIT", "optional": true, "dependencies": { "arr-diff": "^4.0.0", @@ -21199,8 +21296,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/readdirp": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "license": "MIT", "optional": true, "dependencies": { "graceful-fs": "^4.1.11", @@ -21213,8 +21309,7 @@ }, "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "license": "MIT", "optional": true, "dependencies": { "is-number": "^3.0.0", @@ -21226,24 +21321,21 @@ }, "node_modules/wbuf": { "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } }, "node_modules/webidl-conversions": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "license": "BSD-2-Clause", "engines": { "node": ">=10.4" } }, "node_modules/webpack": { "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -21290,8 +21382,7 @@ }, "node_modules/webpack-dev-middleware": { "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "license": "MIT", "dependencies": { "memory-fs": "^0.4.1", "mime": "^2.4.4", @@ -21307,9 +21398,8 @@ } }, "node_modules/webpack-dev-middleware/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "version": "2.6.0", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -21319,8 +21409,7 @@ }, "node_modules/webpack-dev-server": { "version": "3.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", - "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", + "license": "MIT", "dependencies": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -21372,17 +21461,15 @@ } }, "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "2.1.1", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, "node_modules/webpack-dev-server/node_modules/anymatch": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "license": "ISC", "dependencies": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -21390,8 +21477,7 @@ }, "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "license": "MIT", "dependencies": { "remove-trailing-separator": "^1.0.1" }, @@ -21401,16 +21487,14 @@ }, "node_modules/webpack-dev-server/node_modules/binary-extensions": { "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/webpack-dev-server/node_modules/braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "license": "MIT", "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -21429,8 +21513,7 @@ }, "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -21440,17 +21523,14 @@ }, "node_modules/webpack-dev-server/node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/webpack-dev-server/node_modules/chokidar": { "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "license": "MIT", "dependencies": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -21470,18 +21550,23 @@ }, "node_modules/webpack-dev-server/node_modules/cliui": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "license": "ISC", "dependencies": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" } }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", "dependencies": { "ansi-regex": "^4.1.0" }, @@ -21491,13 +21576,11 @@ }, "node_modules/webpack-dev-server/node_modules/emoji-regex": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "license": "MIT" }, "node_modules/webpack-dev-server/node_modules/fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -21510,8 +21593,7 @@ }, "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -21521,8 +21603,7 @@ }, "node_modules/webpack-dev-server/node_modules/find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", "dependencies": { "locate-path": "^3.0.0" }, @@ -21550,8 +21631,7 @@ }, "node_modules/webpack-dev-server/node_modules/glob-parent": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "license": "ISC", "dependencies": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -21559,8 +21639,7 @@ }, "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.0" }, @@ -21570,8 +21649,7 @@ }, "node_modules/webpack-dev-server/node_modules/import-local": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "license": "MIT", "dependencies": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" @@ -21585,16 +21663,14 @@ }, "node_modules/webpack-dev-server/node_modules/is-absolute-url": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/webpack-dev-server/node_modules/is-binary-path": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "license": "MIT", "dependencies": { "binary-extensions": "^1.0.0" }, @@ -21602,26 +21678,16 @@ "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/webpack-dev-server/node_modules/is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -21631,8 +21697,7 @@ }, "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -21642,8 +21707,7 @@ }, "node_modules/webpack-dev-server/node_modules/locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -21654,8 +21718,7 @@ }, "node_modules/webpack-dev-server/node_modules/micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "license": "MIT", "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -21677,8 +21740,7 @@ }, "node_modules/webpack-dev-server/node_modules/p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", "dependencies": { "p-limit": "^2.0.0" }, @@ -21688,27 +21750,14 @@ }, "node_modules/webpack-dev-server/node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/webpack-dev-server/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/webpack-dev-server/node_modules/readdirp": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -21720,8 +21769,7 @@ }, "node_modules/webpack-dev-server/node_modules/resolve-cwd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "license": "MIT", "dependencies": { "resolve-from": "^3.0.0" }, @@ -21729,18 +21777,28 @@ "node": ">=4" } }, - "node_modules/webpack-dev-server/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node_modules/webpack-dev-server/node_modules/resolve-from": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" } }, "node_modules/webpack-dev-server/node_modules/string-width": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "license": "MIT", "dependencies": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -21750,10 +21808,16 @@ "node": ">=6" } }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", "dependencies": { "ansi-regex": "^4.1.0" }, @@ -21761,10 +21825,19 @@ "node": ">=6" } }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/webpack-dev-server/node_modules/supports-color": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -21774,8 +21847,7 @@ }, "node_modules/webpack-dev-server/node_modules/to-regex-range": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "license": "MIT", "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -21786,8 +21858,7 @@ }, "node_modules/webpack-dev-server/node_modules/wrap-ansi": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", @@ -21797,10 +21868,16 @@ "node": ">=6" } }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", "dependencies": { "ansi-regex": "^4.1.0" }, @@ -21809,17 +21886,19 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "license": "MIT", "dependencies": { "async-limiter": "~1.0.0" } }, + "node_modules/webpack-dev-server/node_modules/y18n": { + "version": "4.0.3", + "license": "ISC" + }, "node_modules/webpack-dev-server/node_modules/yargs": { "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "license": "MIT", "dependencies": { "cliui": "^5.0.0", "find-up": "^3.0.0", @@ -21835,8 +21914,7 @@ }, "node_modules/webpack-dev-server/node_modules/yargs-parser": { "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "license": "ISC", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -21844,8 +21922,7 @@ }, "node_modules/webpack-log": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "license": "MIT", "dependencies": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" @@ -21856,24 +21933,21 @@ }, "node_modules/webpack-log/node_modules/ansi-colors": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/webpack-log/node_modules/uuid": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "license": "MIT", "bin": { "uuid": "bin/uuid" } }, "node_modules/webpack-manifest-plugin": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", - "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", + "license": "MIT", "dependencies": { "fs-extra": "^7.0.0", "lodash": ">=3.5 <5", @@ -21889,8 +21963,7 @@ }, "node_modules/webpack-manifest-plugin/node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -21902,24 +21975,21 @@ }, "node_modules/webpack-manifest-plugin/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/webpack-manifest-plugin/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/webpack-sources": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "license": "MIT", "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -21927,16 +21997,14 @@ }, "node_modules/webpack-sources/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/webpack/node_modules/acorn": { "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -21946,8 +22014,7 @@ }, "node_modules/webpack/node_modules/braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "license": "MIT", "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -21966,8 +22033,7 @@ }, "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -21977,8 +22043,7 @@ }, "node_modules/webpack/node_modules/cacache": { "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "license": "ISC", "dependencies": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -21997,10 +22062,13 @@ "y18n": "^4.0.0" } }, + "node_modules/webpack/node_modules/chownr": { + "version": "1.1.4", + "license": "ISC" + }, "node_modules/webpack/node_modules/eslint-scope": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -22011,8 +22079,7 @@ }, "node_modules/webpack/node_modules/fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -22025,8 +22092,7 @@ }, "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -22034,18 +22100,9 @@ "node": ">=0.10.0" } }, - "node_modules/webpack/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webpack/node_modules/is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -22055,8 +22112,7 @@ }, "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -22066,24 +22122,43 @@ }, "node_modules/webpack/node_modules/is-wsl": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/webpack/node_modules/json5": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack/node_modules/loader-utils": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/webpack/node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/webpack/node_modules/micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "license": "MIT", "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -22103,34 +22178,52 @@ "node": ">=0.10.0" } }, + "node_modules/webpack/node_modules/rimraf": { + "version": "2.7.1", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/webpack/node_modules/serialize-javascript": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/webpack/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/webpack/node_modules/ssri": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "license": "ISC", "dependencies": { "figgy-pudding": "^3.5.1" } }, "node_modules/webpack/node_modules/terser-webpack-plugin": { "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "license": "MIT", "dependencies": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -22151,8 +22244,7 @@ }, "node_modules/webpack/node_modules/to-regex-range": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "license": "MIT", "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -22161,10 +22253,17 @@ "node": ">=0.10.0" } }, + "node_modules/webpack/node_modules/y18n": { + "version": "4.0.3", + "license": "ISC" + }, + "node_modules/webpack/node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, "node_modules/websocket-driver": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -22176,37 +22275,32 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } }, "node_modules/whatwg-encoding": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "license": "MIT", "dependencies": { "iconv-lite": "0.4.24" } }, "node_modules/whatwg-fetch": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + "license": "MIT" }, "node_modules/whatwg-mimetype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + "license": "MIT" }, "node_modules/whatwg-url": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", - "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", + "version": "8.7.0", + "license": "MIT", "dependencies": { "lodash": "^4.7.0", - "tr46": "^2.0.2", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" }, "engines": { @@ -22215,8 +22309,7 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -22229,8 +22322,7 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -22244,46 +22336,40 @@ }, "node_modules/which-module": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "license": "ISC" }, "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "version": "1.1.5", "devOptional": true, + "license": "ISC", "dependencies": { - "string-width": "^1.0.2 || 2" + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/word-wrap": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/workbox-background-sync": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", - "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", + "license": "MIT", "dependencies": { "workbox-core": "^5.1.4" } }, "node_modules/workbox-broadcast-update": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", - "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", + "license": "MIT", "dependencies": { "workbox-core": "^5.1.4" } }, "node_modules/workbox-build": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", - "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", + "license": "MIT", "dependencies": { "@babel/core": "^7.8.4", "@babel/preset-env": "^7.8.4", @@ -22328,8 +22414,7 @@ }, "node_modules/workbox-build/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -22341,53 +22426,46 @@ }, "node_modules/workbox-build/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/workbox-build/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/workbox-cacheable-response": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", - "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", + "license": "MIT", "dependencies": { "workbox-core": "^5.1.4" } }, "node_modules/workbox-core": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", - "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" + "license": "MIT" }, "node_modules/workbox-expiration": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", - "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", + "license": "MIT", "dependencies": { "workbox-core": "^5.1.4" } }, "node_modules/workbox-google-analytics": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", - "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", + "license": "MIT", "dependencies": { "workbox-background-sync": "^5.1.4", "workbox-core": "^5.1.4", @@ -22397,40 +22475,35 @@ }, "node_modules/workbox-navigation-preload": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", - "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", + "license": "MIT", "dependencies": { "workbox-core": "^5.1.4" } }, "node_modules/workbox-precaching": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", - "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", + "license": "MIT", "dependencies": { "workbox-core": "^5.1.4" } }, "node_modules/workbox-range-requests": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", - "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", + "license": "MIT", "dependencies": { "workbox-core": "^5.1.4" } }, "node_modules/workbox-routing": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", - "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", + "license": "MIT", "dependencies": { "workbox-core": "^5.1.4" } }, "node_modules/workbox-strategies": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", - "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", + "license": "MIT", "dependencies": { "workbox-core": "^5.1.4", "workbox-routing": "^5.1.4" @@ -22438,8 +22511,7 @@ }, "node_modules/workbox-streams": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", - "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", + "license": "MIT", "dependencies": { "workbox-core": "^5.1.4", "workbox-routing": "^5.1.4" @@ -22447,13 +22519,11 @@ }, "node_modules/workbox-sw": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", - "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" + "license": "MIT" }, "node_modules/workbox-webpack-plugin": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", - "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.5.5", "fast-json-stable-stringify": "^2.0.0", @@ -22471,53 +22541,43 @@ }, "node_modules/workbox-window": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", - "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", + "license": "MIT", "dependencies": { "workbox-core": "^5.1.4" } }, "node_modules/worker-farm": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "license": "MIT", "dependencies": { "errno": "~0.1.7" } }, "node_modules/worker-rpc": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "license": "MIT", "dependencies": { "microevent.ts": "~0.1.1" } }, "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -22530,8 +22590,7 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -22541,55 +22600,15 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -22598,9 +22617,8 @@ } }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "7.5.7", + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -22619,130 +22637,72 @@ }, "node_modules/xml-name-validator": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "license": "Apache-2.0" }, "node_modules/xmlchars": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + "license": "MIT" }, "node_modules/xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", "engines": { "node": ">=0.4" } }, "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" + } }, "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "4.0.0", + "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "license": "MIT", "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, + "version": "20.2.9", + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -22752,31 +22712,29 @@ }, "node_modules/zlib": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz", - "integrity": "sha1-bnyXL8NxxkWmr7A6sUdp3vEU/MA=", "engines": { "node": ">=0.2.0" } } }, "dependencies": { + "@ampproject/remapping": { + "version": "2.1.2", + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } + }, "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.14.5", "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.14.5" } }, "@babel/compat-data": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", - "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==" + "version": "7.17.0" }, "@babel/core": { "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz", - "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==", "requires": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.14.3", @@ -22793,94 +22751,83 @@ "json5": "^2.1.2", "semver": "^6.3.0", "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } } }, "@babel/generator": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", - "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", + "version": "7.14.8", "requires": { - "@babel/types": "^7.14.2", + "@babel/types": "^7.14.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "version": "7.16.7", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "version": "7.16.7", "requires": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-compilation-targets": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", - "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", + "version": "7.16.7", "requires": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.3.tgz", - "integrity": "sha512-BnEfi5+6J2Lte9LeiL6TxLWdIlEv9Woacc1qXzXBgbikcOzMRM2Oya5XGg/f/ngotv1ej2A/b+3iJH8wbS1+lQ==", + "version": "7.17.6", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.14.3", - "@babel/helper-split-export-declaration": "^7.12.13" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz", - "integrity": "sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA==", + "version": "7.17.0", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "regexpu-core": "^4.7.1" + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "version": "0.3.1", "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -22890,907 +22837,1295 @@ "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "requires": { + "@babel/types": "^7.16.7" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } } } }, "@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "version": "7.16.7", "requires": { - "@babel/types": "^7.13.0" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", + "version": "7.16.7", "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/parser": { + "version": "7.17.3" + }, + "@babel/template": { + "version": "7.16.7", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "version": "7.16.7", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-hoist-variables": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz", - "integrity": "sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==", + "version": "7.16.7", "requires": { - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.16" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "version": "7.16.7", "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "version": "7.14.5", "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.14.5" } }, "@babel/helper-module-transforms": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", - "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", - "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.14.0", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2" + "version": "7.14.8", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.8", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "version": "7.16.7", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" + "version": "7.16.7" }, "@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "version": "7.16.8", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-replace-supers": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.3.tgz", - "integrity": "sha512-Rlh8qEWZSTfdz+tgNV/N4gz1a0TMNwCUcENhMjHTHKp3LseYH5Jha0NSlyTQWMnjbYcwFt+bqAMqSLHVXkQ6UA==", + "version": "7.16.7", "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.17.3", + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/parser": { + "version": "7.17.3" + }, + "@babel/traverse": { + "version": "7.17.3", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "version": "7.16.7", "requires": { - "@babel/types": "^7.13.12" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.16.0", "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.16.7", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==" + "version": "7.14.8" }, "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" + "version": "7.16.7" }, "@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "version": "7.16.8", "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.17.3", + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/parser": { + "version": "7.17.3" + }, + "@babel/template": { + "version": "7.16.7", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helpers": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", - "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", + "version": "7.14.8", "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0" + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" } }, "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "version": "7.16.10", "requires": { - "@babel/helper-validator-identifier": "^7.14.0", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7" + } } }, "@babel/parser": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.3.tgz", - "integrity": "sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ==" + "version": "7.14.8" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", - "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.13.12" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz", - "integrity": "sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ==", + "version": "7.16.8", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "version": "7.16.7", "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz", - "integrity": "sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ==", + "version": "7.17.6", "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.3", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-class-static-block": "^7.12.13" + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-decorators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", - "integrity": "sha512-knNIuusychgYN8fGJHONL0RbFxLGawhXOJNLBk75TniTsZZeA+wdkDuv6wp4lGwzQEKjZi6/WYtnb3udNPmQmQ==", + "version": "7.17.2", "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-decorators": "^7.12.1" + "@babel/helper-create-class-features-plugin": "^7.17.1", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/plugin-syntax-decorators": "^7.17.0", + "charcodes": "^0.2.0" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz", - "integrity": "sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz", - "integrity": "sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz", - "integrity": "sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz", - "integrity": "sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz", - "integrity": "sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz", - "integrity": "sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.2.tgz", - "integrity": "sha512-hBIQFxwZi8GIp934+nj5uV31mqclC1aYDhctDu5khTi9PCCUOczyy0b34W0oE9U/eJXiqQaKyVsmjeagOaSlbw==", + "version": "7.17.3", "requires": { - "@babel/compat-data": "^7.14.0", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.2" + "@babel/plugin-transform-parameters": "^7.16.7" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz", - "integrity": "sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz", - "integrity": "sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "version": "7.16.11", "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz", - "integrity": "sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg==", + "version": "7.16.7", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-create-class-features-plugin": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-private-property-in-object": "^7.14.0" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "version": "7.16.7", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-class-static-block": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz", - "integrity": "sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A==", + "version": "7.14.5", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-decorators": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", - "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", + "version": "7.17.0", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-flow": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", - "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", - "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz", - "integrity": "sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w==", + "version": "7.14.5", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "version": "7.14.5", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-typescript": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", - "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "version": "7.16.8", "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.16.7", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.2.tgz", - "integrity": "sha512-neZZcP19NugZZqNwMTH+KoBjx5WyvESPSIOQb4JHpfd+zPfqcH65RMu5xJju5+6q/Y2VzYrleQTr+b6METyyxg==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-classes": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.2.tgz", - "integrity": "sha512-7oafAVcucHquA/VZCsXv/gmuiHeYd64UJyyTYU+MPfNu0KeNlxw06IeENBO8bJjXVbolu+j1MM5aKQtH1OMCNg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", + "version": "7.16.7", + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-destructuring": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz", - "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==", + "version": "7.17.3", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "version": "7.16.7", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "version": "7.16.7", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.12.1.tgz", - "integrity": "sha512-8hAtkmsQb36yMmEtk2JZ9JnVyDSnDOdlB+0nEGzIDLuK4yR3JcEjfuFPYkdEPSh8Id+rAMeBEn+X0iVEyho6Hg==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-flow": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-flow": "^7.16.7" } }, "@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "version": "7.16.7", "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz", - "integrity": "sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw==", + "version": "7.16.7", "requires": { - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.17.3", + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.17.6", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/parser": { + "version": "7.17.3" + }, + "@babel/template": { + "version": "7.16.7", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", - "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", + "version": "7.16.8", "requires": { - "@babel/helper-module-transforms": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.17.3", + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.17.6", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/parser": { + "version": "7.17.3" + }, + "@babel/template": { + "version": "7.16.7", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "version": "7.16.7", "requires": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.17.3", + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.17.6", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/parser": { + "version": "7.17.3" + }, + "@babel/template": { + "version": "7.16.7", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz", - "integrity": "sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw==", + "version": "7.16.7", "requires": { - "@babel/helper-module-transforms": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.17.3", + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.17.6", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/parser": { + "version": "7.17.3" + }, + "@babel/template": { + "version": "7.16.7", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "version": "7.16.8", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" } }, "@babel/plugin-transform-parameters": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", - "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.13.tgz", - "integrity": "sha512-SNJU53VM/SjQL0bZhyU+f4kJQz7bQQajnrZRSaU21hruG/NWY41AEM9AWXeXX90pYr/C2yAmTgI6yW3LlLrAUQ==", + "version": "7.17.6", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.2.tgz", - "integrity": "sha512-zCubvP+jjahpnFJvPaHPiGVfuVUjXHhFvJKQdNnsmSsiU9kR/rCZ41jHc++tERD2zV+p7Hr6is+t5b6iWTCqSw==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.3.tgz", - "integrity": "sha512-uuxuoUNVhdgYzERiHHFkE4dWoJx+UFVyuAl0aqN8P2/AKFHwqgUC5w2+4/PjpKXJsFgBlYAFXlUmDQ3k3DUkXw==", + "version": "7.17.3", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/types": "^7.14.2" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.16.7", + "@babel/types": "^7.17.0" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.16.7", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", - "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", - "requires": { - "@babel/plugin-transform-react-jsx": "^7.12.17" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", - "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.2.tgz", - "integrity": "sha512-OMorspVyjxghAjzgeAWc6O7W7vHbJhV69NeTGdl9Mxgz6PaweAuo7ffB9T5A1OQ9dGcw0As4SYMUhyNC4u7mVg==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/plugin-transform-react-jsx": "^7.16.7" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", - "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "version": "7.16.7", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-regenerator": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", - "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", + "version": "7.16.7", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", - "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "version": "7.17.0", "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.16.7", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-typescript": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.3.tgz", - "integrity": "sha512-G5Bb5pY6tJRTC4ag1visSgiDoGgJ1u1fMUgmc2ijLkcIdzP83Q1qyZX4ggFQ/SkR+PNOatkaYC+nKcTlpsX4ag==", + "version": "7.16.8", "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.3", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-typescript": "^7.12.13" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-typescript": "^7.16.7" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "version": "7.16.7", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/preset-env": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.2.tgz", - "integrity": "sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ==", - "requires": { - "@babel/compat-data": "^7.14.0", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.14.2", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-class-static-block": "^7.13.11", - "@babel/plugin-proposal-dynamic-import": "^7.14.2", - "@babel/plugin-proposal-export-namespace-from": "^7.14.2", - "@babel/plugin-proposal-json-strings": "^7.14.2", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.2", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.2", - "@babel/plugin-proposal-numeric-separator": "^7.14.2", - "@babel/plugin-proposal-object-rest-spread": "^7.14.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.2", - "@babel/plugin-proposal-optional-chaining": "^7.14.2", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-private-property-in-object": "^7.14.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "version": "7.16.11", + "requires": { + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", @@ -23800,60 +24135,63 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.0", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.14.2", - "@babel/plugin-transform-classes": "^7.14.2", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.17", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.14.2", - "@babel/plugin-transform-modules-commonjs": "^7.14.0", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.14.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.14.2", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.13.15", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.2", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", - "core-js-compat": "^3.9.0", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", "semver": "^6.3.0" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } } } }, "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "version": "0.1.5", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -23863,131 +24201,178 @@ } }, "@babel/preset-react": { - "version": "7.13.13", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.13.13.tgz", - "integrity": "sha512-gx+tDLIE06sRjKJkVtpZ/t3mzCDOnPG+ggHZG9lffUbX8+wC739x20YQc9V35Do6ZAxaUc/HhVHIiOzz5MvDmA==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-transform-react-display-name": "^7.12.13", - "@babel/plugin-transform-react-jsx": "^7.13.12", - "@babel/plugin-transform-react-jsx-development": "^7.12.17", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-react-display-name": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx-development": "^7.16.7", + "@babel/plugin-transform-react-pure-annotations": "^7.16.7" } }, "@babel/preset-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", - "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", + "version": "7.16.7", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.16.7" } }, "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.17.2", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.0.tgz", - "integrity": "sha512-0R0HTZWHLk6G8jIk0FtoX+AatCtKnswS98VhXwGImFc759PJRp4Tru0PQYZofyijTFUr+gT8Mu7sgXVJLQ0ceg==", + "version": "7.17.2", "requires": { - "core-js-pure": "^3.0.0", + "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.14.5", "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "requires": { - "@babel/highlight": "^7.12.13" - } - } + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", + "version": "7.14.8", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.8", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.8", + "@babel/types": "^7.14.8", "debug": "^4.1.0", "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "requires": { - "@babel/highlight": "^7.12.13" - } - } } }, "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", + "version": "7.14.8", "requires": { - "@babel/helper-validator-identifier": "^7.14.0", + "@babel/helper-validator-identifier": "^7.14.8", "to-fast-properties": "^2.0.0" } }, "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + "version": "0.2.3" }, "@cnakazawa/watch": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "requires": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" } }, "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" + "version": "1.4.0" }, "@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" + "version": "10.1.0" + }, + "@emotion/babel-plugin": { + "version": "11.7.2", + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/runtime": "^7.13.10", + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.5", + "@emotion/serialize": "^1.0.2", + "babel-plugin-macros": "^2.6.1", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.0.13" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0" + } + } + }, + "@emotion/cache": { + "version": "11.7.1", + "requires": { + "@emotion/memoize": "^0.7.4", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.0.0", + "@emotion/weak-memoize": "^0.2.5", + "stylis": "4.0.13" + } + }, + "@emotion/hash": { + "version": "0.8.0" + }, + "@emotion/is-prop-valid": { + "version": "1.1.2", + "requires": { + "@emotion/memoize": "^0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.5" + }, + "@emotion/react": { + "version": "11.8.1", + "requires": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/cache": "^11.7.1", + "@emotion/serialize": "^1.0.2", + "@emotion/sheet": "^1.1.0", + "@emotion/utils": "^1.1.0", + "@emotion/weak-memoize": "^0.2.5", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.0.2", + "requires": { + "@emotion/hash": "^0.8.0", + "@emotion/memoize": "^0.7.4", + "@emotion/unitless": "^0.7.5", + "@emotion/utils": "^1.0.0", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.1.0" + }, + "@emotion/styled": { + "version": "11.8.1", + "requires": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/is-prop-valid": "^1.1.2", + "@emotion/serialize": "^1.0.2", + "@emotion/utils": "^1.1.0" + } + }, + "@emotion/unitless": { + "version": "0.7.5" + }, + "@emotion/utils": { + "version": "1.1.0" + }, + "@emotion/weak-memoize": { + "version": "0.2.5" }, "@eslint/eslintrc": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz", - "integrity": "sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==", + "version": "0.4.3", "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", "espree": "^7.3.0", - "globals": "^12.1.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", @@ -23995,69 +24380,31 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - } - }, "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "requires": { - "type-fest": "^0.8.1" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "13.12.1", "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "type-fest": "^0.20.2" } }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "version": "0.20.2" } } }, + "@gar/promisify": { + "version": "1.1.3" + }, "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + "version": "2.1.4" }, "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + "version": "1.3.2" }, "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" + "version": "8.5.1" }, "@hapi/joi": { "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", "requires": { "@hapi/address": "2.x.x", "@hapi/bourne": "1.x.x", @@ -24067,151 +24414,61 @@ }, "@hapi/topo": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", "requires": { "@hapi/hoek": "^8.3.0" } }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "@humanwhocodes/config-array": { + "version": "0.5.0", "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" } }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + "@humanwhocodes/object-schema": { + "version": "1.2.1" }, - "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "camelcase": { + "version": "5.3.1" }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } + "resolve-from": { + "version": "5.0.0" } } }, - "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "@istanbuljs/schema": { + "version": "0.1.3" + }, + "@jest/console": { + "version": "26.6.2", "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", "@jest/types": "^26.6.2", "@types/node": "*", - "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "slash": "^3.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -24219,111 +24476,26 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" } } }, "@jest/environment": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", "requires": { "@jest/fake-timers": "^26.6.2", "@jest/types": "^26.6.2", @@ -24333,8 +24505,6 @@ }, "@jest/fake-timers": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", "requires": { "@jest/types": "^26.6.2", "@sinonjs/fake-timers": "^6.0.1", @@ -24346,181 +24516,27 @@ }, "@jest/globals": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", "requires": { "@jest/environment": "^26.6.2", "@jest/types": "^26.6.2", "expect": "^26.6.2" } }, - "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - } - } - }, "@jest/source-map": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", "requires": { "callsites": "^3.0.0", "graceful-fs": "^4.2.4", "source-map": "^0.6.0" }, "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "@jest/test-result": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", "requires": { "@jest/console": "^26.6.2", "@jest/types": "^26.6.2", @@ -24530,8 +24546,6 @@ }, "@jest/test-sequencer": { "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", "requires": { "@jest/test-result": "^26.6.2", "graceful-fs": "^4.2.4", @@ -24542,8 +24556,6 @@ }, "@jest/transform": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "requires": { "@babel/core": "^7.1.0", "@jest/types": "^26.6.2", @@ -24564,16 +24576,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -24581,31 +24589,21 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -24614,8 +24612,6 @@ }, "@jest/types": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -24626,16 +24622,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -24643,102 +24635,198 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } } } }, + "@jridgewell/resolve-uri": { + "version": "3.0.5" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.4", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@mui/base": { + "version": "5.0.0-alpha.69", + "requires": { + "@babel/runtime": "^7.17.0", + "@emotion/is-prop-valid": "^1.1.1", + "@mui/utils": "^5.4.2", + "@popperjs/core": "^2.4.4", + "clsx": "^1.1.1", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "dependencies": { + "react-is": { + "version": "17.0.2" + } + } + }, + "@mui/material": { + "version": "5.4.3", + "requires": { + "@babel/runtime": "^7.17.0", + "@mui/base": "5.0.0-alpha.69", + "@mui/system": "^5.4.3", + "@mui/types": "^7.1.2", + "@mui/utils": "^5.4.2", + "@types/react-transition-group": "^4.4.4", + "clsx": "^1.1.1", + "csstype": "^3.0.10", + "hoist-non-react-statics": "^3.3.2", + "prop-types": "^15.7.2", + "react-is": "^17.0.2", + "react-transition-group": "^4.4.2" + }, + "dependencies": { + "react-is": { + "version": "17.0.2" + } + } + }, + "@mui/private-theming": { + "version": "5.4.4", + "requires": { + "@babel/runtime": "^7.17.2", + "@mui/utils": "^5.4.4", + "prop-types": "^15.7.2" + } + }, + "@mui/styled-engine": { + "version": "5.4.4", + "requires": { + "@babel/runtime": "^7.17.2", + "@emotion/cache": "^11.7.1", + "prop-types": "^15.7.2" + } + }, + "@mui/system": { + "version": "5.4.4", + "requires": { + "@babel/runtime": "^7.17.2", + "@mui/private-theming": "^5.4.4", + "@mui/styled-engine": "^5.4.4", + "@mui/types": "^7.1.2", + "@mui/utils": "^5.4.4", + "clsx": "^1.1.1", + "csstype": "^3.0.10", + "prop-types": "^15.7.2" + } + }, + "@mui/types": { + "version": "7.1.2", + "requires": {} + }, + "@mui/utils": { + "version": "5.4.4", + "requires": { + "@babel/runtime": "^7.17.2", + "@types/prop-types": "^15.7.4", + "@types/react-is": "^16.7.1 || ^17.0.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "dependencies": { + "react-is": { + "version": "17.0.2" + } + } + }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" + "version": "2.0.5" }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, + "@npmcli/fs": { + "version": "1.1.1", + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "@npmcli/move-file": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", "requires": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" }, "dependencies": { "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } + "version": "1.0.4" + } + } + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.4.3", + "requires": { + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3" } } }, "@popperjs/core": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.4.4.tgz", - "integrity": "sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg==" + "version": "2.9.2" }, - "@restart/context": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", - "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==" + "@react-dnd/asap": { + "version": "4.0.0" }, - "@restart/hooks": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.25.tgz", - "integrity": "sha512-m2v3N5pxTsIiSH74/sb1yW8D9RxkJidGW+5Mfwn/lHb2QzhZNlaU1su7abSyT9EGf0xS/0waLjrf7/XxQHUk7w==", - "requires": { - "lodash": "^4.17.15", - "lodash-es": "^4.17.15" - } + "@react-dnd/invariant": { + "version": "2.0.0" + }, + "@react-dnd/shallowequal": { + "version": "2.0.0" }, "@rollup/plugin-node-resolve": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", - "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", "requires": { "@rollup/pluginutils": "^3.0.8", "@types/resolve": "0.0.8", @@ -24749,8 +24837,6 @@ }, "@rollup/plugin-replace": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", "requires": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" @@ -24758,8 +24844,6 @@ }, "@rollup/pluginutils": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "requires": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", @@ -24767,81 +24851,55 @@ }, "dependencies": { "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + "version": "0.0.39" } } }, "@sinonjs/commons": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", "requires": { "@sinonjs/commons": "^1.7.0" } }, "@surma/rollup-plugin-off-main-thread": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", - "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", "requires": { "ejs": "^2.6.1", "magic-string": "^0.25.0" } }, "@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" + "version": "5.4.0" }, "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" + "version": "5.4.0" }, "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" + "version": "5.0.1" }, "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" + "version": "5.0.1" }, "@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" + "version": "5.4.0" }, "@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" + "version": "5.4.0" }, "@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" + "version": "5.4.0" }, "@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" + "version": "5.5.0" }, "@svgr/babel-preset": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", "requires": { "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", @@ -24855,65 +24913,20 @@ }, "@svgr/core": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", "requires": { "@svgr/plugin-jsx": "^5.5.0", "camelcase": "^6.2.0", "cosmiconfig": "^7.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } } }, "@svgr/hast-util-to-babel-ast": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", "requires": { "@babel/types": "^7.12.6" } }, "@svgr/plugin-jsx": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", "requires": { "@babel/core": "^7.12.3", "@svgr/babel-preset": "^5.5.0", @@ -24923,132 +24936,325 @@ }, "@svgr/plugin-svgo": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", "requires": { "cosmiconfig": "^7.0.0", "deepmerge": "^4.2.2", "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + } + }, + "@tensorflow/tfjs": { + "version": "3.8.0", + "requires": { + "@tensorflow/tfjs-backend-cpu": "3.8.0", + "@tensorflow/tfjs-backend-webgl": "3.8.0", + "@tensorflow/tfjs-converter": "3.8.0", + "@tensorflow/tfjs-core": "3.8.0", + "@tensorflow/tfjs-data": "3.8.0", + "@tensorflow/tfjs-layers": "3.8.0", + "argparse": "^1.0.10", + "chalk": "^4.1.0", + "core-js": "3", + "regenerator-runtime": "^0.13.5", + "yargs": "^16.0.3" }, "dependencies": { - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "ansi-styles": { + "version": "4.3.0", "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4" + }, + "has-flag": { + "version": "4.0.0" + }, + "supports-color": { + "version": "7.2.0", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@tensorflow/tfjs-backend-cpu": { + "version": "3.8.0", + "requires": { + "@types/seedrandom": "2.4.27", + "seedrandom": "2.4.3" + }, + "dependencies": { + "seedrandom": { + "version": "2.4.3" + } + } + }, + "@tensorflow/tfjs-backend-webgl": { + "version": "3.8.0", + "requires": { + "@tensorflow/tfjs-backend-cpu": "3.8.0", + "@types/offscreencanvas": "~2019.3.0", + "@types/seedrandom": "2.4.27", + "@types/webgl-ext": "0.0.30", + "@types/webgl2": "0.0.5", + "seedrandom": "2.4.3" + }, + "dependencies": { + "seedrandom": { + "version": "2.4.3" + } + } + }, + "@tensorflow/tfjs-converter": { + "version": "3.8.0", + "requires": {} + }, + "@tensorflow/tfjs-core": { + "version": "3.8.0", + "requires": { + "@types/long": "^4.0.1", + "@types/offscreencanvas": "~2019.3.0", + "@types/seedrandom": "2.4.27", + "@types/webgl-ext": "0.0.30", + "long": "4.0.0", + "node-fetch": "~2.6.1", + "seedrandom": "2.4.3" + }, + "dependencies": { + "seedrandom": { + "version": "2.4.3" + } + } + }, + "@tensorflow/tfjs-data": { + "version": "3.8.0", + "requires": { + "@types/node-fetch": "^2.1.2", + "node-fetch": "~2.6.1" + } + }, + "@tensorflow/tfjs-layers": { + "version": "3.8.0", + "requires": {} + }, + "@testing-library/dom": { + "version": "8.11.3", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.4.4", + "pretty-format": "^27.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "aria-query": { + "version": "5.0.0", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "pretty-format": { + "version": "27.5.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "dev": true + } + } + }, + "react-is": { + "version": "17.0.2", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@testing-library/jest-dom": { + "version": "5.16.2", + "dev": true, + "requires": { + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "aria-query": { + "version": "5.0.0", + "dev": true + }, + "chalk": { + "version": "3.0.0", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" } }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "color-name": { + "version": "1.1.4", + "dev": true + }, + "css": { + "version": "3.0.0", + "dev": true, "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" } }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "dev": true + }, + "source-map-resolve": { + "version": "0.6.0", + "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" } }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - } - }, - "@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "requires": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "supports-color": { + "version": "7.2.0", + "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "has-flag": "^4.0.0" } } } }, - "@tensorflow/tfjs": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-1.7.4.tgz", - "integrity": "sha512-XWGwRQ/ECEoQacd74JY/dmbLdnMpwtq3H8tls45dQ+GJ553Advir1FDo/aQt0Yr6fTimQDeiOIG4Mcb5KduP/w==", + "@testing-library/react": { + "version": "12.1.3", + "dev": true, "requires": { - "@tensorflow/tfjs-converter": "1.7.4", - "@tensorflow/tfjs-core": "1.7.4", - "@tensorflow/tfjs-data": "1.7.4", - "@tensorflow/tfjs-layers": "1.7.4" + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.0.0", + "@types/react-dom": "*" } }, - "@tensorflow/tfjs-converter": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-1.7.4.tgz", - "integrity": "sha512-B/Ux9I3osI0CXoESGR0Xe5C6BsEfC04+g2xn5zVaW9KEuVEnGEgnuBQxgijRFzkqTwoyLv4ptAmjyIghVARX0Q==" - }, - "@tensorflow/tfjs-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.7.4.tgz", - "integrity": "sha512-3G4VKJ6nPs7iCt6gs3bjRj8chihKrYWenf63R0pm7D9MhlrVoX/tpN4LYVMGgBL7jHPxMLKdOkoAZJrn/J88HQ==", + "@testing-library/react-hooks": { + "version": "7.0.2", + "dev": true, "requires": { - "@types/offscreencanvas": "~2019.3.0", - "@types/seedrandom": "2.4.27", - "@types/webgl-ext": "0.0.30", - "@types/webgl2": "0.0.4", - "node-fetch": "~2.1.2", - "seedrandom": "2.4.3" + "@babel/runtime": "^7.12.5", + "@types/react": ">=16.9.0", + "@types/react-dom": ">=16.9.0", + "@types/react-test-renderer": ">=16.9.0", + "react-error-boundary": "^3.1.0" } }, - "@tensorflow/tfjs-data": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-1.7.4.tgz", - "integrity": "sha512-WFYG9wWjNDi62x6o3O20Q0XJxToCw2J4/fBEXiK/Gr0hIqVhl2oLQ1OjTWq7O08NUxM6BRzuG+ra3gWYdQUzOw==", + "@testing-library/user-event": { + "version": "13.5.0", + "dev": true, "requires": { - "@types/node-fetch": "^2.1.2", - "node-fetch": "~2.1.2" + "@babel/runtime": "^7.12.5" } }, - "@tensorflow/tfjs-layers": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-1.7.4.tgz", - "integrity": "sha512-5/K8Z8RBfXsucL6EaSeb3/8jB/I8oPaaXkxwKVsBPQ+u6lB6LEtSKzeiFc57nDr5OMtVaUZV+pKDNEzP0RUQlg==" - }, "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + "version": "1.1.2" + }, + "@types/aria-query": { + "version": "4.2.2", + "dev": true }, "@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "version": "7.1.18", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -25058,53 +25264,36 @@ } }, "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "version": "7.6.4", "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "version": "7.4.1", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "version": "7.14.2", "requires": { "@babel/types": "^7.3.0" } }, - "@types/classnames": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.10.tgz", - "integrity": "sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==" - }, "@types/eslint": { - "version": "7.2.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.12.tgz", - "integrity": "sha512-HjikV/jX6e0Pg4DcB+rtOBKSrG6w5IaxWpmi3efL/eLxMz5lZTK+W1DKERrX5a+mNzL78axfsDNXu7JHFP4uLg==", + "version": "7.29.0", "requires": { "@types/estree": "*", "@types/json-schema": "*" } }, "@types/estree": { - "version": "0.0.47", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", - "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==" + "version": "0.0.51" }, "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.2.0", "requires": { "@types/minimatch": "*", "@types/node": "*" @@ -25112,181 +25301,259 @@ }, "@types/graceful-fs": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "requires": { "@types/node": "*" } }, - "@types/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } }, - "@types/invariant": { - "version": "2.2.33", - "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.33.tgz", - "integrity": "sha512-/jUNmS8d4bCKdqslfxW6dg/9Gksfzxz67IYfqApHn+HvHlMVXwYv2zpTDnS/yaK9BB0i0GlBTaYci0EFE62Hmw==" + "@types/html-minifier-terser": { + "version": "5.1.2" }, "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==" + "version": "2.0.4" }, "@types/istanbul-lib-report": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "requires": { "@types/istanbul-lib-coverage": "*" } }, "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "version": "3.0.1", "requires": { "@types/istanbul-lib-report": "*" } }, + "@types/jest": { + "version": "27.4.1", + "dev": true, + "requires": { + "jest-matcher-utils": "^27.0.0", + "pretty-format": "^27.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "diff-sequences": { + "version": "27.5.1", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "jest-diff": { + "version": "27.5.1", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-get-type": { + "version": "27.5.1", + "dev": true + }, + "jest-matcher-utils": { + "version": "27.5.1", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "pretty-format": { + "version": "27.5.1", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "dev": true + } + } + }, + "react-is": { + "version": "17.0.2", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" + "version": "7.0.9" }, "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + "version": "0.0.29" + }, + "@types/long": { + "version": "4.0.1" }, "@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" + "version": "3.0.5" }, "@types/node": { - "version": "14.0.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", - "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==" + "version": "16.4.7" }, "@types/node-fetch": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", - "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", + "version": "2.6.1", "requires": { "@types/node": "*", "form-data": "^3.0.0" } }, "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + "version": "2.4.1" }, "@types/offscreencanvas": { - "version": "2019.3.0", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz", - "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==" + "version": "2019.3.0" }, "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "version": "4.0.0" }, "@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==" + "version": "2.4.4" }, "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "version": "15.7.4" }, "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + "version": "1.5.5" }, "@types/react": { - "version": "16.9.45", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.45.tgz", - "integrity": "sha512-vv950slTF5UZ5eDOf13b8qC1SD4rTvkqg3HfaUKzr17U97oeJZAa+dUaIHn0QoOJflNTIt6Pem9MmapULs9dkA==", + "version": "17.0.39", "requires": { "@types/prop-types": "*", + "@types/scheduler": "*", "csstype": "^3.0.2" } }, + "@types/react-dom": { + "version": "17.0.11", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-is": { + "version": "17.0.3", + "requires": { + "@types/react": "*" + } + }, + "@types/react-redux": { + "version": "7.1.22", + "requires": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "@types/react-test-renderer": { + "version": "17.0.1", + "dev": true, + "requires": { + "@types/react": "*" + } + }, "@types/react-transition-group": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.0.tgz", - "integrity": "sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==", + "version": "4.4.4", "requires": { "@types/react": "*" } }, "@types/resolve": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", - "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", "requires": { "@types/node": "*" } }, + "@types/scheduler": { + "version": "0.16.2" + }, "@types/seedrandom": { - "version": "2.4.27", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.27.tgz", - "integrity": "sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE=" + "version": "2.4.27" }, "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + "version": "0.1.2" }, "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" + "version": "2.0.1" }, "@types/tapable": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.7.tgz", - "integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==" + "version": "1.0.8" + }, + "@types/testing-library__jest-dom": { + "version": "5.14.2", + "dev": true, + "requires": { + "@types/jest": "*" + } }, "@types/uglify-js": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", - "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "version": "3.13.1", "requires": { "source-map": "^0.6.1" }, "dependencies": { "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, - "@types/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" - }, "@types/webgl-ext": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/webgl-ext/-/webgl-ext-0.0.30.tgz", - "integrity": "sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==" + "version": "0.0.30" }, "@types/webgl2": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/webgl2/-/webgl2-0.0.4.tgz", - "integrity": "sha512-PACt1xdErJbMUOUweSrbVM7gSIYm1vTncW2hF6Os/EeWi6TXYAYMPp+8v6rzHmypE5gHrxaxZNXgMkJVIdZpHw==" + "version": "0.0.5" }, "@types/webpack": { - "version": "4.41.29", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.29.tgz", - "integrity": "sha512-6pLaORaVNZxiB3FSHbyBiWM7QdazAWda1zvAq4SbZObZqHSDbWLi62iFdblVea6SK9eyBIVp5yHhKt/yNQdR7Q==", + "version": "4.41.32", "requires": { "@types/node": "*", "@types/tapable": "^1", @@ -25297,16 +25564,12 @@ }, "dependencies": { "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "@types/webpack-sources": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", - "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "version": "3.2.0", "requires": { "@types/node": "*", "@types/source-list-map": "*", @@ -25314,44 +25577,45 @@ }, "dependencies": { "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "version": "0.7.3" } } }, "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "version": "15.0.14", "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" + "version": "20.2.1" + }, + "@types/yauzl": { + "version": "2.9.2", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } }, "@typescript-eslint/eslint-plugin": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.25.0.tgz", - "integrity": "sha512-Qfs3dWkTMKkKwt78xp2O/KZQB8MPS1UQ5D3YW2s6LQWBE1074BE+Rym+b1pXZIX3M3fSvPUDaCvZLKV2ylVYYQ==", + "version": "4.33.0", "requires": { - "@typescript-eslint/experimental-utils": "4.25.0", - "@typescript-eslint/scope-manager": "4.25.0", - "debug": "^4.1.1", + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { + "ignore": { + "version": "5.2.0" + }, "semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { "lru-cache": "^6.0.0" } @@ -25359,61 +25623,57 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.25.0.tgz", - "integrity": "sha512-f0doRE76vq7NEEU0tw+ajv6CrmPelw5wLoaghEHkA2dNLFb3T/zJQqGPQ0OYt5XlZaS13MtnN+GTPCuUVg338w==", + "version": "4.33.0", "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.25.0", - "@typescript-eslint/types": "4.25.0", - "@typescript-eslint/typescript-estree": "4.25.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "3.0.0", + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + } } }, "@typescript-eslint/parser": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.25.0.tgz", - "integrity": "sha512-OZFa1SKyEJpAhDx8FcbWyX+vLwh7OEtzoo2iQaeWwxucyfbi0mT4DijbOSsTgPKzGHr6GrF2V5p/CEpUH/VBxg==", + "version": "4.33.0", "requires": { - "@typescript-eslint/scope-manager": "4.25.0", - "@typescript-eslint/types": "4.25.0", - "@typescript-eslint/typescript-estree": "4.25.0", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.1" } }, "@typescript-eslint/scope-manager": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.25.0.tgz", - "integrity": "sha512-2NElKxMb/0rya+NJG1U71BuNnp1TBd1JgzYsldsdA83h/20Tvnf/HrwhiSlNmuq6Vqa0EzidsvkTArwoq+tH6w==", + "version": "4.33.0", "requires": { - "@typescript-eslint/types": "4.25.0", - "@typescript-eslint/visitor-keys": "4.25.0" + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" } }, "@typescript-eslint/types": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.25.0.tgz", - "integrity": "sha512-+CNINNvl00OkW6wEsi32wU5MhHti2J25TJsJJqgQmJu3B3dYDBcmOxcE5w9cgoM13TrdE/5ND2HoEnBohasxRQ==" + "version": "4.33.0" }, "@typescript-eslint/typescript-estree": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.25.0.tgz", - "integrity": "sha512-1B8U07TGNAFMxZbSpF6jqiDs1cVGO0izVkf18Q/SPcUAc9LhHxzvSowXDTvkHMWUVuPpagupaW63gB6ahTXVlg==", + "version": "4.33.0", "requires": { - "@typescript-eslint/types": "4.25.0", - "@typescript-eslint/visitor-keys": "4.25.0", - "debug": "^4.1.1", - "globby": "^11.0.1", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "dependencies": { "semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { "lru-cache": "^6.0.0" } @@ -25421,25 +25681,14 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.25.0.tgz", - "integrity": "sha512-AmkqV9dDJVKP/TcZrbf6s6i1zYXt5Hl8qOLrRDTFfRNae4+LB8A4N3i+FLZPW85zIxRy39BgeWOfMS3HoH5ngg==", + "version": "4.33.0", "requires": { - "@typescript-eslint/types": "4.25.0", + "@typescript-eslint/types": "4.33.0", "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" - } } }, "@webassemblyjs/ast": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "requires": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -25447,50 +25696,34 @@ } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + "version": "1.9.0" }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + "version": "1.9.0" }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + "version": "1.9.0" }, "@webassemblyjs/helper-code-frame": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "requires": { "@webassemblyjs/wast-printer": "1.9.0" } }, "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + "version": "1.9.0" }, "@webassemblyjs/helper-module-context": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "requires": { "@webassemblyjs/ast": "1.9.0" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + "version": "1.9.0" }, "@webassemblyjs/helper-wasm-section": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -25500,29 +25733,21 @@ }, "@webassemblyjs/ieee754": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + "version": "1.9.0" }, "@webassemblyjs/wasm-edit": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -25536,8 +25761,6 @@ }, "@webassemblyjs/wasm-gen": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -25548,8 +25771,6 @@ }, "@webassemblyjs/wasm-opt": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -25559,8 +25780,6 @@ }, "@webassemblyjs/wasm-parser": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-api-error": "1.9.0", @@ -25572,8 +25791,6 @@ }, "@webassemblyjs/wast-parser": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/floating-point-hex-parser": "1.9.0", @@ -25585,8 +25802,6 @@ }, "@webassemblyjs/wast-printer": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0", @@ -25594,98 +25809,60 @@ } }, "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "version": "1.2.0" }, "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "version": "4.2.2" }, "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + "version": "2.0.5" }, "abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "devOptional": true }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", - "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" + "version": "7.4.1" }, "acorn-globals": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "requires": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" } }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", "requires": {} }, "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + "version": "7.2.0" }, "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" - }, - "adjust-sourcemap-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", - "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", - "requires": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } + "version": "1.1.2" + }, + "adjust-sourcemap-loader": { + "version": "3.0.0", + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" } }, "agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "requires": { "debug": "4" } }, "aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -25693,8 +25870,6 @@ }, "ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -25704,178 +25879,141 @@ }, "ajv-errors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + "requires": {} }, "ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "requires": {} }, "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + "version": "1.0.2" }, "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + "version": "4.1.1" }, "ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "requires": { "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3" + } } }, "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + "version": "0.0.7" }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "version": "5.0.1" }, "ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "anymatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "version": "1.2.0" }, "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "version": "2.0.0", "devOptional": true, "requires": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "devOptional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { "sprintf-js": "~1.0.2" } }, "aria-query": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", "requires": { "@babel/runtime": "^7.10.2", "@babel/runtime-corejs3": "^7.10.2" } }, "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + "version": "1.0.4" }, "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + "version": "4.0.0" }, "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "version": "1.1.0" }, "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + "version": "3.1.0" }, "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + "version": "2.1.2" }, "array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "version": "3.1.4", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", + "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" + "is-string": "^1.0.7" } }, "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "version": "2.1.0" }, "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "version": "1.0.3" }, "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + "version": "0.3.2" }, "array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "version": "1.2.5", "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "es-abstract": "^1.19.0" } }, "array.prototype.flatmap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", - "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "version": "1.2.5", "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "function-bind": "^1.1.1" + "es-abstract": "^1.19.0" } }, "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + "version": "2.0.1" }, "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "version": "2.0.6" }, "asn1.js": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -25884,30 +26022,22 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.0" } } }, "assert": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "requires": { "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + "version": "2.0.1" }, "util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "requires": { "inherits": "2.0.1" } @@ -25915,76 +26045,60 @@ } }, "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + "version": "1.0.0" }, "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + "version": "0.0.7" + }, + "astral-regex": { + "version": "2.0.0" }, "async": { "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "requires": { "lodash": "^4.17.14" } }, "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + "version": "1.0.3" }, "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "version": "1.0.1" }, "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "version": "0.4.0" }, "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + "version": "1.0.0" }, "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "version": "2.1.2" }, "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "version": "9.8.8", "requires": { "browserslist": "^4.12.0", "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", "postcss": "^7.0.32", "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1" + } } }, "axe-core": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.1.tgz", - "integrity": "sha512-evY7DN8qSIbsW2H/TWQ1bX3sXN1d4MNb5Vb4n7BzPuCwRHdkZ1H2eNLuSh73EoQqkGKUtju2G2HCcjCfhvZIAA==" + "version": "4.4.1" }, "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + "version": "2.2.0" }, "babel-eslint": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.7.0", @@ -25992,20 +26106,21 @@ "@babel/types": "^7.7.0", "eslint-visitor-keys": "^1.0.0", "resolve": "^1.12.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0" + } } }, "babel-extract-comments": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", "requires": { "babylon": "^6.18.0" } }, "babel-jest": { "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", "requires": { "@jest/transform": "^26.6.2", "@jest/types": "^26.6.2", @@ -26019,16 +26134,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -26036,26 +26147,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -26064,8 +26167,6 @@ }, "babel-loader": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", "requires": { "find-cache-dir": "^2.1.0", "loader-utils": "^1.4.0", @@ -26074,42 +26175,40 @@ "schema-utils": "^2.6.5" }, "dependencies": { - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "json5": { + "version": "1.0.1", "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } } } }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "requires": { "object.assign": "^4.1.0" } }, "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "version": "6.1.1", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "babel-plugin-jest-hoist": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -26119,8 +26218,6 @@ }, "babel-plugin-macros": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "requires": { "@babel/runtime": "^7.7.2", "cosmiconfig": "^6.0.0", @@ -26129,8 +26226,6 @@ "dependencies": { "cosmiconfig": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -26139,96 +26234,62 @@ "yaml": "^1.7.2" } }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "is-core-module": { + "version": "2.8.1", "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "has": "^1.0.3" } }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "resolve": { + "version": "1.22.0", "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" } } }, "babel-plugin-named-asset-import": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz", - "integrity": "sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==", + "version": "0.3.8", "requires": {} }, "babel-plugin-polyfill-corejs2": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", - "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "version": "0.3.1", "requires": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.2", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } } }, "babel-plugin-polyfill-corejs3": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz", - "integrity": "sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A==", + "version": "0.5.2", "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.9.1" + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", - "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "version": "0.3.1", "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2" + "@babel/helper-define-polyfill-provider": "^0.3.1" } }, "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + "version": "6.13.0" }, "babel-plugin-transform-object-rest-spread": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "requires": { "babel-plugin-syntax-object-rest-spread": "^6.8.0", "babel-runtime": "^6.26.0" } }, "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + "version": "0.4.24" }, "babel-preset-current-node-syntax": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -26246,227 +26307,170 @@ }, "babel-preset-jest": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", "requires": { "babel-plugin-jest-hoist": "^26.6.2", "babel-preset-current-node-syntax": "^1.0.0" } }, "babel-preset-react-app": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.0.tgz", - "integrity": "sha512-itL2z8v16khpuKutx5IH8UdCdSTuzrOhRFTEdIhveZ2i1iBKDrVE0ATa4sFVy+02GLucZNVBWtoarXBy0Msdpg==", - "requires": { - "@babel/core": "7.12.3", - "@babel/plugin-proposal-class-properties": "7.12.1", - "@babel/plugin-proposal-decorators": "7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.12.1", - "@babel/plugin-proposal-numeric-separator": "7.12.1", - "@babel/plugin-proposal-optional-chaining": "7.12.1", - "@babel/plugin-transform-flow-strip-types": "7.12.1", - "@babel/plugin-transform-react-display-name": "7.12.1", - "@babel/plugin-transform-runtime": "7.12.1", - "@babel/preset-env": "7.12.1", - "@babel/preset-react": "7.12.1", - "@babel/preset-typescript": "7.12.1", - "@babel/runtime": "7.12.1", - "babel-plugin-macros": "2.8.0", - "babel-plugin-transform-react-remove-prop-types": "0.4.24" + "version": "10.0.1", + "requires": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" }, "dependencies": { - "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "@babel/code-frame": { + "version": "7.16.7", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/highlight": "^7.16.7" + } + }, + "@babel/core": { + "version": "7.17.5", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.17.2", + "@babel/parser": "^7.17.3", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.17.3", + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, - "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", - "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", - "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz", - "integrity": "sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/preset-env": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", - "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", - "requires": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-compilation-targets": "^7.12.1", - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.1", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.1", - "core-js-compat": "^3.6.2", - "semver": "^5.5.0" + "@babel/helper-module-imports": { + "version": "7.16.7", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.17.6", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7" + }, + "@babel/helpers": { + "version": "7.17.2", + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0" + } + }, + "@babel/parser": { + "version": "7.17.3" + }, + "@babel/template": { + "version": "7.16.7", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" } }, - "@babel/preset-react": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.1.tgz", - "integrity": "sha512-euCExymHCi0qB9u5fKw7rvlw7AZSjw/NaB9h7EkdTt5+yHRrXdiRTh7fkG3uBPpJg82CqLfp1LHLqWGSCrab+g==", + "resolve": { + "version": "1.22.0", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-react-display-name": "^7.12.1", - "@babel/plugin-transform-react-jsx": "^7.12.1", - "@babel/plugin-transform-react-jsx-development": "^7.12.1", - "@babel/plugin-transform-react-jsx-self": "^7.12.1", - "@babel/plugin-transform-react-jsx-source": "^7.12.1", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } } } }, "babel-runtime": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" }, "dependencies": { "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + "version": "2.6.12" }, "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "version": "0.11.1" } } }, "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + "version": "6.18.0" }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2" }, "base": { "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -26479,28 +26483,40 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { "is-descriptor": "^1.0.0" } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "version": "1.5.1" }, "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + "version": "0.6.1" }, "bfj": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", - "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", "requires": { "bluebird": "^3.5.5", "check-types": "^11.1.1", @@ -26509,14 +26525,10 @@ } }, "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + "version": "5.2.2" }, "binary-extensions": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "optional": true }, "bindings": { @@ -26528,57 +26540,71 @@ "file-uri-to-path": "1.0.0" } }, + "bl": { + "version": "4.1.0", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "version": "3.7.2" }, "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + "version": "5.2.0" }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.2", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2" }, "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.0.0" } } }, "bonjour": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "requires": { "array-flatten": "^2.1.0", "deep-equal": "^1.0.1", @@ -26589,19 +26615,10 @@ } }, "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "bootstrap": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.2.tgz", - "integrity": "sha512-vlGn0bcySYl/iV+BGA544JkkZP5LB3jsmkeKLFQakCOwCM3AOk7VkldBz4jrzSe+Z0Ezn99NVXa1o45cQY4R6A==" + "version": "1.0.0" }, "brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -26609,26 +26626,18 @@ }, "braces": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + "version": "1.1.0" }, "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + "version": "1.0.0" }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -26640,8 +26649,6 @@ }, "browserify-cipher": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -26650,8 +26657,6 @@ }, "browserify-des": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -26661,8 +26666,6 @@ }, "browserify-rsa": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "requires": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -26670,8 +26673,6 @@ }, "browserify-sign": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -26686,8 +26687,6 @@ "dependencies": { "readable-stream": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -26695,85 +26694,66 @@ } }, "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "version": "5.2.1" } } }, "browserify-zlib": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { "pako": "~1.0.5" } }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.19.3", "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001312", + "electron-to-chromium": "^1.4.71", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, "bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "requires": { "node-int64": "^0.4.0" } }, "buffer": { "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" } }, + "buffer-crc32": { + "version": "0.2.13", + "dev": true + }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2" }, "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + "version": "1.1.1" }, "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + "version": "1.0.3" }, "builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" + "version": "3.2.0" }, "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + "version": "3.0.0" }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "version": "3.0.0" }, "cacache": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", - "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", + "version": "15.3.0", "requires": { + "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -26790,76 +26770,16 @@ "rimraf": "^3.0.2", "ssri": "^8.0.1", "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "unique-filename": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4" } } }, "cache-base": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -26874,8 +26794,6 @@ }, "call-bind": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -26883,50 +26801,41 @@ }, "caller-callsite": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "requires": { "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0" + } } }, "caller-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "requires": { "caller-callsite": "^2.0.0" } }, "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + "version": "3.1.0" }, "camel-case": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "requires": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1" } } }, "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + "version": "6.3.0" }, "caniuse-api": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "requires": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -26935,58 +26844,91 @@ } }, "caniuse-lite": { - "version": "1.0.30001230", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", - "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==" + "version": "1.0.30001312" }, "canvas": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz", - "integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==", + "version": "2.8.0", "devOptional": true, "requires": { + "@mapbox/node-pre-gyp": "^1.0.0", "nan": "^2.14.0", - "node-pre-gyp": "^0.11.0", "simple-get": "^3.0.3" }, "dependencies": { - "node-pre-gyp": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", - "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "@mapbox/node-pre-gyp": { + "version": "1.0.8", "devOptional": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.5", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + } + }, + "mkdirp": { + "version": "1.0.4", + "devOptional": true + }, + "node-fetch": { + "version": "2.6.7", + "devOptional": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "semver": { + "version": "7.3.5", + "devOptional": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "tar": { + "version": "6.1.11", + "devOptional": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "devOptional": true + }, + "webidl-conversions": { + "version": "3.0.1", + "devOptional": true + }, + "whatwg-url": { + "version": "5.0.0", + "devOptional": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } } } }, "capture-exit": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "requires": { "rsvp": "^4.8.4" } }, "case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==" + "version": "2.3.0" }, "chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -26994,64 +26936,49 @@ } }, "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" + "version": "1.0.2" + }, + "charcodes": { + "version": "0.2.0" }, "check-types": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.1.2.tgz", - "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" + "version": "11.1.2" }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", "optional": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" } }, "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "version": "2.0.0" }, "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + "version": "1.0.3" }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "version": "2.0.0" }, "cipher-base": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==" + "version": "0.6.0" }, "class-utils": { "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -27061,235 +26988,60 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + "version": "2.3.1" }, "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "version": "4.2.4", "requires": { "source-map": "~0.6.0" }, "dependencies": { "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + "version": "2.2.0" + }, + "cli-cursor": { + "version": "3.1.0", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } }, "cli-truncate": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "requires": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } + "wrap-ansi": "^7.0.0" } }, + "clsx": { + "version": "1.1.1" + }, "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "version": "4.6.0" }, "coa": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "requires": { "@types/q": "^1.5.1", "chalk": "^2.4.1", @@ -27298,108 +27050,82 @@ }, "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "devOptional": true + "dev": true }, "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + "version": "1.0.1" }, "collection-visit": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" } }, "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "version": "3.2.1", "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "version": "1.1.3" }, "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "version": "1.9.0", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, + "color-support": { + "version": "1.1.3", + "devOptional": true + }, "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + "version": "2.0.16", + "dev": true }, "combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + "version": "7.2.0", + "dev": true }, "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" + "version": "1.8.2" }, "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + "version": "1.0.1" }, "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "version": "1.3.0" }, "compose-function": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", "requires": { "arity-n": "^1.0.4" } }, "compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { "mime-db": ">= 1.43.0 < 2" } }, "compression": { "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "requires": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -27412,28 +27138,20 @@ "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.0.0" } } }, "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "version": "0.0.1" }, "concat-stream": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -27442,66 +27160,49 @@ } }, "confusing-browser-globals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", - "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==" + "version": "1.0.11" }, "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + "version": "1.6.0" }, "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + "version": "1.2.0" }, "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "devOptional": true }, "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + "version": "1.0.0" }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1" + } } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "version": "1.0.4" }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", "requires": { "safe-buffer": "~5.1.1" } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.4.2" }, "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "version": "1.0.6" }, "copy-concurrently": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "requires": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -27509,75 +27210,64 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "requires": { + "glob": "^7.1.3" + } + } } }, "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + "version": "0.1.1" }, "core-js": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.13.0.tgz", - "integrity": "sha512-iWDbiyha1M5vFwPFmQnvRv+tJzGbFAm6XimJUT0NgHYW3xZEs1SkCAcasWSVFxpI2Xb/V1DDJckq3v90+bQnog==" + "version": "3.21.1" }, "core-js-compat": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.13.0.tgz", - "integrity": "sha512-jhbI2zpVskgfDC9mGRaDo1gagd0E0i/kYW0+WvibL/rafEHKAHO653hEXIxJHqRlRLITluXtRH3AGTL5qJmifQ==", + "version": "3.21.1", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.19.1", "semver": "7.0.0" }, "dependencies": { "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + "version": "7.0.0" } } }, "core-js-pure": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.13.0.tgz", - "integrity": "sha512-7VTvXbsMxROvzPAVczLgfizR8CyYnvWPrb1eGrtlZAJfjQWEHLofVfCKljLHdpazTfpaziRORwUH/kfGDKvpdA==" + "version": "3.21.1" }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3" }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "7.0.0", "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } }, "create-ecdh": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "requires": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" }, "dependencies": { "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.0" } } }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -27588,8 +27278,6 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -27601,8 +27289,6 @@ }, "cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -27611,8 +27297,6 @@ }, "crypto-browserify": { "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -27628,14 +27312,10 @@ } }, "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + "version": "1.0.0" }, "css": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", "requires": { "inherits": "^2.0.3", "source-map": "^0.6.1", @@ -27644,29 +27324,21 @@ }, "dependencies": { "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "css-blank-pseudo": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", "requires": { "postcss": "^7.0.5" } }, "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + "version": "0.0.4" }, "css-declaration-sorter": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "requires": { "postcss": "^7.0.1", "timsort": "^0.3.0" @@ -27674,22 +27346,16 @@ }, "css-has-pseudo": { "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", "requires": { "postcss": "^7.0.6", "postcss-selector-parser": "^5.0.0-rc.4" }, "dependencies": { "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + "version": "2.0.0" }, "postcss-selector-parser": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "requires": { "cssesc": "^2.0.0", "indexes-of": "^1.0.1", @@ -27700,8 +27366,6 @@ }, "css-loader": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", - "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", "requires": { "camelcase": "^6.0.0", "cssesc": "^3.0.0", @@ -27717,30 +27381,8 @@ "semver": "^7.3.2" }, "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, "semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { "lru-cache": "^6.0.0" } @@ -27749,16 +27391,12 @@ }, "css-prefers-color-scheme": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", "requires": { "postcss": "^7.0.5" } }, "css-select": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "requires": { "boolbase": "^1.0.0", "css-what": "^3.2.1", @@ -27767,56 +27405,72 @@ } }, "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + "version": "0.1.1" }, "css-tree": { "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "requires": { "mdn-data": "2.0.4", "source-map": "^0.6.1" }, "dependencies": { "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + "version": "3.4.2" + }, + "css.escape": { + "version": "1.5.1", + "dev": true }, "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + "version": "4.4.0" }, "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + "version": "3.0.0" }, "cssnano": { "version": "4.1.11", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", - "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", "requires": { "cosmiconfig": "^5.0.0", "cssnano-preset-default": "^4.0.8", "is-resolvable": "^1.0.0", "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0" + } } }, "cssnano-preset-default": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", - "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", "requires": { "css-declaration-sorter": "^4.0.1", "cssnano-util-raw-cache": "^4.0.1", @@ -27851,91 +27505,63 @@ } }, "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + "version": "4.0.0" }, "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + "version": "4.0.0" }, "cssnano-util-raw-cache": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "requires": { "postcss": "^7.0.0" } }, "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + "version": "4.0.1" }, "csso": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "requires": { "css-tree": "^1.1.2" }, "dependencies": { "css-tree": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "requires": { "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + "version": "2.0.14" }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + "version": "0.4.4" }, "cssstyle": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "requires": { "cssom": "~0.3.6" }, "dependencies": { "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "version": "0.3.8" } } }, "csstype": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", - "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==" + "version": "3.0.10" }, "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + "version": "1.0.1" }, "d": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "requires": { "es5-ext": "^0.10.50", "type": "^1.0.1" @@ -27943,28 +27569,21 @@ }, "daikon": { "version": "1.2.42", - "resolved": "https://registry.npmjs.org/daikon/-/daikon-1.2.42.tgz", - "integrity": "sha512-uEJKRNpJo6lWCMr1UehBJLCnpsmoY4cmaedjL03UCeUmyoV2SsCYiEo8I+rhfuoj2FHqtDJFRGfZAW729berww==", "requires": { "jpeg-lossless-decoder-js": "git+https://github.com/rii-mango/JPEGLosslessDecoderJS.git", "pako": "^1.0.6" }, "dependencies": { "jpeg-lossless-decoder-js": { - "version": "git+ssh://git@github.com/rii-mango/JPEGLosslessDecoderJS.git#78fe90c7cae985b1a394a66f99c81633144bb867", - "from": "jpeg-lossless-decoder-js@git+https://github.com/rii-mango/JPEGLosslessDecoderJS.git" + "version": "2.0.4" } } }, "damerau-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", - "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" + "version": "1.0.8" }, "data-urls": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "requires": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", @@ -27972,46 +27591,32 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", "requires": { "ms": "2.1.2" } }, "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "version": "1.2.0" }, "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" + "version": "10.3.1" }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "version": "0.2.0" }, "decompress-response": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", "devOptional": true, "requires": { "mimic-response": "^2.0.0" } }, "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + "version": "0.7.0" }, "deep-equal": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", "requires": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -28023,24 +27628,16 @@ }, "deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "devOptional": true + "dev": true }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "version": "0.1.4" }, "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + "version": "4.2.2" }, "default-gateway": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "requires": { "execa": "^1.0.0", "ip-regex": "^2.1.0" @@ -28048,8 +27645,6 @@ "dependencies": { "cross-spawn": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -28060,8 +27655,6 @@ }, "execa": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -28074,47 +27667,36 @@ }, "get-stream": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "requires": { "pump": "^3.0.0" } }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "version": "1.1.0" }, "npm-run-path": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { "path-key": "^2.0.0" } }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "version": "2.0.1" + }, + "semver": { + "version": "5.7.1" }, "shebang-command": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "version": "1.0.0" }, "which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" } @@ -28123,25 +27705,41 @@ }, "define-properties": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "requires": { "object-keys": "^1.0.12" } }, "define-property": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } } }, "del": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "requires": { "@types/glob": "^7.1.1", "globby": "^6.1.0", @@ -28154,16 +27752,12 @@ "dependencies": { "array-union": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { "array-uniq": "^1.0.1" } }, "globby": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "requires": { "array-union": "^1.0.1", "glob": "^7.0.3", @@ -28173,69 +27767,53 @@ }, "dependencies": { "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "version": "2.3.0" } } }, "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + "version": "2.1.0" + }, + "rimraf": { + "version": "2.7.1", + "requires": { + "glob": "^7.1.3" + } } } }, "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "version": "1.0.0" }, "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "devOptional": true }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "1.1.2" }, "des.js": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.0.4" }, "detect-libc": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "devOptional": true }, "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" + "version": "3.1.0" }, "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + "version": "2.1.0" }, "detect-port-alt": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "requires": { "address": "^1.0.1", "debug": "^2.6.0" @@ -28243,28 +27821,24 @@ "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.0.0" } } }, + "devtools-protocol": { + "version": "0.0.901419", + "dev": true + }, "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==" + "version": "26.6.2" }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -28272,29 +27846,29 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.0" } } }, "dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "requires": { "path-type": "^4.0.0" } }, + "dnd-core": { + "version": "14.0.0", + "requires": { + "@react-dnd/asap": "^4.0.0", + "@react-dnd/invariant": "^2.0.0", + "redux": "^4.0.5" + } + }, "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + "version": "1.0.0" }, "dns-packet": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "requires": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -28302,32 +27876,28 @@ }, "dns-txt": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "requires": { "buffer-indexof": "^1.0.0" } }, "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "version": "3.0.0", "requires": { "esutils": "^2.0.2" } }, + "dom-accessibility-api": { + "version": "0.5.13", + "dev": true + }, "dom-converter": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "requires": { "utila": "~0.4" } }, "dom-helpers": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz", - "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==", + "version": "5.2.1", "requires": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -28335,57 +27905,46 @@ }, "dom-serializer": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "requires": { "domelementtype": "^2.0.1", "entities": "^2.0.0" }, "dependencies": { "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + "version": "2.2.0" } } }, "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + "version": "1.2.0" }, "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "version": "1.3.1" }, "domexception": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "requires": { "webidl-conversions": "^5.0.0" }, "dependencies": { "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + "version": "5.0.0" } } }, "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "version": "4.3.0", "requires": { - "domelementtype": "1" + "domelementtype": "^2.2.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0" + } } }, "domutils": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "requires": { "dom-serializer": "0", "domelementtype": "1" @@ -28393,47 +27952,38 @@ }, "dot-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1" } } }, "dot-prop": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "requires": { "is-obj": "^2.0.0" + }, + "dependencies": { + "is-obj": { + "version": "2.0.0" + } } }, "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + "version": "8.2.0" }, "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + "version": "5.1.0" }, "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "version": "0.1.2" }, "duplexify": { "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -28442,24 +27992,16 @@ } }, "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "version": "1.1.1" }, "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" + "version": "2.7.4" }, "electron-to-chromium": { - "version": "1.3.740", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.740.tgz", - "integrity": "sha512-Mi2m55JrX2BFbNZGKYR+2ItcGnR4O5HhrvgoRRyZQlaMGQULqDhoGkLWHzJoshSzi7k1PUofxcDbNhlFrDZNhg==" + "version": "1.4.75" }, "elliptic": { "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -28471,44 +28013,30 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.0" } } }, "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==" + "version": "0.7.2" }, "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "version": "8.0.0" }, "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + "version": "3.0.0" }, "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "version": "1.0.2" }, "end-of-stream": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { "once": "^1.4.0" } }, "enhanced-resolve": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", @@ -28517,8 +28045,6 @@ "dependencies": { "memory-fs": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -28528,57 +28054,49 @@ }, "enquirer": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "requires": { "ansi-colors": "^4.1.1" } }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "version": "2.2.0" }, "errno": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "requires": { "prr": "~1.0.1" } }, "error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "requires": { "is-arrayish": "^0.2.1" } }, "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", - "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "version": "2.0.7", "requires": { "stackframe": "^1.1.1" } }, "es-abstract": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.2.tgz", - "integrity": "sha512-byRiNIQXE6HWNySaU6JohoNXzYgbBjztwFnBLUTiJmWXjaU9bSq3urQLUlNLQ292tc+gc07zYZXNZjaOoAX3sw==", + "version": "1.19.1", "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -28588,8 +28106,6 @@ }, "es-to-primitive": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -28598,8 +28114,6 @@ }, "es5-ext": { "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", "requires": { "es6-iterator": "~2.0.3", "es6-symbol": "~3.1.3", @@ -28608,8 +28122,6 @@ }, "es6-iterator": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { "d": "1", "es5-ext": "^0.10.35", @@ -28618,32 +28130,22 @@ }, "es6-symbol": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "requires": { "d": "^1.0.1", "ext": "^1.1.2" } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "version": "3.1.1" }, "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "version": "1.0.3" }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "version": "1.0.5" }, "escodegen": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "requires": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -28653,25 +28155,47 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + "version": "5.3.0" + }, + "levn": { + "version": "0.3.0", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2" }, "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "optional": true + }, + "type-check": { + "version": "0.3.2", + "requires": { + "prelude-ls": "~1.1.2" + } } } }, "eslint": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.27.0.tgz", - "integrity": "sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA==", + "version": "7.31.0", "requires": { "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.1", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -28688,7 +28212,7 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", + "glob-parent": "^5.1.2", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", @@ -28711,28 +28235,20 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "@babel/code-frame": { + "version": "7.12.11", + "requires": { + "@babel/highlight": "^7.10.4" + } }, "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" - }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -28740,406 +28256,209 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "requires": { - "esutils": "^2.0.2" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "version": "1.1.4" }, "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - } - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "requires": { - "flat-cache": "^3.0.4" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } + "version": "4.0.0" }, "globals": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", - "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "version": "13.12.1", "requires": { "type-fest": "^0.20.2" } }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } + "version": "4.0.0" }, "semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { "lru-cache": "^6.0.0" } }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } }, - "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.5.0.tgz", - "integrity": "sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "requires": { - "prelude-ls": "^1.2.1" - } - }, "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "version": "0.20.2" } } }, + "eslint-config-prettier": { + "version": "8.3.0", + "dev": true, + "requires": {} + }, "eslint-config-react-app": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", - "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", "requires": { "confusing-browser-globals": "^1.0.10" } }, "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "version": "0.3.6", "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "debug": "^3.2.7", + "resolve": "^1.20.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "resolve": { + "version": "1.22.0", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } } } }, "eslint-module-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", - "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "version": "2.7.3", "requires": { "debug": "^3.2.7", - "pkg-dir": "^2.0.0" + "find-up": "^2.1.0" }, "dependencies": { "debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } + }, + "find-up": { + "version": "2.1.0", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0" + }, + "path-exists": { + "version": "3.0.0" } } }, "eslint-plugin-flowtype": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.7.2.tgz", - "integrity": "sha512-7Oq/N0+3nijBnYWQYzz/Mp/7ZCpwxYvClRyW/PLAmimY9uLCBvoXsNsERcJdkKceyOjgRbFhhxs058KTrne9Mg==", + "version": "5.10.0", "requires": { "lodash": "^4.17.15", "string-natural-compare": "^3.0.1" } }, "eslint-plugin-import": { - "version": "2.23.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.3.tgz", - "integrity": "sha512-wDxdYbSB55F7T5CC7ucDjY641VvKmlRwT0Vxh7PkY1mI4rclVRFWYfsrjDgZvwYYDZ5ee0ZtfFKXowWjqvEoRQ==", + "version": "2.25.4", "requires": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", "debug": "^2.6.9", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.1", - "find-up": "^2.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.2", "has": "^1.0.3", - "is-core-module": "^2.4.0", + "is-core-module": "^2.8.0", + "is-glob": "^4.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.3", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", + "object.values": "^1.1.5", "resolve": "^1.20.0", - "tsconfig-paths": "^3.9.0" + "tsconfig-paths": "^3.12.0" }, "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, - "find-up": { + "doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "esutils": "^2.0.2" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } + "version": "2.0.0" }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "resolve": { + "version": "1.22.0", "requires": { - "p-limit": "^1.1.0" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" } } }, "eslint-plugin-jest": { - "version": "24.3.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz", - "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==", + "version": "24.7.0", "requires": { "@typescript-eslint/experimental-utils": "^4.0.1" } }, "eslint-plugin-jsx-a11y": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz", - "integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==", + "version": "6.5.1", "requires": { - "@babel/runtime": "^7.11.2", + "@babel/runtime": "^7.16.3", "aria-query": "^4.2.2", - "array-includes": "^3.1.1", + "array-includes": "^3.1.4", "ast-types-flow": "^0.0.7", - "axe-core": "^4.0.2", + "axe-core": "^4.3.5", "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.6", - "emoji-regex": "^9.0.0", + "damerau-levenshtein": "^1.0.7", + "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.1.0", - "language-tags": "^1.0.5" + "jsx-ast-utils": "^3.2.1", + "language-tags": "^1.0.5", + "minimatch": "^3.0.4" + }, + "dependencies": { + "emoji-regex": { + "version": "9.2.2" + } + } + }, + "eslint-plugin-prettier": { + "version": "4.0.0", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" } }, "eslint-plugin-react": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.23.2.tgz", - "integrity": "sha512-AfjgFQB+nYszudkxRkTFu0UR1zEQig0ArVMPloKhxwlwkzaw/fBiH0QWcBBhZONlXqQC51+nfqFrkn4EzHcGBw==", + "version": "7.24.0", "requires": { "array-includes": "^3.1.3", "array.prototype.flatmap": "^1.2.4", @@ -29147,18 +28466,22 @@ "has": "^1.0.3", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.0.4", - "object.entries": "^1.1.3", + "object.entries": "^1.1.4", "object.fromentries": "^2.0.4", - "object.values": "^1.1.3", + "object.values": "^1.1.4", "prop-types": "^15.7.2", "resolve": "^2.0.0-next.3", - "string.prototype.matchall": "^4.0.4" + "string.prototype.matchall": "^4.0.5" }, "dependencies": { + "doctrine": { + "version": "2.1.0", + "requires": { + "esutils": "^2.0.2" + } + }, "resolve": { "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -29167,23 +28490,17 @@ } }, "eslint-plugin-react-hooks": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", - "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", + "version": "4.3.0", "requires": {} }, "eslint-plugin-testing-library": { "version": "3.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", - "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", "requires": { "@typescript-eslint/experimental-utils": "^3.10.1" }, "dependencies": { "@typescript-eslint/experimental-utils": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", - "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", "requires": { "@types/json-schema": "^7.0.3", "@typescript-eslint/types": "3.10.1", @@ -29193,14 +28510,10 @@ } }, "@typescript-eslint/types": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", - "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==" + "version": "3.10.1" }, "@typescript-eslint/typescript-estree": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", - "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", "requires": { "@typescript-eslint/types": "3.10.1", "@typescript-eslint/visitor-keys": "3.10.1", @@ -29214,16 +28527,15 @@ }, "@typescript-eslint/visitor-keys": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", - "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", "requires": { "eslint-visitor-keys": "^1.1.0" } }, + "eslint-visitor-keys": { + "version": "1.3.0" + }, "semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { "lru-cache": "^6.0.0" } @@ -29232,8 +28544,6 @@ }, "eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -29241,161 +28551,151 @@ }, "eslint-utils": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "requires": { "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0" + } } }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + "version": "2.1.0" }, "eslint-webpack-plugin": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", - "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", + "version": "2.6.0", "requires": { - "@types/eslint": "^7.2.6", + "@types/eslint": "^7.28.2", "arrify": "^2.0.1", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", + "jest-worker": "^27.3.1", + "micromatch": "^4.0.4", "normalize-path": "^3.0.0", - "schema-utils": "^3.0.0" + "schema-utils": "^3.1.1" }, "dependencies": { + "has-flag": { + "version": "4.0.0" + }, + "jest-worker": { + "version": "27.5.1", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } + }, + "supports-color": { + "version": "8.1.1", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "espree": { + "version": "7.3.1", + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0" } } }, "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "version": "4.0.1" }, "esquery": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "requires": { "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + "version": "5.3.0" } } }, "esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { "estraverse": "^5.2.0" }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + "version": "5.3.0" } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "version": "4.3.0" }, "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + "version": "1.0.1" }, "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "version": "2.0.3" }, "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "version": "1.8.1" }, "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "version": "4.0.7" }, "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + "version": "3.3.0" }, "eventsource": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", "requires": { "original": "^1.0.0" } }, "evp_bytestokey": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" + "version": "0.3.6" }, "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "version": "5.1.1", + "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" - } } }, + "exenv": { + "version": "1.2.2" + }, "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + "version": "0.1.2" }, "expand-brackets": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -29408,95 +28708,29 @@ "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" } }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.0.0" } } }, "expect": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", "requires": { "@jest/types": "^26.6.2", "ansi-styles": "^4.0.0", @@ -29508,38 +28742,30 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" } } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.3", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -29553,13 +28779,13 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", @@ -29567,53 +28793,50 @@ }, "dependencies": { "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "version": "1.1.1" }, "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.0.0" + }, + "safe-buffer": { + "version": "5.2.1" } } }, "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "version": "1.6.0", "requires": { - "type": "^2.0.0" + "type": "^2.5.0" }, "dependencies": { "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + "version": "2.6.0" } } }, "extend-shallow": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "extglob": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -29627,109 +28850,125 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { "is-descriptor": "^1.0.0" } }, "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "is-accessor-descriptor": { + "version": "1.0.0", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extract-zip": { + "version": "2.0.1", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "dev": true, + "requires": { + "pump": "^3.0.0" + } } } }, "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "version": "3.1.3" + }, + "fast-diff": { + "version": "1.2.0", + "dev": true }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.11", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "version": "2.1.0" }, "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "version": "2.0.6" }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", "requires": { "reusify": "^1.0.4" } }, "faye-websocket": { "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "requires": { "websocket-driver": ">=0.5.1" } }, "fb-watchman": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "requires": { "bser": "2.1.1" } }, + "fd-slicer": { + "version": "1.1.0", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + "version": "3.5.2" + }, + "file-entry-cache": { + "version": "6.0.1", + "requires": { + "flat-cache": "^3.0.4" + } }, "file-loader": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", - "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -29744,30 +28983,22 @@ }, "filereader-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filereader-stream/-/filereader-stream-2.0.0.tgz", - "integrity": "sha1-sw1aW/bRTGONfrVeGTq7mG+ASKE=", "requires": { "from2": "^2.1.0", "typedarray-to-buffer": "^3.0.4" } }, "filesize": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", - "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" + "version": "6.1.0" }, "fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "finalhandler": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -29780,111 +29011,73 @@ "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.0.0" } } }, "find-cache-dir": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "requires": { "commondir": "^1.0.1", "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" }, "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "make-dir": { + "version": "2.1.0", "requires": { - "p-limit": "^2.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } + "semver": { + "version": "5.7.1" } } }, + "find-root": { + "version": "1.1.0" + }, "find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, + "flat-cache": { + "version": "3.0.4", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" + "version": "3.2.5" }, "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" + "version": "1.0.3" }, "flush-write-stream": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" } }, "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" + "version": "1.14.9" }, "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "version": "1.0.2" }, "fork-ts-checker-webpack-plugin": { "version": "4.1.6", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", - "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", "requires": { "@babel/code-frame": "^7.5.5", "chalk": "^2.4.1", @@ -29897,8 +29090,6 @@ "dependencies": { "braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -29914,8 +29105,6 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } @@ -29924,8 +29113,6 @@ }, "fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -29935,31 +29122,20 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } } } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } @@ -29968,8 +29144,6 @@ }, "micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -29986,10 +29160,11 @@ "to-regex": "^3.0.2" } }, + "semver": { + "version": "5.7.1" + }, "to-regex-range": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -29998,9 +29173,7 @@ } }, "form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "version": "3.0.1", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -30008,36 +29181,30 @@ } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "version": "0.2.0" }, "fragment-cache": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { "map-cache": "^0.2.2" } }, "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "version": "0.5.2" }, "from2": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "dev": true + }, "fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -30046,18 +29213,13 @@ } }, "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "devOptional": true, + "version": "2.1.0", "requires": { - "minipass": "^2.6.0" + "minipass": "^3.0.0" } }, "fs-write-stream-atomic": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "requires": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -30066,9 +29228,7 @@ } }, "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "version": "1.0.0" }, "fsevents": { "version": "2.3.2", @@ -30077,45 +29237,52 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.1" }, "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + "version": "1.0.1" }, "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "version": "3.0.2", "devOptional": true, "requires": { - "aproba": "^1.0.3", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "devOptional": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "devOptional": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + "version": "1.0.0-beta.2" }, "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "version": "2.0.5" }, "get-intrinsic": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -30123,32 +29290,27 @@ } }, "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + "version": "3.0.2" }, "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + "version": "0.1.0" }, "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "6.0.1", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", "requires": { - "pump": "^3.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" } }, "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "version": "2.0.6" }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -30160,24 +29322,18 @@ }, "glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } }, "global-modules": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "requires": { "global-prefix": "^3.0.0" } }, "global-prefix": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "requires": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -30186,8 +29342,6 @@ "dependencies": { "which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" } @@ -30195,93 +29349,71 @@ } }, "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "version": "11.12.0" }, "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.1.0", "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "dependencies": { "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + "version": "5.2.0" } } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.9" }, "growly": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "optional": true }, "gzip-size": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", "requires": { "duplexer": "^0.1.1", "pify": "^4.0.1" } }, "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + "version": "2.0.1" }, "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" + "version": "1.6.2" }, "has": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { "function-bind": "^1.1.1" } }, "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + "version": "1.0.1" }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "version": "3.0.0" }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "version": "1.0.2" + }, + "has-tostringtag": { + "version": "1.0.0", + "requires": { + "has-symbols": "^1.0.2" + } }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "devOptional": true }, "has-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -30290,8 +29422,6 @@ }, "has-values": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -30299,16 +29429,12 @@ "dependencies": { "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } @@ -30317,8 +29443,6 @@ }, "kind-of": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { "is-buffer": "^1.1.5" } @@ -30327,8 +29451,6 @@ }, "hash-base": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -30337,8 +29459,6 @@ "dependencies": { "readable-stream": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -30346,35 +29466,25 @@ } }, "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "version": "5.2.1" } } }, "hash.js": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + "version": "1.2.0" }, "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + "version": "1.1.0" }, "hmac-drbg": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -30383,26 +29493,18 @@ }, "hoist-non-react-statics": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "requires": { "react-is": "^16.7.0" } }, "hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + "version": "0.1.4" }, "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "version": "2.8.9" }, "hpack.js": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "requires": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -30411,37 +29513,25 @@ } }, "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + "version": "1.0.0" }, "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + "version": "1.0.0" }, "html-encoding-sniffer": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "requires": { "whatwg-encoding": "^1.0.5" } }, "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + "version": "1.4.0" }, "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + "version": "2.0.2" }, "html-minifier-terser": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", "requires": { "camel-case": "^4.1.1", "clean-css": "^4.2.3", @@ -30450,12 +29540,15 @@ "param-case": "^3.0.3", "relateurl": "^0.2.7", "terser": "^4.6.3" + }, + "dependencies": { + "commander": { + "version": "4.1.1" + } } }, "html-webpack-plugin": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", - "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", "requires": { "@types/html-minifier-terser": "^5.0.0", "@types/tapable": "^1.0.5", @@ -30466,71 +29559,79 @@ "pretty-error": "^2.1.1", "tapable": "^1.1.3", "util.promisify": "1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } } }, "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "version": "6.1.0", "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" }, "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "dom-serializer": { + "version": "1.3.2", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "domelementtype": { + "version": "2.2.0" + }, + "domutils": { + "version": "2.8.0", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } } } }, "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + "version": "1.2.7" }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } + "toidentifier": "1.0.1" } }, "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + "version": "0.5.5" }, "http-proxy": { "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "requires": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -30539,8 +29640,6 @@ }, "http-proxy-agent": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "requires": { "@tootallnate/once": "1", "agent-base": "6", @@ -30549,8 +29648,6 @@ }, "http-proxy-middleware": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "requires": { "http-proxy": "^1.17.0", "is-glob": "^4.0.0", @@ -30560,8 +29657,6 @@ "dependencies": { "braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -30577,8 +29672,6 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } @@ -30587,8 +29680,6 @@ }, "fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -30598,31 +29689,20 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } } } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } @@ -30631,8 +29711,6 @@ }, "micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -30651,8 +29729,6 @@ }, "to-regex-range": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -30661,14 +29737,10 @@ } }, "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + "version": "1.0.0" }, "https-proxy-agent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "requires": { "agent-base": "6", "debug": "4" @@ -30676,98 +29748,75 @@ }, "human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "husky": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", - "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", + "version": "7.0.2", "dev": true }, "iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "icss-utils": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "requires": { "postcss": "^7.0.14" } }, "identity-obj-proxy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", "requires": { "harmony-reflect": "^1.4.6" } }, "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "version": "1.2.1" }, "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + "version": "0.1.5" }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "version": "4.0.6" }, "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "devOptional": true, + "version": "3.0.4", + "dev": true, "requires": { "minimatch": "^3.0.4" } }, "immer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", - "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" + "version": "8.0.1" }, "import-cwd": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", "requires": { "import-from": "^2.1.0" } }, "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "version": "3.3.0", "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, "import-from": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "requires": { "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0" + } } }, "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "version": "3.1.0", "requires": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -30775,8 +29824,6 @@ "dependencies": { "pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { "find-up": "^4.0.0" } @@ -30784,48 +29831,32 @@ } }, "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "version": "0.1.4" }, "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "version": "4.0.0" }, "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + "version": "1.0.1" }, "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + "version": "1.0.4" }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "version": "2.0.4" }, "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "version": "1.3.8" }, "internal-ip": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "requires": { "default-gateway": "^4.2.0", "ipaddr.js": "^1.9.0" @@ -30833,107 +29864,82 @@ }, "internal-slot": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", "requires": { "get-intrinsic": "^1.1.0", "has": "^1.0.3", "side-channel": "^1.0.4" } }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + "version": "1.1.5" }, "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + "version": "2.1.0" }, "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + "version": "1.9.1" }, "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + "version": "2.1.0" }, "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "version": "0.1.6", "requires": { - "kind-of": "^6.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "version": "1.1.1", "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "version": "0.2.1" }, "is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + "version": "1.0.4", + "requires": { + "has-bigints": "^1.0.1" + } }, "is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "optional": true, "requires": { "binary-extensions": "^2.0.0" } }, "is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "version": "1.1.2", "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "version": "1.1.6" }, "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + "version": "1.2.4" }, "is-ci": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "requires": { "ci-info": "^2.0.0" } }, "is-color-stop": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", "requires": { "css-color-names": "^0.0.4", "hex-color-regex": "^1.1.0", @@ -30944,253 +29950,193 @@ } }, "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "version": "2.8.1", "requires": { "has": "^1.0.3" } }, "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "version": "0.1.4", "requires": { - "kind-of": "^6.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" + "version": "1.0.5", + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "0.1.6", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0" + } } }, "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + "version": "0.3.1" }, "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + "version": "2.2.1" }, "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } + "version": "0.1.1" }, "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "version": "2.1.1" }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "devOptional": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "3.0.0" }, "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + "version": "2.1.0" }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", "requires": { "is-extglob": "^2.1.1" } }, "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + "version": "1.0.0" }, "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + "version": "2.0.2" }, "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "version": "7.0.0" }, "is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" + "version": "1.0.6", + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + "version": "1.0.1" }, "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + "version": "2.2.0" }, "is-path-in-cwd": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "requires": { "is-path-inside": "^2.1.0" } }, "is-path-inside": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", "requires": { "path-is-inside": "^1.0.2" } }, "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + "version": "1.1.0" }, "is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { "isobject": "^3.0.1" } }, "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + "version": "1.0.1" }, "is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "version": "1.1.4", "requires": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" + "has-tostringtag": "^1.0.0" } }, "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + "version": "1.0.0" }, "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + "version": "1.1.0" }, "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + "version": "2.1.0" + }, + "is-shared-array-buffer": { + "version": "1.0.1" }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + "version": "2.0.1" }, "is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" + "version": "1.0.7", + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-symbol": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "requires": { "has-symbols": "^1.0.2" } }, "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "version": "1.0.0" }, "is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, - "is-windows": { + "is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-windows": { + "version": "1.0.2" }, "is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "requires": { "is-docker": "^2.0.0" } }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "version": "1.0.0" }, "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "version": "2.0.0" }, "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "version": "3.0.1" }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" + "version": "3.2.0" }, "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "version": "5.1.0", "requires": { - "@babel/core": "^7.7.5", + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } } }, "istanbul-lib-report": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "requires": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", @@ -31198,27 +30144,10 @@ }, "dependencies": { "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -31226,9 +30155,7 @@ } }, "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", "requires": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -31236,45 +30163,19 @@ }, "dependencies": { "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.4", "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, - "jest": { - "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", - "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", - "requires": { - "@jest/core": "^26.6.0", - "import-local": "^3.0.2", - "jest-cli": "^26.6.0" - } - }, - "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - } - }, "jest-circus": { "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", - "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", "requires": { "@babel/traverse": "^7.1.0", "@jest/environment": "^26.6.0", @@ -31301,81 +30202,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31383,26 +30215,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -31411,8 +30235,6 @@ }, "jest-config": { "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", "requires": { "@babel/core": "^7.1.0", "@jest/test-sequencer": "^26.6.3", @@ -31436,16 +30258,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31453,26 +30271,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "jest-resolve": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "requires": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", @@ -31484,64 +30294,16 @@ "slash": "^3.0.0" } }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" } } }, "jest-diff": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", "requires": { "chalk": "^4.0.0", "diff-sequences": "^26.6.2", @@ -31551,16 +30313,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31568,26 +30326,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -31596,16 +30346,12 @@ }, "jest-docblock": { "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", "requires": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", @@ -31616,16 +30362,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31633,26 +30375,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -31661,8 +30395,6 @@ }, "jest-environment-jsdom": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", "requires": { "@jest/environment": "^26.6.2", "@jest/fake-timers": "^26.6.2", @@ -31675,8 +30407,6 @@ }, "jest-environment-node": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", "requires": { "@jest/environment": "^26.6.2", "@jest/fake-timers": "^26.6.2", @@ -31687,14 +30417,10 @@ } }, "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==" + "version": "26.3.0" }, "jest-haste-map": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", "requires": { "@jest/types": "^26.6.2", "@types/graceful-fs": "^4.1.2", @@ -31714,8 +30440,6 @@ }, "jest-jasmine2": { "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", "requires": { "@babel/traverse": "^7.1.0", "@jest/environment": "^26.6.2", @@ -31739,16 +30463,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31756,26 +30476,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -31784,8 +30496,6 @@ }, "jest-leak-detector": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", "requires": { "jest-get-type": "^26.3.0", "pretty-format": "^26.6.2" @@ -31793,8 +30503,6 @@ }, "jest-matcher-utils": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", "requires": { "chalk": "^4.0.0", "jest-diff": "^26.6.2", @@ -31804,16 +30512,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31821,26 +30525,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -31849,8 +30545,6 @@ }, "jest-message-util": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", "requires": { "@babel/code-frame": "^7.0.0", "@jest/types": "^26.6.2", @@ -31865,16 +30559,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31882,26 +30572,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -31910,8 +30592,6 @@ }, "jest-mock": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "requires": { "@jest/types": "^26.6.2", "@types/node": "*" @@ -31919,19 +30599,13 @@ }, "jest-pnp-resolver": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", "requires": {} }, "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==" + "version": "26.0.0" }, "jest-resolve": { "version": "26.6.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", - "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", "requires": { "@jest/types": "^26.6.0", "chalk": "^4.0.0", @@ -31945,16 +30619,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31962,90 +30632,26 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" } } }, - "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - } - }, "jest-runner": { "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", "requires": { "@jest/console": "^26.6.2", "@jest/environment": "^26.6.2", @@ -32071,16 +30677,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -32088,26 +30690,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "jest-resolve": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "requires": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", @@ -32119,64 +30713,16 @@ "slash": "^3.0.0" } }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" } } }, "jest-runtime": { "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", "requires": { "@jest/console": "^26.6.2", "@jest/environment": "^26.6.2", @@ -32209,43 +30755,42 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, + "camelcase": { + "version": "5.3.1" + }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, + "cliui": { + "version": "6.0.0", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "jest-resolve": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "requires": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", @@ -32257,64 +30802,53 @@ "slash": "^3.0.0" } }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "strip-bom": { + "version": "4.0.0" + }, + "supports-color": { + "version": "7.2.0", "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "has-flag": "^4.0.0" } }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "wrap-ansi": { + "version": "6.2.0", "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "y18n": { + "version": "4.0.3" + }, + "yargs": { + "version": "15.4.1", "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "yargs-parser": { + "version": "18.1.3", "requires": { - "has-flag": "^4.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" } } }, "jest-serializer": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", "requires": { "@types/node": "*", "graceful-fs": "^4.2.4" @@ -32322,8 +30856,6 @@ }, "jest-snapshot": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", "requires": { "@babel/types": "^7.0.0", "@jest/types": "^26.6.2", @@ -32345,16 +30877,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -32362,26 +30890,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "jest-resolve": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", "requires": { "@jest/types": "^26.6.2", "chalk": "^4.0.0", @@ -32393,72 +30913,22 @@ "slash": "^3.0.0" } }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, "semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { "lru-cache": "^6.0.0" } }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" } } }, "jest-util": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "requires": { "@jest/types": "^26.6.2", "@types/node": "*", @@ -32470,16 +30940,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -32487,26 +30953,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -32515,8 +30973,6 @@ }, "jest-validate": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", "requires": { "@jest/types": "^26.6.2", "camelcase": "^6.0.0", @@ -32528,16 +30984,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -32545,26 +30997,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -32573,8 +31017,6 @@ }, "jest-watch-typeahead": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", - "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", "requires": { "ansi-escapes": "^4.3.1", "chalk": "^4.0.0", @@ -32585,23 +31027,14 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -32609,34 +31042,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -32645,8 +31062,6 @@ }, "jest-watcher": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", "requires": { "@jest/test-result": "^26.6.2", "@jest/types": "^26.6.2", @@ -32659,16 +31074,12 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -32676,26 +31087,18 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -32704,8 +31107,6 @@ }, "jest-worker": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -32713,43 +31114,28 @@ }, "dependencies": { "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } } } }, - "jquery": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", - "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" - }, "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "version": "4.0.0" }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "jsdom": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", - "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "version": "16.7.0", "requires": { "abab": "^2.0.5", "acorn": "^8.2.4", @@ -32776,138 +31162,93 @@ "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.5.0", - "ws": "^7.4.5", + "ws": "^7.4.6", "xml-name-validator": "^3.0.0" }, "dependencies": { "acorn": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.2.4.tgz", - "integrity": "sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg==" + "version": "8.7.0" } } }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "version": "2.5.2" }, "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "version": "1.0.2" }, "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "version": "2.3.1" }, "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "version": "0.4.1" }, "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + "version": "1.0.1" }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.0", "requires": { "minimist": "^1.2.5" } }, "jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" } }, "jsx-ast-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", - "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "version": "3.2.1", "requires": { - "array-includes": "^3.1.2", + "array-includes": "^3.1.3", "object.assign": "^4.1.2" } }, "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + "version": "1.0.1" }, "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "version": "6.0.3" }, "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + "version": "3.0.3" }, "klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==" + "version": "2.0.5" }, "language-subtag-registry": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", - "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" + "version": "0.3.21" }, "language-tags": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", "requires": { "language-subtag-registry": "~0.3.2" } }, "last-call-webpack-plugin": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", "requires": { "lodash": "^4.17.5", "webpack-sources": "^1.1.0" } }, "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + "version": "3.1.0" }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "version": "1.2.4" }, "lint-staged": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz", - "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==", + "version": "11.1.1", "dev": true, "requires": { "chalk": "^4.1.1", @@ -32929,17 +31270,13 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -32948,8 +31285,6 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" @@ -32957,90 +31292,14 @@ }, "color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -33049,201 +31308,53 @@ } }, "listr2": { - "version": "3.8.4", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.8.4.tgz", - "integrity": "sha512-DX+iKRcxaGbBjoLJBQlGceZoqdhV6Z54wpsvIVoVKNJ/lEXK8KhGhLaZnIGKRQmDmtJOtyNSnnKFUS1qn+jqsw==", + "version": "3.14.0", "dev": true, "requires": { "cli-truncate": "^2.1.0", - "colorette": "^1.2.2", - "figures": "^3.2.0", - "indent-string": "^4.0.0", + "colorette": "^2.0.16", "log-update": "^4.0.0", "p-map": "^4.0.0", - "rxjs": "^6.6.7", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", "through": "^2.3.8", "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - } } }, "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + "version": "2.4.0" }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.2", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - } + "json5": "^2.1.2" } }, "locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { "p-locate": "^4.1.0" } }, "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash-es": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz", - "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==" + "version": "4.17.21" }, "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + "version": "3.0.0" }, "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + "version": "4.0.8" }, "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + "version": "4.1.2" }, "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "version": "4.6.2" }, "lodash.template": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "requires": { "lodash._reinterpolate": "^3.0.0", "lodash.templatesettings": "^4.0.0" @@ -33251,26 +31362,18 @@ }, "lodash.templatesettings": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "requires": { "lodash._reinterpolate": "^3.0.0" } }, "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + "version": "4.4.2" }, "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + "version": "4.5.0" }, "log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -33279,17 +31382,13 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -33298,8 +31397,6 @@ }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" @@ -33307,20 +31404,14 @@ }, "color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -33330,8 +31421,6 @@ }, "log-update": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "requires": { "ansi-escapes": "^4.3.0", @@ -33342,32 +31431,13 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" @@ -33375,124 +31445,90 @@ }, "color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "slice-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } + }, + "wrap-ansi": { + "version": "6.2.0", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } } } }, "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" + "version": "1.8.0" + }, + "long": { + "version": "4.0.0" }, "loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } }, "lower-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "requires": { "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1" } } }, "lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, + "lz-string": { + "version": "1.4.4", + "dev": true + }, "magic-string": { "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", "requires": { "sourcemap-codec": "^1.4.4" } }, "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" } }, "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "version": "1.0.12", "requires": { - "tmpl": "1.0.x" + "tmpl": "1.0.5" } }, "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "version": "0.2.2" }, "map-visit": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { "object-visit": "^1.0.0" } }, "md5.js": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -33500,53 +31536,35 @@ } }, "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + "version": "2.0.4" }, "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "version": "0.3.0" }, "memory-fs": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" } }, "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "version": "1.0.1" }, "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "version": "2.0.0" }, "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "version": "1.4.1" }, "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "version": "1.1.2" }, "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + "version": "0.1.1" }, "micromatch": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "requires": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -33554,175 +31572,120 @@ }, "miller-rabin": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" }, "dependencies": { "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.0" } } }, "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "version": "1.6.0" }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + "version": "1.51.0" }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.34", "requires": { - "mime-db": "1.44.0" + "mime-db": "1.51.0" } }, "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + "version": "2.1.0" }, "mimic-response": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", "devOptional": true }, + "min-indent": { + "version": "1.0.1", + "dev": true + }, "mini-css-extract-plugin": { "version": "0.11.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", - "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", "requires": { "loader-utils": "^1.1.0", "normalize-url": "1.9.1", "schema-utils": "^1.0.0", "webpack-sources": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } } }, "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "version": "1.0.1" }, "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + "version": "1.0.1" }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.5" }, "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "devOptional": true, + "version": "3.1.3", "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" } }, "minipass-collect": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "requires": { "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "minipass-flush": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "requires": { "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "minipass-pipeline": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "requires": { "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "devOptional": true, + "version": "2.1.2", "requires": { - "minipass": "^2.9.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" } }, "mississippi": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -33738,25 +31701,27 @@ }, "mixin-deep": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "mkdirp": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { "minimist": "^1.2.5" } }, "move-concurrently": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "requires": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -33764,42 +31729,38 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "requires": { + "glob": "^7.1.3" + } + } } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.2" }, "multicast-dns": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "requires": { "dns-packet": "^1.3.1", "thunky": "^1.0.2" } }, "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + "version": "1.1.0" }, "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "version": "2.15.0", "devOptional": true }, "nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" + "version": "3.3.1" }, "nanomatch": { "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -33816,22 +31777,16 @@ }, "native-url": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", - "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", "requires": { "querystring": "^0.2.0" } }, "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "version": "1.4.0" }, "needle": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz", - "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==", - "devOptional": true, + "version": "2.9.1", + "dev": true, "requires": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", @@ -33839,10 +31794,8 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "devOptional": true, + "version": "3.2.7", + "dev": true, "requires": { "ms": "^2.1.1" } @@ -33850,60 +31803,58 @@ } }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "0.6.3" }, "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "version": "2.6.2" }, "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + "version": "1.0.0" }, "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "version": "1.0.5" }, "no-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "requires": { "lower-case": "^2.0.2", "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1" } } }, "node-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", - "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" + "version": "2.6.7", + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3" + }, + "webidl-conversions": { + "version": "3.0.1" + }, + "whatwg-url": { + "version": "5.0.0", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } }, "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + "version": "0.10.0" }, "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + "version": "0.4.0" }, "node-libs-browser": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "requires": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -33931,21 +31882,12 @@ }, "dependencies": { "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "version": "1.4.1" } } }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, "node-notifier": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", "optional": true, "requires": { "growly": "^1.3.0", @@ -33958,8 +31900,6 @@ "dependencies": { "semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "optional": true, "requires": { "lru-cache": "^6.0.0" @@ -33969,8 +31909,6 @@ }, "node-pre-gyp": { "version": "0.14.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "requires": { "detect-libc": "^1.0.2", @@ -33983,48 +31921,167 @@ "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4.4.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.7", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "chownr": { + "version": "1.1.4", + "dev": true + }, + "fs-minipass": { + "version": "1.2.7", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "gauge": { + "version": "2.7.4", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "minipass": { + "version": "2.9.0", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "nopt": { + "version": "4.0.3", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npmlog": { + "version": "4.1.2", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "dev": true + }, + "semver": { + "version": "5.7.1", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "tar": { + "version": "4.4.19", + "dev": true, + "requires": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + } + }, + "yallist": { + "version": "3.1.1", + "dev": true + } } }, "node-releases": { - "version": "1.1.72", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", - "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==" + "version": "2.0.2" }, "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "version": "5.0.0", "devOptional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1" } }, "normalize-package-data": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1" + } } }, "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "version": "3.0.0" }, "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + "version": "0.1.2" }, "normalize-url": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "requires": { "object-assign": "^4.0.1", "prepend-http": "^1.0.0", @@ -34032,31 +32089,20 @@ "sort-keys": "^1.0.0" } }, - "nouislider": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/nouislider/-/nouislider-9.2.0.tgz", - "integrity": "sha1-6HxQfeKwtNB1A4taQlR8fbvrr2k=" - }, "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "devOptional": true, + "version": "1.1.2", + "dev": true, "requires": { "npm-normalize-package-bin": "^1.0.1" } }, "npm-normalize-package-bin": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "devOptional": true + "dev": true }, "npm-packlist": { "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "devOptional": true, + "dev": true, "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1", @@ -34065,108 +32111,55 @@ }, "npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "requires": { "path-key": "^3.0.0" } }, "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "version": "5.0.1", "devOptional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" } }, "nth-check": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "requires": { "boolbase": "~1.0.0" } }, "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + "version": "1.2.2" }, "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "devOptional": true + "dev": true }, "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + "version": "2.2.0" }, "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "version": "4.1.1" }, "object-copy": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "define-property": { + "version": "0.2.5", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } + "is-descriptor": "^0.1.0" } }, "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } @@ -34174,36 +32167,26 @@ } }, "object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + "version": "1.12.0" }, "object-is": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "version": "1.1.1" }, "object-visit": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { "isobject": "^3.0.0" } }, "object.assign": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -34212,92 +32195,69 @@ } }, "object.entries": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", - "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "version": "1.1.5", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" + "es-abstract": "^1.19.1" } }, "object.fromentries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", - "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "version": "2.0.5", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" + "es-abstract": "^1.19.1" } }, "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "version": "2.1.3", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" + "es-abstract": "^1.19.1" } }, "object.pick": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { "isobject": "^3.0.1" } }, "object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "version": "1.1.5", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" + "es-abstract": "^1.19.1" } }, "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + "version": "1.1.2" }, "on-finished": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "requires": { "ee-first": "1.1.1" } }, "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + "version": "1.0.2" }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" } }, "onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "requires": { "mimic-fn": "^2.1.0" } }, "open": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -34305,132 +32265,96 @@ }, "opn": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "requires": { "is-wsl": "^1.1.0" }, "dependencies": { "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + "version": "1.1.0" } } }, "optimize-css-assets-webpack-plugin": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", - "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", "requires": { "cssnano": "^4.1.10", "last-call-webpack-plugin": "^3.0.0" } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, "original": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "requires": { "url-parse": "^1.4.3" } }, "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + "version": "0.3.0" }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "devOptional": true + "dev": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "devOptional": true + "dev": true }, "osenv": { "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "devOptional": true, + "dev": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" } }, "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==" + "version": "2.2.0" }, "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "version": "1.0.0" }, "p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { "p-limit": "^2.2.0" } }, "p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "requires": { "aggregate-error": "^3.0.0" } }, "p-retry": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "requires": { "retry": "^0.12.0" } }, "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "version": "2.2.0" }, "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "version": "1.0.11" }, "parallel-transform": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "requires": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -34439,39 +32363,24 @@ }, "param-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1" } } }, "parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "requires": { "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - } } }, "parse-asn1": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "requires": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -34481,94 +32390,64 @@ } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.2.0", "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "version": "6.0.1" }, "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "version": "1.3.3" }, "pascal-case": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" + "version": "2.3.1" } } }, "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + "version": "0.1.1" }, "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + "version": "0.0.1" }, "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + "version": "1.0.2" }, "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "4.0.0" }, "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "version": "1.0.1" }, "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "version": "1.0.2" }, "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "version": "3.1.1" }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "version": "1.0.7" }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "version": "0.1.7" }, "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "version": "4.0.0" }, "pbkdf2": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -34577,152 +32456,96 @@ "sha.js": "^2.4.8" } }, + "pend": { + "version": "1.2.0", + "dev": true + }, "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "version": "2.1.0" + }, + "picocolors": { + "version": "1.0.0" }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + "version": "2.3.1" }, "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "version": "4.0.1" }, "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "version": "2.0.4" }, "pinkie-promise": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { "pinkie": "^2.0.0" } }, "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } + "version": "4.0.5" }, "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "version": "3.0.0", "requires": { - "find-up": "^2.1.0" + "find-up": "^3.0.0" }, "dependencies": { "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "3.0.0", "requires": { - "locate-path": "^2.0.0" + "locate-path": "^3.0.0" } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "3.0.0", "requires": { - "p-locate": "^2.0.0", + "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "3.0.0", "requires": { - "p-limit": "^1.1.0" + "p-limit": "^2.0.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "version": "3.0.0" } } }, "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "version": "3.1.0", "requires": { - "find-up": "^2.1.0" + "find-up": "^3.0.0" }, "dependencies": { "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "3.0.0", "requires": { - "locate-path": "^2.0.0" + "locate-path": "^3.0.0" } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "3.0.0", "requires": { - "p-locate": "^2.0.0", + "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "3.0.0", "requires": { - "p-limit": "^1.1.0" + "p-limit": "^2.0.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "version": "3.0.0" } } }, "please-upgrade-node": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", "dev": true, "requires": { "semver-compare": "^1.0.0" @@ -34730,21 +32553,12 @@ }, "pnp-webpack-plugin": { "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", "requires": { "ts-pnp": "^1.1.6" } }, - "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" - }, "portfinder": { "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "requires": { "async": "^2.6.2", "debug": "^3.1.1", @@ -34753,8 +32567,6 @@ "dependencies": { "debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } @@ -34762,39 +32574,25 @@ } }, "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + "version": "0.1.1" }, "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.39", "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "picocolors": { + "version": "0.2.1" }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } + "source-map": { + "version": "0.6.1" } } }, "postcss-attribute-case-insensitive": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", "requires": { "postcss": "^7.0.2", "postcss-selector-parser": "^6.0.2" @@ -34802,16 +32600,12 @@ }, "postcss-browser-comments": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", "requires": { "postcss": "^7" } }, "postcss-calc": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "requires": { "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", @@ -34820,8 +32614,6 @@ }, "postcss-color-functional-notation": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -34829,8 +32621,6 @@ }, "postcss-color-gray": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", "requires": { "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.5", @@ -34839,8 +32629,6 @@ }, "postcss-color-hex-alpha": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", "requires": { "postcss": "^7.0.14", "postcss-values-parser": "^2.0.1" @@ -34848,8 +32636,6 @@ }, "postcss-color-mod-function": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", "requires": { "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.2", @@ -34858,8 +32644,6 @@ }, "postcss-color-rebeccapurple": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -34867,8 +32651,6 @@ }, "postcss-colormin": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "requires": { "browserslist": "^4.0.0", "color": "^3.0.0", @@ -34878,40 +32660,30 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-convert-values": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-custom-media": { "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", "requires": { "postcss": "^7.0.14" } }, "postcss-custom-properties": { "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", "requires": { "postcss": "^7.0.17", "postcss-values-parser": "^2.0.1" @@ -34919,22 +32691,16 @@ }, "postcss-custom-selectors": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", "requires": { "postcss": "^7.0.2", "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + "version": "2.0.0" }, "postcss-selector-parser": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "requires": { "cssesc": "^2.0.0", "indexes-of": "^1.0.1", @@ -34945,22 +32711,16 @@ }, "postcss-dir-pseudo-class": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", "requires": { "postcss": "^7.0.2", "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + "version": "2.0.0" }, "postcss-selector-parser": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "requires": { "cssesc": "^2.0.0", "indexes-of": "^1.0.1", @@ -34971,40 +32731,30 @@ }, "postcss-discard-comments": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "requires": { "postcss": "^7.0.0" } }, "postcss-discard-duplicates": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "requires": { "postcss": "^7.0.0" } }, "postcss-discard-empty": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "requires": { "postcss": "^7.0.0" } }, "postcss-discard-overridden": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "requires": { "postcss": "^7.0.0" } }, "postcss-double-position-gradients": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", "requires": { "postcss": "^7.0.5", "postcss-values-parser": "^2.0.0" @@ -35012,8 +32762,6 @@ }, "postcss-env-function": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -35021,48 +32769,36 @@ }, "postcss-flexbugs-fixes": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", - "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", "requires": { "postcss": "^7.0.26" } }, "postcss-focus-visible": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", "requires": { "postcss": "^7.0.2" } }, "postcss-focus-within": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", "requires": { "postcss": "^7.0.2" } }, "postcss-font-variant": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", - "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", "requires": { "postcss": "^7.0.2" } }, "postcss-gap-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", "requires": { "postcss": "^7.0.2" } }, "postcss-image-set-function": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -35070,16 +32806,12 @@ }, "postcss-initial": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", - "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", "requires": { "postcss": "^7.0.2" } }, "postcss-lab-function": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", "requires": { "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.2", @@ -35087,45 +32819,87 @@ } }, "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "version": "2.1.2", "requires": { "cosmiconfig": "^5.0.0", "import-cwd": "^2.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0" + } } }, "postcss-loader": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", "requires": { "loader-utils": "^1.1.0", "postcss": "^7.0.0", "postcss-load-config": "^2.0.0", "schema-utils": "^1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } } }, "postcss-logical": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", "requires": { "postcss": "^7.0.2" } }, "postcss-media-minmax": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", "requires": { "postcss": "^7.0.2" } }, "postcss-merge-longhand": { "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "requires": { "css-color-names": "0.0.4", "postcss": "^7.0.0", @@ -35134,16 +32908,12 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-merge-rules": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "requires": { "browserslist": "^4.0.0", "caniuse-api": "^3.0.0", @@ -35155,8 +32925,6 @@ "dependencies": { "postcss-selector-parser": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", @@ -35167,24 +32935,18 @@ }, "postcss-minify-font-values": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-minify-gradients": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "requires": { "cssnano-util-get-arguments": "^4.0.0", "is-color-stop": "^1.0.0", @@ -35193,16 +32955,12 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-minify-params": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "requires": { "alphanum-sort": "^1.0.0", "browserslist": "^4.0.0", @@ -35213,16 +32971,12 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-minify-selectors": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "requires": { "alphanum-sort": "^1.0.0", "has": "^1.0.0", @@ -35232,8 +32986,6 @@ "dependencies": { "postcss-selector-parser": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", @@ -35244,16 +32996,12 @@ }, "postcss-modules-extract-imports": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "requires": { "postcss": "^7.0.5" } }, "postcss-modules-local-by-default": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", "requires": { "icss-utils": "^4.1.1", "postcss": "^7.0.32", @@ -35263,8 +33011,6 @@ }, "postcss-modules-scope": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "requires": { "postcss": "^7.0.6", "postcss-selector-parser": "^6.0.0" @@ -35272,8 +33018,6 @@ }, "postcss-modules-values": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "requires": { "icss-utils": "^4.0.0", "postcss": "^7.0.6" @@ -35281,16 +33025,12 @@ }, "postcss-nesting": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", "requires": { "postcss": "^7.0.2" } }, "postcss-normalize": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", "requires": { "@csstools/normalize.css": "^10.1.0", "browserslist": "^4.6.2", @@ -35301,16 +33041,12 @@ }, "postcss-normalize-charset": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "requires": { "postcss": "^7.0.0" } }, "postcss-normalize-display-values": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "requires": { "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", @@ -35318,16 +33054,12 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-normalize-positions": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "requires": { "cssnano-util-get-arguments": "^4.0.0", "has": "^1.0.0", @@ -35336,16 +33068,12 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-normalize-repeat-style": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "requires": { "cssnano-util-get-arguments": "^4.0.0", "cssnano-util-get-match": "^4.0.0", @@ -35354,16 +33082,12 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-normalize-string": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "requires": { "has": "^1.0.0", "postcss": "^7.0.0", @@ -35371,16 +33095,12 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-normalize-timing-functions": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "requires": { "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", @@ -35388,16 +33108,12 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-normalize-unicode": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "requires": { "browserslist": "^4.0.0", "postcss": "^7.0.0", @@ -35405,16 +33121,12 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-normalize-url": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", "requires": { "is-absolute-url": "^2.0.0", "normalize-url": "^3.0.0", @@ -35423,37 +33135,27 @@ }, "dependencies": { "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + "version": "3.3.0" }, "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-normalize-whitespace": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-ordered-values": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "requires": { "cssnano-util-get-arguments": "^4.0.0", "postcss": "^7.0.0", @@ -35461,32 +33163,24 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-overflow-shorthand": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", "requires": { "postcss": "^7.0.2" } }, "postcss-page-break": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", "requires": { "postcss": "^7.0.2" } }, "postcss-place": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" @@ -35494,8 +33188,6 @@ }, "postcss-preset-env": { "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", "requires": { "autoprefixer": "^9.6.1", "browserslist": "^4.6.4", @@ -35538,22 +33230,16 @@ }, "postcss-pseudo-class-any-link": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", "requires": { "postcss": "^7.0.2", "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + "version": "2.0.0" }, "postcss-selector-parser": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "requires": { "cssesc": "^2.0.0", "indexes-of": "^1.0.1", @@ -35564,8 +33250,6 @@ }, "postcss-reduce-initial": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "requires": { "browserslist": "^4.0.0", "caniuse-api": "^3.0.0", @@ -35575,8 +33259,6 @@ }, "postcss-reduce-transforms": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "requires": { "cssnano-util-get-match": "^4.0.0", "has": "^1.0.0", @@ -35585,44 +33267,34 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-replace-overflow-wrap": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", "requires": { "postcss": "^7.0.2" } }, "postcss-safe-parser": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", - "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", "requires": { "postcss": "^8.1.0" }, "dependencies": { "postcss": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz", - "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==", + "version": "8.4.7", "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" } } } }, "postcss-selector-matches": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", "requires": { "balanced-match": "^1.0.0", "postcss": "^7.0.2" @@ -35630,17 +33302,13 @@ }, "postcss-selector-not": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", - "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", "requires": { "balanced-match": "^1.0.0", "postcss": "^7.0.2" } }, "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.9", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -35648,8 +33316,6 @@ }, "postcss-svgo": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", - "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", @@ -35657,16 +33323,12 @@ }, "dependencies": { "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + "version": "3.3.1" } } }, "postcss-unique-selectors": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "requires": { "alphanum-sort": "^1.0.0", "postcss": "^7.0.0", @@ -35674,14 +33336,10 @@ } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + "version": "4.2.0" }, "postcss-values-parser": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", "requires": { "flatten": "^1.0.2", "indexes-of": "^1.0.1", @@ -35689,24 +33347,27 @@ } }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "version": "1.2.1" }, "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "version": "1.0.4" + }, + "prettier": { + "version": "2.4.1", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } }, "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + "version": "5.6.0" }, "pretty-error": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", - "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "requires": { "lodash": "^4.17.20", "renderkid": "^2.0.4" @@ -35714,8 +33375,6 @@ }, "pretty-format": { "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", "requires": { "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", @@ -35723,71 +33382,46 @@ "react-is": "^17.0.1" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.4" }, "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "version": "17.0.2" } } }, "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "version": "0.11.10" }, "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "version": "2.0.1" }, "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + "version": "2.0.3" }, "promise": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", - "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", "requires": { "asap": "~2.0.6" } }, "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + "version": "1.0.1" }, "prompts": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -35795,46 +33429,31 @@ }, "prop-types": { "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.8.1" } }, - "prop-types-extra": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", - "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", - "requires": { - "react-is": "^16.3.2", - "warning": "^4.0.0" - } - }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "dev": true + }, "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + "version": "1.0.1" }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "version": "1.8.0" }, "public-encrypt": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -35845,16 +33464,12 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.0" } } }, "pump": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -35862,8 +33477,6 @@ }, "pumpify": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "requires": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -35872,133 +33485,156 @@ "dependencies": { "pump": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1" + }, + "puppeteer": { + "version": "10.2.0", + "dev": true, + "requires": { + "debug": "4.3.1", + "devtools-protocol": "0.0.901419", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0", + "node-fetch": "2.6.1", + "pkg-dir": "4.2.0", + "progress": "2.0.1", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.0.0", + "unbzip2-stream": "1.3.3", + "ws": "7.4.6" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "node-fetch": { + "version": "2.6.1", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "progress": { + "version": "2.0.1", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "dev": true, + "requires": { + "glob": "^7.1.3" } + }, + "ws": { + "version": "7.4.6", + "dev": true, + "requires": {} } } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + "version": "1.5.1" }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.9.7" }, "query-string": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "requires": { "object-assign": "^4.1.0", "strict-uri-encode": "^1.0.0" } }, "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + "version": "0.2.1" }, "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + "version": "0.2.1" }, "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + "version": "2.2.0" }, "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "version": "1.2.3" }, "raf": { "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", "requires": { "performance-now": "^2.1.0" } }, "randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "requires": { "safe-buffer": "^5.1.0" } }, "randomfill": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "version": "1.2.1" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.3", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2" } } }, "rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "devOptional": true, + "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "dev": true + } } }, "react": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", - "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "version": "17.0.2", "requires": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" + "object-assign": "^4.1.1" } }, "react-app-polyfill": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", - "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", "requires": { "core-js": "^3.6.5", "object-assign": "^4.1.1", @@ -36008,66 +33644,8 @@ "whatwg-fetch": "^3.4.1" } }, - "react-bootstrap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.3.0.tgz", - "integrity": "sha512-GYj0c6FO9mx7DaO8Xyz2zs0IcQ6CGCtM3O6/feIoCaG4N8B0+l4eqL7stlMcLpqO4d8NG2PoMO/AbUOD+MO7mg==", - "requires": { - "@babel/runtime": "^7.4.2", - "@restart/context": "^2.1.4", - "@restart/hooks": "^0.3.21", - "@types/classnames": "^2.2.10", - "@types/invariant": "^2.2.33", - "@types/prop-types": "^15.7.3", - "@types/react": "^16.9.35", - "@types/react-transition-group": "^4.4.0", - "@types/warning": "^3.0.0", - "classnames": "^2.2.6", - "dom-helpers": "^5.1.2", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "prop-types-extra": "^1.1.0", - "react-overlays": "^4.1.0", - "react-transition-group": "^4.4.1", - "uncontrollable": "^7.0.0", - "warning": "^4.0.3" - } - }, - "react-bootstrap-table-next": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/react-bootstrap-table-next/-/react-bootstrap-table-next-3.3.5.tgz", - "integrity": "sha512-vBO+y2Y483Y1QnpxvgY8jTz6gwIPYpfc26AKZhwgESL6cpjhxSsoFGXNp3KKnT5krW5SF9zpcf/98jIJefv+RQ==", - "requires": { - "classnames": "^2.2.5", - "react-transition-group": "2.5.3", - "underscore": "1.9.1" - }, - "dependencies": { - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "requires": { - "@babel/runtime": "^7.1.2" - } - }, - "react-transition-group": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.5.3.tgz", - "integrity": "sha512-2DGFck6h99kLNr8pOFk+z4Soq3iISydwOFeeEVPjTN6+Y01CmvbWmnN02VuTWyFdnRtIDPe+wy2q6Ui8snBPZg==", - "requires": { - "dom-helpers": "^3.3.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" - } - } - } - }, "react-dev-utils": { "version": "11.0.4", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", - "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", "requires": { "@babel/code-frame": "7.10.4", "address": "1.1.2", @@ -36097,21 +33675,12 @@ "dependencies": { "@babel/code-frame": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { "@babel/highlight": "^7.10.4" } }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, "browserslist": { "version": "4.14.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", - "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", "requires": { "caniuse-lite": "^1.0.30001125", "electron-to-chromium": "^1.3.564", @@ -36120,14 +33689,10 @@ } }, "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + "version": "2.0.0" }, "globby": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -36138,141 +33703,96 @@ } }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + "version": "5.2.0" }, "loader-utils": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } + "node-releases": { + "version": "1.1.77" } } }, + "react-dnd": { + "version": "14.0.2", + "requires": { + "@react-dnd/invariant": "^2.0.0", + "@react-dnd/shallowequal": "^2.0.0", + "dnd-core": "14.0.0", + "fast-deep-equal": "^3.1.3", + "hoist-non-react-statics": "^3.3.2" + } + }, + "react-dnd-html5-backend": { + "version": "14.0.0", + "requires": { + "dnd-core": "14.0.0" + } + }, "react-dom": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", - "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "version": "17.0.2", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" + "scheduler": "^0.20.2" + } + }, + "react-error-boundary": { + "version": "3.1.4", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5" } }, "react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + "version": "6.0.10" + }, + "react-fast-compare": { + "version": "3.2.0" }, "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "version": "16.13.1" }, "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + "version": "3.0.4" }, - "react-nouislider": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/react-nouislider/-/react-nouislider-2.0.1.tgz", - "integrity": "sha512-/K5cHKkvsvZ/fwgFATxkORAEtuiWVrQOqNchEInRn7qlv9mDh+LEq+NydFu91v7Cy2XjHzVPD9ZU12wg5t9yCg==", + "react-modal": { + "version": "3.14.4", "requires": { - "nouislider": "^9.2.0" + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" } }, - "react-overlays": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-4.1.0.tgz", - "integrity": "sha512-vdRpnKe0ckWOOD9uWdqykLUPHLPndIiUV7XfEKsi5008xiyHCfL8bxsx4LbMrfnxW1LzRthLyfy50XYRFNQqqw==", + "react-popper": { + "version": "2.2.5", "requires": { - "@babel/runtime": "^7.4.5", - "@popperjs/core": "^2.0.0", - "@restart/hooks": "^0.3.12", - "@types/warning": "^3.0.0", - "dom-helpers": "^5.1.0", - "prop-types": "^15.7.2", - "uncontrollable": "^7.0.0", - "warning": "^4.0.3" + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" } }, "react-redux": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-6.0.1.tgz", - "integrity": "sha512-T52I52Kxhbqy/6TEfBv85rQSDz6+Y28V/pf52vDWs1YRXG19mcFOGfHnY2HsNFHyhP+ST34Aih98fvt6tqwVcQ==", + "version": "7.2.4", "requires": { - "@babel/runtime": "^7.3.1", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.2.4", + "@babel/runtime": "^7.12.1", + "@types/react-redux": "^7.1.16", + "hoist-non-react-statics": "^3.3.2", "loose-envify": "^1.4.0", "prop-types": "^15.7.2", - "react-is": "^16.8.2" + "react-is": "^16.13.1" } }, "react-refresh": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", - "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" + "version": "0.8.3" }, "react-scripts": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz", - "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==", "requires": { "@babel/core": "7.12.3", "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", @@ -36337,8 +33857,6 @@ "dependencies": { "@babel/core": { "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", "requires": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.12.1", @@ -36359,69 +33877,285 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.1" } } }, - "@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", - "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==", + "@jest/core": { + "version": "26.6.3", "requires": { - "ansi-html": "^0.0.7", - "error-stack-parser": "^2.0.6", - "html-entities": "^1.2.1", - "native-url": "^0.2.6", - "schema-utils": "^2.6.5", - "source-map": "^0.7.3" + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "jest-resolve": { + "version": "26.6.2", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + } + } + }, + "@jest/reporters": { + "version": "26.6.2", + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" }, "dependencies": { + "jest-resolve": { + "version": "26.6.2", + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "version": "0.6.1" } } }, - "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "ansi-styles": { + "version": "4.3.0", "requires": { - "is-core-module": "^2.0.0", - "path-parse": "^1.0.6" + "color-convert": "^2.0.1" } }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "chalk": { + "version": "4.1.2", "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4" + }, + "execa": { + "version": "4.1.0", + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0" + }, + "human-signals": { + "version": "1.1.1" + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0" + } + } + }, + "jest": { + "version": "26.6.0", + "requires": { + "@jest/core": "^26.6.0", + "import-local": "^3.0.2", + "jest-cli": "^26.6.0" + }, + "dependencies": { + "jest-cli": { + "version": "26.6.3", + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + } + } + }, + "jest-changed-files": { + "version": "26.6.2", + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "26.6.3", + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + "version": "7.3.2" }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "optional": true, - "peer": true + "supports-color": { + "version": "7.2.0", + "requires": { + "has-flag": "^4.0.0" + } + }, + "v8-to-istanbul": { + "version": "7.1.2", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3" + } + } + }, + "wrap-ansi": { + "version": "6.2.0", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3" + }, + "yargs": { + "version": "15.4.1", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1" + } + } } } }, "react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", + "version": "4.4.2", "requires": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -36430,88 +34164,29 @@ } }, "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "version": "5.2.0", "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0" } } }, "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "version": "7.0.1", "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" } }, "readable-stream": { "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -36523,9 +34198,7 @@ } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", "optional": true, "requires": { "picomatch": "^2.2.1" @@ -36533,198 +34206,196 @@ }, "recursive-readdir": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", "requires": { "minimatch": "3.0.4" } }, + "redent": { + "version": "3.0.0", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, "redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "version": "4.1.0", "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" + "@babel/runtime": "^7.9.2" } }, "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "version": "1.4.2" }, "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "version": "10.0.1", "requires": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.13.9" }, "regenerator-transform": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "requires": { "@babel/runtime": "^7.8.4" } }, "regex-not": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" } }, "regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + "version": "2.2.11" }, "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "version": "1.4.1", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" + "version": "3.2.0" }, "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "version": "5.0.1", "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" } }, "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + "version": "0.6.0" }, "regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "version": "0.8.4", "requires": { "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + "version": "0.5.0" } } }, "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + "version": "0.2.7" }, "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + "version": "1.1.0" }, "renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "version": "2.0.7", "requires": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1" + }, + "css-select": { + "version": "4.2.1", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "5.1.0" + }, + "dom-serializer": { + "version": "1.3.2", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0" + }, + "domutils": { + "version": "2.8.0", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "nth-check": { + "version": "2.0.1", + "requires": { + "boolbase": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" + "version": "1.1.4" }, "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "version": "1.6.1" }, "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "version": "2.1.1" }, "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + "version": "2.0.2" }, "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "version": "2.0.0" }, "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "version": "1.0.0" }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.18.1", "requires": { - "is-core-module": "^2.2.0", + "is-core-module": "^2.0.0", "path-parse": "^1.0.6" } }, "resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "requires": { "resolve-from": "^5.0.0" }, "dependencies": { "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + "version": "5.0.0" } } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + "version": "4.0.0" }, "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + "version": "0.2.1" }, "resolve-url-loader": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.3.tgz", - "integrity": "sha512-WbDSNFiKPPLem1ln+EVTE+bFUBdTTytfQZWbmghroaFNFaAVmGq0Saqw6F/306CwgPXsGwXVxbODE+3xAo/YbA==", + "version": "3.1.4", "requires": { "adjust-sourcemap-loader": "3.0.0", "camelcase": "5.3.1", @@ -36732,34 +34403,32 @@ "convert-source-map": "1.7.0", "es6-iterator": "2.0.3", "loader-utils": "1.2.3", - "postcss": "7.0.21", + "postcss": "7.0.36", "rework": "1.0.1", "rework-visit": "1.0.0", "source-map": "0.6.1" }, "dependencies": { "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "version": "5.3.1" + }, + "convert-source-map": { + "version": "1.7.0", + "requires": { + "safe-buffer": "~5.1.1" + } }, "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + "version": "2.1.0" }, "json5": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "requires": { "minimist": "^1.2.0" } }, "loader-utils": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "requires": { "big.js": "^5.2.2", "emojis-list": "^2.0.0", @@ -36767,9 +34436,7 @@ } }, "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "version": "7.0.36", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -36777,78 +34444,66 @@ } }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" }, "supports-color": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { "has-flag": "^3.0.0" } } } }, + "restore-cursor": { + "version": "3.1.0", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + "version": "0.1.15" }, "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + "version": "0.12.0" }, "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "version": "1.0.4" }, "rework": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", "requires": { "convert-source-map": "^0.3.3", "css": "^2.0.0" }, "dependencies": { "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + "version": "0.3.5" } } }, "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + "version": "1.0.0" + }, + "rfdc": { + "version": "1.3.0", + "dev": true }, "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + "version": "1.0.1" }, "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + "version": "1.0.0" }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", "requires": { "glob": "^7.1.3" } }, "ripemd160": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -36856,8 +34511,6 @@ }, "rollup": { "version": "1.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", - "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", "requires": { "@types/estree": "*", "@types/node": "*", @@ -36866,8 +34519,6 @@ }, "rollup-plugin-babel": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", - "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", "requires": { "@babel/helper-module-imports": "^7.0.0", "rollup-pluginutils": "^2.8.1" @@ -36875,8 +34526,6 @@ }, "rollup-plugin-terser": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", - "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", "requires": { "@babel/code-frame": "^7.5.5", "jest-worker": "^24.9.0", @@ -36887,8 +34536,6 @@ "dependencies": { "jest-worker": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", "requires": { "merge-stream": "^2.0.0", "supports-color": "^6.1.0" @@ -36896,16 +34543,12 @@ }, "serialize-javascript": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "requires": { "randombytes": "^2.1.0" } }, "supports-color": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { "has-flag": "^3.0.0" } @@ -36914,71 +34557,57 @@ }, "rollup-pluginutils": { "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", "requires": { "estree-walker": "^0.6.1" }, "dependencies": { "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + "version": "0.6.1" } } }, "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + "version": "4.8.5" }, "run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "requires": { "queue-microtask": "^1.2.2" } }, "run-queue": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "requires": { "aproba": "^1.1.1" } }, "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "version": "7.5.4", "dev": true, "requires": { - "tslib": "^1.9.0" + "tslib": "^2.1.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "dev": true + } } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.1.2" }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { "ret": "~0.1.10" } }, "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "version": "2.1.2" }, "sane": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "requires": { "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", @@ -36993,8 +34622,6 @@ "dependencies": { "anymatch": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -37002,8 +34629,6 @@ }, "braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -37019,8 +34644,6 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } @@ -37029,8 +34652,6 @@ }, "cross-spawn": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -37041,8 +34662,6 @@ }, "execa": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -37055,8 +34674,6 @@ }, "fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -37066,8 +34683,6 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } @@ -37076,29 +34691,18 @@ }, "get-stream": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "requires": { "pump": "^3.0.0" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } @@ -37106,14 +34710,10 @@ } }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "version": "1.1.0" }, "micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -37132,42 +34732,33 @@ }, "normalize-path": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { "remove-trailing-separator": "^1.0.1" } }, "npm-run-path": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { "path-key": "^2.0.0" } }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "version": "2.0.1" + }, + "semver": { + "version": "5.7.1" }, "shebang-command": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "version": "1.0.0" }, "to-regex-range": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -37175,8 +34766,6 @@ }, "which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { "isexe": "^2.0.0" } @@ -37184,14 +34773,10 @@ } }, "sanitize.css": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" + "version": "10.0.0" }, "sass-loader": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", - "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", + "version": "10.2.1", "requires": { "klona": "^2.0.4", "loader-utils": "^2.0.0", @@ -37200,30 +34785,16 @@ "semver": "^7.3.2" }, "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "semver": { "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { "lru-cache": "^6.0.0" } @@ -37231,70 +34802,50 @@ } }, "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "version": "1.2.4" }, "saxes": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "requires": { "xmlchars": "^2.2.0" } }, "scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "version": "0.20.2", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "2.7.1", "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" } }, "seedrandom": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz", - "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=" + "version": "2.4.4" }, "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + "version": "2.0.0" }, "selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "version": "1.10.14", "requires": { "node-forge": "^0.10.0" } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "6.3.0" }, "semver-compare": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -37303,9 +34854,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -37313,38 +34864,28 @@ "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" }, "dependencies": { "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.0.0" } } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3" } } }, "serialize-javascript": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "requires": { "randombytes": "^2.1.0" } }, "serve-index": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "requires": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -37357,16 +34898,12 @@ "dependencies": { "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, "http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -37375,42 +34912,30 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.3" }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.0.0" }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "version": "1.1.0" } } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" } }, "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "version": "2.0.0" }, "set-value": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -37420,33 +34945,20 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" } } }, "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "version": "1.0.5" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0" }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -37454,32 +34966,22 @@ }, "shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "version": "3.0.0" }, "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + "version": "1.7.2" }, "shellwords": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "optional": true }, "side-channel": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -37487,20 +34989,14 @@ } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "version": "3.0.3" }, "simple-concat": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "devOptional": true }, "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "version": "3.1.1", "devOptional": true, "requires": { "decompress-response": "^4.2.0", @@ -37510,33 +35006,52 @@ }, "simple-swizzle": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "requires": { "is-arrayish": "^0.3.1" }, "dependencies": { "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + "version": "0.3.2" } } }, "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "version": "1.0.5" }, "slash": { + "version": "3.0.0" + }, + "slice-ansi": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + } + } }, "snapdragon": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -37547,98 +35062,32 @@ "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } + "dependencies": { + "debug": { + "version": "2.6.9", + "requires": { + "ms": "2.0.0" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "define-property": { + "version": "0.2.5", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-descriptor": "^0.1.0" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "extend-shallow": { + "version": "2.0.1", + "requires": { + "is-extendable": "^0.1.0" + } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.0.0" } } }, "snapdragon-node": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -37647,26 +35096,40 @@ "dependencies": { "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { "is-descriptor": "^1.0.0" } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, "snapdragon-util": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } @@ -37674,39 +35137,25 @@ } }, "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", "requires": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } } }, "sockjs-client": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", - "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "version": "1.6.0", "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", + "debug": "^3.2.7", + "eventsource": "^1.1.0", + "faye-websocket": "^0.11.4", "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.1" + "url-parse": "^1.5.10" }, "dependencies": { "debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { "ms": "^2.1.1" } @@ -37715,31 +35164,21 @@ }, "sort-keys": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "requires": { "is-plain-obj": "^1.0.0" } }, "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + "version": "2.0.1" }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "version": "0.5.7" }, "source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + "version": "1.0.2" }, "source-map-resolve": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "requires": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", @@ -37749,63 +35188,45 @@ } }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" }, "dependencies": { "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + "version": "0.4.1" }, "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + "version": "1.4.8" }, "spdx-correct": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "version": "2.3.0" }, "spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==" + "version": "3.0.11" }, "spdy": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "requires": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -37816,8 +35237,6 @@ }, "spdy-transport": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "requires": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -37829,8 +35248,6 @@ "dependencies": { "readable-stream": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -37841,69 +35258,38 @@ }, "split-string": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "requires": { "extend-shallow": "^3.0.0" } }, "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "version": "1.0.3" }, "ssri": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "requires": { "minipass": "^3.1.1" - }, - "dependencies": { - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + "version": "0.1.8" }, "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "version": "2.0.5", "requires": { "escape-string-regexp": "^2.0.0" }, "dependencies": { "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + "version": "2.0.0" } } }, "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", - "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + "version": "1.2.1" }, "static-extend": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -37911,74 +35297,17 @@ "dependencies": { "define-property": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { "is-descriptor": "^0.1.0" } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "1.5.0" }, "stream-browserify": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" @@ -37986,8 +35315,6 @@ }, "stream-each": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "requires": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -37995,8 +35322,6 @@ }, "stream-http": { "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", @@ -38006,77 +35331,45 @@ } }, "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + "version": "1.0.1" }, "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + "version": "1.1.0" }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { "safe-buffer": "~5.1.0" } }, "string-argv": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, "string-length": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "requires": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + "version": "3.0.1" }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "devOptional": true, + "version": "4.2.2", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "string.prototype.matchall": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", - "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "version": "4.0.6", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.2", + "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", "has-symbols": "^1.0.2", "internal-slot": "^1.0.3", @@ -38086,8 +35379,6 @@ }, "string.prototype.trimend": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -38095,8 +35386,6 @@ }, "string.prototype.trimstart": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -38104,94 +35393,53 @@ }, "stringify-object": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "requires": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - } } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.0", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.0" } }, "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" + "version": "3.0.0" }, "strip-comments": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", "requires": { "babel-extract-comments": "^1.0.0", "babel-plugin-transform-object-rest-spread": "^6.26.0" } }, "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "version": "1.0.0" }, "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + "version": "2.0.0" + }, + "strip-indent": { + "version": "3.0.0", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "devOptional": true + "version": "3.1.1" }, "style-loader": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", - "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", "requires": { "loader-utils": "^2.0.0", "schema-utils": "^2.7.0" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } } }, "stylehacks": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "requires": { "browserslist": "^4.0.0", "postcss": "^7.0.0", @@ -38200,8 +35448,6 @@ "dependencies": { "postcss-selector-parser": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", @@ -38210,47 +35456,41 @@ } } }, + "stylis": { + "version": "4.0.13" + }, "supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } }, "supports-hyperlinks": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, "dependencies": { "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "version": "4.0.0" }, "supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } } } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0" + }, "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + "version": "2.0.4" }, "svgo": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "requires": { "chalk": "^2.4.1", "coa": "^2.0.2", @@ -38267,45 +35507,132 @@ "util.promisify": "~1.0.0" } }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + "version": "3.2.4" + }, + "table": { + "version": "6.8.0", + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.10.0", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4" + }, + "json-schema-traverse": { + "version": "1.0.0" + }, + "slice-ansi": { + "version": "4.0.0", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } }, "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + "version": "1.1.3" }, "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "devOptional": true, + "version": "6.1.11", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4" + } + } + }, + "tar-fs": { + "version": "2.0.0", + "dev": true, "requires": { "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "mkdirp": "^0.5.1", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "dev": true + } + } + }, + "tar-stream": { + "version": "2.2.0", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" + "version": "1.0.0" }, "tempy": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", - "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", "requires": { "temp-dir": "^1.0.0", "type-fest": "^0.3.1", @@ -38313,16 +35640,12 @@ }, "dependencies": { "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + "version": "0.3.1" } } }, "terminal-link": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -38330,8 +35653,6 @@ }, "terser": { "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -38339,21 +35660,15 @@ }, "dependencies": { "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "2.20.3" }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "terser-webpack-plugin": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", "requires": { "cacache": "^15.0.5", "find-cache-dir": "^3.3.1", @@ -38366,79 +35681,54 @@ "webpack-sources": "^1.4.3" }, "dependencies": { + "acorn": { + "version": "8.7.0" + }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "2.20.3" }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, "p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { "yocto-queue": "^0.1.0" } }, "pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { "find-up": "^4.0.0" } }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" }, "terser": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.0.tgz", - "integrity": "sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==", + "version": "5.11.0", "requires": { + "acorn": "^8.5.0", "commander": "^2.20.0", "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" }, "dependencies": { "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "version": "0.7.3" } } } @@ -38446,8 +35736,6 @@ }, "test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -38455,80 +35743,54 @@ } }, "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "version": "0.2.0" }, "three": { - "version": "0.101.1", - "resolved": "https://registry.npmjs.org/three/-/three-0.101.1.tgz", - "integrity": "sha512-8ufimUVmRLtH+BTpEIbDjdGEKQOVWLMLgGynaKin1KbYTE136ZNOepJ8EgByi0tN43dQ7B1YrKLCJgXGy4bLmw==" + "version": "0.101.1" }, "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + "version": "5.0.0" }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + "version": "1.1.0" }, "timers-browserify": { "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "requires": { "setimmediate": "^1.0.4" } }, "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + "version": "0.3.0" }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + "version": "1.0.5" }, "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + "version": "1.0.1" }, "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "version": "2.0.0" }, "to-object-path": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } @@ -38537,8 +35799,6 @@ }, "to-regex": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -38548,21 +35808,15 @@ }, "to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { "is-number": "^7.0.0" } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1" }, "tough-cookie": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -38570,34 +35824,24 @@ }, "dependencies": { "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "version": "0.1.2" } } }, "tr46": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "requires": { "punycode": "^2.1.1" } }, "tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + "version": "1.0.1" }, "ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + "version": "1.2.0" }, "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "version": "3.12.0", "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", @@ -38607,92 +35851,57 @@ "dependencies": { "json5": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "requires": { "minimist": "^1.2.0" } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + "version": "1.14.1" }, "tsutils": { "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "requires": { "tslib": "^1.8.1" } }, "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + "version": "0.0.0" }, "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + "version": "1.2.0" }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + "version": "4.0.8" }, "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + "version": "0.8.1" }, "type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "version": "0.0.6" }, "typedarray-to-buffer": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "requires": { "is-typedarray": "^1.0.0" } }, - "typescript": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz", - "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==", - "peer": true - }, "unbox-primitive": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "requires": { "function-bind": "^1.1.1", "has-bigints": "^1.0.1", @@ -38700,117 +35909,84 @@ "which-boxed-primitive": "^1.0.2" } }, - "uncontrollable": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.1.1.tgz", - "integrity": "sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q==", + "unbzip2-stream": { + "version": "1.3.3", + "dev": true, "requires": { - "@babel/runtime": "^7.6.3", - "@types/react": "^16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } } }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" - }, "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + "version": "2.0.0" }, "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "version": "2.0.0", "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + "version": "2.0.0" }, "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" + "version": "2.0.0" }, "union-value": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - } } }, "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + "version": "1.0.1" }, "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + "version": "2.0.0" }, "unique-filename": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "requires": { "unique-slug": "^2.0.0" } }, "unique-slug": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "requires": { "imurmurhash": "^0.1.4" } }, "unique-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { "crypto-random-string": "^1.0.0" } }, "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + "version": "2.0.0" }, "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "version": "1.0.0" }, "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + "version": "1.1.1" }, "unset-value": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -38818,8 +35994,6 @@ "dependencies": { "has-value": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -38828,8 +36002,6 @@ "dependencies": { "isobject": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "requires": { "isarray": "1.0.0" } @@ -38837,72 +36009,49 @@ } }, "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + "version": "0.1.4" } } }, "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + "version": "1.2.0" }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", "requires": { "punycode": "^2.1.0" } }, "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + "version": "0.1.0" }, "url": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "requires": { "punycode": "1.3.2", "querystring": "0.2.0" }, "dependencies": { "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "version": "1.3.2" + }, + "querystring": { + "version": "0.2.0" } } }, "url-loader": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", "requires": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", "schema-utils": "^3.0.0" }, "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -38910,146 +36059,92 @@ } }, "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.10", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + "version": "3.1.1" }, "util": { "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "requires": { "inherits": "2.0.3" }, "dependencies": { "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.3" } } }, "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "version": "1.0.2" }, "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "version": "1.0.1", "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" } }, "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + "version": "0.4.0" }, "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "version": "1.0.1" }, "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true + "version": "8.3.2" }, "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" - }, - "v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" - } - } + "version": "2.3.0" }, "validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "version": "1.1.2" }, "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" + "version": "1.0.4" }, "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + "version": "1.1.2" }, "w3c-hr-time": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "requires": { "browser-process-hrtime": "^1.0.0" } }, "w3c-xmlserializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "requires": { "xml-name-validator": "^3.0.0" } }, "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "version": "1.0.8", "requires": { - "makeerror": "1.0.x" + "makeerror": "1.0.12" } }, "warning": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", "requires": { "loose-envify": "^1.0.0" } }, "watchpack": { "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "requires": { "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", @@ -39059,8 +36154,6 @@ }, "watchpack-chokidar2": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", "optional": true, "requires": { "chokidar": "^2.1.8" @@ -39068,8 +36161,6 @@ "dependencies": { "anymatch": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "optional": true, "requires": { "micromatch": "^3.1.4", @@ -39078,8 +36169,6 @@ "dependencies": { "normalize-path": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "optional": true, "requires": { "remove-trailing-separator": "^1.0.1" @@ -39089,14 +36178,10 @@ }, "binary-extensions": { "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "optional": true }, "braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "optional": true, "requires": { "arr-flatten": "^1.1.0", @@ -39113,8 +36198,6 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "optional": true, "requires": { "is-extendable": "^0.1.0" @@ -39124,8 +36207,6 @@ }, "chokidar": { "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "optional": true, "requires": { "anymatch": "^2.0.0", @@ -39144,8 +36225,6 @@ }, "fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "optional": true, "requires": { "extend-shallow": "^2.0.1", @@ -39156,8 +36235,6 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "optional": true, "requires": { "is-extendable": "^0.1.0" @@ -39177,8 +36254,6 @@ }, "glob-parent": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "optional": true, "requires": { "is-glob": "^3.1.0", @@ -39187,8 +36262,6 @@ "dependencies": { "is-glob": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "optional": true, "requires": { "is-extglob": "^2.1.0" @@ -39198,23 +36271,13 @@ }, "is-binary-path": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "optional": true, "requires": { "binary-extensions": "^1.0.0" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "optional": true - }, "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "optional": true, "requires": { "kind-of": "^3.0.2" @@ -39222,8 +36285,6 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "optional": true, "requires": { "is-buffer": "^1.1.5" @@ -39233,8 +36294,6 @@ }, "micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "optional": true, "requires": { "arr-diff": "^4.0.0", @@ -39254,8 +36313,6 @@ }, "readdirp": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "optional": true, "requires": { "graceful-fs": "^4.1.11", @@ -39265,8 +36322,6 @@ }, "to-regex-range": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "optional": true, "requires": { "is-number": "^3.0.0", @@ -39277,21 +36332,15 @@ }, "wbuf": { "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "requires": { "minimalistic-assert": "^1.0.0" } }, "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + "version": "6.1.0" }, "webpack": { "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -39319,14 +36368,10 @@ }, "dependencies": { "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + "version": "6.4.2" }, "braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -39342,8 +36387,6 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } @@ -39352,8 +36395,6 @@ }, "cacache": { "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "requires": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -39372,10 +36413,11 @@ "y18n": "^4.0.0" } }, + "chownr": { + "version": "1.1.4" + }, "eslint-scope": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -39383,8 +36425,6 @@ }, "fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -39394,31 +36434,20 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } } } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } @@ -39426,22 +36455,30 @@ } }, "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + "version": "1.1.0" + }, + "json5": { + "version": "1.0.1", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } }, "lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { "yallist": "^3.0.2" } }, "micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -39458,31 +36495,37 @@ "to-regex": "^3.0.2" } }, + "rimraf": { + "version": "2.7.1", + "requires": { + "glob": "^7.1.3" + } + }, + "schema-utils": { + "version": "1.0.0", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, "serialize-javascript": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "requires": { "randombytes": "^2.1.0" } }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" }, "ssri": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "requires": { "figgy-pudding": "^3.5.1" } }, "terser-webpack-plugin": { "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -39497,19 +36540,21 @@ }, "to-regex-range": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" } + }, + "y18n": { + "version": "4.0.3" + }, + "yallist": { + "version": "3.1.1" } } }, "webpack-dev-middleware": { "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", "requires": { "memory-fs": "^0.4.1", "mime": "^2.4.4", @@ -39519,16 +36564,12 @@ }, "dependencies": { "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + "version": "2.6.0" } } }, "webpack-dev-server": { "version": "3.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", - "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -39566,14 +36607,10 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "2.1.1" }, "anymatch": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -39581,8 +36618,6 @@ "dependencies": { "normalize-path": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { "remove-trailing-separator": "^1.0.1" } @@ -39590,14 +36625,10 @@ } }, "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + "version": "1.13.1" }, "braces": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -39613,8 +36644,6 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } @@ -39622,14 +36651,10 @@ } }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "version": "5.3.1" }, "chokidar": { "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -39647,18 +36672,17 @@ }, "cliui": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0" + }, "strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" } @@ -39666,14 +36690,10 @@ } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "7.0.3" }, "fill-range": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -39683,8 +36703,6 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { "is-extendable": "^0.1.0" } @@ -39693,8 +36711,6 @@ }, "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { "locate-path": "^3.0.0" } @@ -39711,8 +36727,6 @@ }, "glob-parent": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -39720,8 +36734,6 @@ "dependencies": { "is-glob": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { "is-extglob": "^2.1.0" } @@ -39730,48 +36742,31 @@ }, "import-local": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "requires": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" } }, "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" + "version": "3.0.3" }, "is-binary-path": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "requires": { "binary-extensions": "^1.0.0" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "version": "2.0.0" }, "is-number": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { "is-buffer": "^1.1.5" } @@ -39780,8 +36775,6 @@ }, "locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -39789,8 +36782,6 @@ }, "micromatch": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -39809,29 +36800,15 @@ }, "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { "p-limit": "^2.0.0" } }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } + "version": "3.0.0" }, "readdirp": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -39840,49 +36817,54 @@ }, "resolve-cwd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "requires": { "resolve-from": "^3.0.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "resolve-from": { + "version": "3.0.0" + }, + "schema-utils": { + "version": "1.0.0", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } }, "string-width": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0" + }, "strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" } } } }, + "strip-ansi": { + "version": "3.0.1", + "requires": { + "ansi-regex": "^2.0.0" + } + }, "supports-color": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { "has-flag": "^3.0.0" } }, "to-regex-range": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -39890,18 +36872,17 @@ }, "wrap-ansi": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "requires": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0" + }, "strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" } @@ -39909,17 +36890,16 @@ } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", "requires": { "async-limiter": "~1.0.0" } }, + "y18n": { + "version": "4.0.3" + }, "yargs": { "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", @@ -39935,8 +36915,6 @@ }, "yargs-parser": { "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -39946,29 +36924,21 @@ }, "webpack-log": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "requires": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" }, "dependencies": { "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + "version": "3.2.4" }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "version": "3.4.0" } } }, "webpack-manifest-plugin": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", - "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", "requires": { "fs-extra": "^7.0.0", "lodash": ">=3.5 <5", @@ -39978,8 +36948,6 @@ "dependencies": { "fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -39988,39 +36956,29 @@ }, "jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { "graceful-fs": "^4.1.6" } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "version": "0.1.2" } } }, "webpack-sources": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" }, "dependencies": { "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.6.1" } } }, "websocket-driver": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "requires": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -40028,50 +36986,36 @@ } }, "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + "version": "0.1.4" }, "whatwg-encoding": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "requires": { "iconv-lite": "0.4.24" } }, "whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + "version": "3.6.2" }, "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + "version": "2.3.0" }, "whatwg-url": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", - "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", + "version": "8.7.0", "requires": { "lodash": "^4.7.0", - "tr46": "^2.0.2", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" } }, "which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "requires": { "isexe": "^2.0.0" } }, "which-boxed-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -40081,44 +37025,32 @@ } }, "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "version": "2.0.0" }, "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "version": "1.1.5", "devOptional": true, "requires": { - "string-width": "^1.0.2 || 2" + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "version": "1.2.3" }, "workbox-background-sync": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", - "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", "requires": { "workbox-core": "^5.1.4" } }, "workbox-broadcast-update": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", - "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", "requires": { "workbox-core": "^5.1.4" } }, "workbox-build": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", - "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", "requires": { "@babel/core": "^7.8.4", "@babel/preset-env": "^7.8.4", @@ -40160,8 +37092,6 @@ "dependencies": { "fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -40170,49 +37100,35 @@ }, "jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { "graceful-fs": "^4.1.6" } }, "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + "version": "0.7.3" }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "version": "0.1.2" } } }, "workbox-cacheable-response": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", - "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", "requires": { "workbox-core": "^5.1.4" } }, "workbox-core": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", - "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" + "version": "5.1.4" }, "workbox-expiration": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", - "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", "requires": { "workbox-core": "^5.1.4" } }, "workbox-google-analytics": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", - "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", "requires": { "workbox-background-sync": "^5.1.4", "workbox-core": "^5.1.4", @@ -40222,40 +37138,30 @@ }, "workbox-navigation-preload": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", - "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", "requires": { "workbox-core": "^5.1.4" } }, "workbox-precaching": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", - "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", "requires": { "workbox-core": "^5.1.4" } }, "workbox-range-requests": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", - "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", "requires": { "workbox-core": "^5.1.4" } }, "workbox-routing": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", - "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", "requires": { "workbox-core": "^5.1.4" } }, "workbox-strategies": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", - "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", "requires": { "workbox-core": "^5.1.4", "workbox-routing": "^5.1.4" @@ -40263,22 +37169,16 @@ }, "workbox-streams": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", - "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", "requires": { "workbox-core": "^5.1.4", "workbox-routing": "^5.1.4" } }, "workbox-sw": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", - "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" + "version": "5.1.4" }, "workbox-webpack-plugin": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", - "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", "requires": { "@babel/runtime": "^7.5.5", "fast-json-stable-stringify": "^2.0.0", @@ -40290,103 +37190,52 @@ }, "workbox-window": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", - "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", "requires": { "workbox-core": "^5.1.4" } }, "worker-farm": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "requires": { "errno": "~0.1.7" } }, "worker-rpc": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", "requires": { "microevent.ts": "~0.1.1" } }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, "ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } + "version": "1.1.4" } } }, "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "version": "1.0.2" }, "write-file-atomic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -40395,119 +37244,55 @@ } }, "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "7.5.7", "requires": {} }, "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "version": "3.0.0" }, "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + "version": "2.2.0" }, "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "version": "4.0.2" }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "version": "5.0.8" }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "4.0.0" }, "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + "version": "1.10.2" }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "version": "20.2.9" + }, + "yauzl": { + "version": "2.10.0", + "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - } + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } }, "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "version": "0.1.0" }, "zlib": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz", - "integrity": "sha1-bnyXL8NxxkWmr7A6sUdp3vEU/MA=" + "version": "1.0.5" } } } diff --git a/package.json b/package.json index 5dab6e93..30e9c142 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,11 @@ "name": "mri-viewer", "fullName": "MRI Viewer 2d/3d Dicom and other medical formats web viewer/editor", "description": "MRI Viewer is unique 2d/3d medical volume data web viewer application. You can inspect data both in 2d and 3d modes.", - "version": "1.0.1", + "version": "1.0.2", "author": "EPAM Systems ", - "year": "2021", + "year": "2022", "license": "Apache-2.0", + "proxy": "http://localhost:3000", "licenses": [ { "type": "Apache-2.0", @@ -18,38 +19,56 @@ "homepage": "https://mriviewer.opensource.epam.com/", "private": false, "dependencies": { - "@tensorflow/tfjs": "^1.7.4", - "bootstrap": "^4.5.0", + "@emotion/react": "^11.8.1", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.4.3", + "@popperjs/core": "^2.9.2", + "@tensorflow/tfjs": "^3.6.0", + "classnames": "^2.3.1", "daikon": "^1.2.42", "eslint": "^7.27.0", "filereader-stream": "^2.0.0", - "jquery": "^3.5.1", - "popper.js": "^1.16.1", - "react": "^16.13.1", - "react-bootstrap": "^1.0.1", - "react-bootstrap-table-next": "^3.3.5", - "react-dom": "^16.13.1", - "react-nouislider": "^2.0.1", - "react-redux": "^6.0.0", + "react": "^17.0.2", + "react-dnd": "^14.0.2", + "react-dnd-html5-backend": "^14.0.0", + "react-dom": "^17.0.2", + "react-modal": "^3.14.2", + "react-popper": "^2.2.5", + "react-redux": "7.2.4", "react-scripts": "4.0.3", - "redux": "^4.0.5", - "three": "^0.101.1", - "zlib": "^1.0.5" + "redux": "4.1.0", + "seedrandom": "^2.4.4", + "three": "0.101.1", + "zlib": "1.x.x" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", - "test": "react-scripts test", + "test": "react-scripts test --detectOpenHandles", + "debugtest": "DEBUG=true react-scripts test", "lint": "eslint src/**/*.js", - "docker": "npm run build && docker run --name mriviewer -v ./build:/usr/share/nginx/html:ro -d -p 8080:80 nginx", + "format": "prettier --write \"src/**/*.{js,jsx,html,css}\"", + "docker": "npm run build && docker run --name mri-viewer -v ./build:/usr/share/nginx/html:ro -d -p 8080:80 nginx", "prepare": "husky install" }, - "lint-staged": { - "*.js": "npm run lint" - }, "eslintConfig": { "extends": "react-app" }, + "jest": { + "resetMocks": false, + "coverageReporters": [ + "json", + "lcov", + "text", + "text-summary", + "clover" + ], + "collectCoverageFrom": [ + "./src/**/*.{js,jsx,ts,tsx}", + "!./node_modules/", + "!./build/" + ] + }, "browserslist": [ ">0.2%", "not dead", @@ -58,14 +77,33 @@ ], "devDependencies": { "@babel/core": "7.14.3", + "@testing-library/jest-dom": "^5.14.1", + "@testing-library/react": "^12.1.0", + "@testing-library/react-hooks": "^7.0.2", + "@testing-library/user-event": "^13.2.1", "canvas": "^2.6.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-react": "7.x.x", - "husky": "^6.0.0", + "husky": "^7.0.0", "lint-staged": "^11.0.0", - "node-pre-gyp": "^0.14.0" + "node-pre-gyp": "^0.14.0", + "prettier": "^2.4.1", + "puppeteer": "^10.2.0" }, "engines": { - "node": ">=12.16.1", - "npm": ">=6.13.4" + "node": ">=12.20.1", + "npm": ">=7.0.0" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.{js,jsx,ts,tsx}": "eslint --fix" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } } diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 00000000..9f09e787 Binary files /dev/null and b/public/android-chrome-192x192.png differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 00000000..6ce792b9 Binary files /dev/null and b/public/android-chrome-512x512.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 00000000..94f36eb4 Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/browserconfig.xml b/public/browserconfig.xml new file mode 100644 index 00000000..b3930d0f --- /dev/null +++ b/public/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 00000000..bf275fe1 Binary files /dev/null and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 00000000..9803cda5 Binary files /dev/null and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico index a3a86814..966ab4c6 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/images/logo.png b/public/images/logo.png new file mode 100644 index 00000000..e966b3a8 Binary files /dev/null and b/public/images/logo.png differ diff --git a/public/index.html b/public/index.html index d8c20b83..c77d5549 100644 --- a/public/index.html +++ b/public/index.html @@ -1,3 +1,8 @@ + + @@ -5,29 +10,12 @@ - - - - - - - - - - - - - + MRI Viewer Dicom 2d/3d browser @@ -40,27 +28,6 @@ </noscript> <div id="root"></div> - <!-- - This HTML file is a template. - If you open it directly in the browser, you will see an empty page. - - You can add webfonts, meta tags, or analytics to this file. - The build step will place the bundled scripts into the <body> tag. - - To begin the development, run `npm start` or `yarn start`. - To create a production bundle, use `npm run build` or `yarn build`. - --> - - <!-- - Include jQuery, popper and bootstrap scripts - --> - - - <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> - <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script> - <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script> - - </body> </html> diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png new file mode 100644 index 00000000..f3e50a0c Binary files /dev/null and b/public/mstile-150x150.png differ diff --git a/public/safari-pinned-tab.svg b/public/safari-pinned-tab.svg new file mode 100644 index 00000000..74654fd3 --- /dev/null +++ b/public/safari-pinned-tab.svg @@ -0,0 +1,38 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" + "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> +<svg version="1.0" xmlns="http://www.w3.org/2000/svg" + width="592.000000pt" height="592.000000pt" viewBox="0 0 592.000000 592.000000" + preserveAspectRatio="xMidYMid meet"> +<metadata> +Created by potrace 1.14, written by Peter Selinger 2001-2017 +</metadata> +<g transform="translate(0.000000,592.000000) scale(0.100000,-0.100000)" +fill="#000000" stroke="none"> +<path d="M1851 5670 c-4 -3 -7 -642 -6 -1420 0 -778 -3 -1425 -6 -1436 -4 -12 +-408 -422 -898 -912 -490 -489 -891 -895 -891 -901 0 -12 38 -93 234 -494 58 +-119 106 -221 106 -226 0 -5 6 -14 14 -20 12 -10 190 163 1009 983 l995 994 +96 0 c52 0 100 3 106 7 5 3 10 3 10 -2 0 -9 83 -8 106 1 8 3 14 2 14 -2 0 -7 +167 -5 188 3 6 2 12 1 12 -3 0 -8 85 -6 106 2 8 3 14 2 14 -2 0 -7 167 -5 188 +3 6 2 12 1 12 -3 0 -8 85 -6 106 2 8 3 14 2 14 -2 0 -7 167 -5 188 3 6 2 12 1 +12 -3 0 -8 85 -6 106 2 8 3 14 2 14 -2 0 -4 61 -7 135 -7 74 0 135 2 135 5 0 +3 20 5 45 5 25 0 45 -2 45 -5 0 -3 15 -4 33 -3 67 4 96 4 225 1 72 -2 132 1 +132 5 0 5 4 6 9 3 8 -5 127 -10 146 -6 6 1 24 1 40 0 66 -5 285 -5 285 0 0 3 +20 5 45 5 25 0 45 -2 45 -5 0 -3 15 -4 33 -3 67 4 96 4 225 1 72 -2 132 1 132 +5 0 5 4 6 9 3 8 -5 127 -10 146 -6 6 1 14 2 19 1 26 -5 197 -4 202 2 7 6 4 13 +-171 372 -187 385 -199 409 -210 418 -5 4 -25 6 -42 4 -18 -1 -33 0 -33 5 0 4 +-10 4 -22 -1 -12 -4 -37 -5 -55 -1 -18 5 -33 5 -33 1 0 -4 -19 -5 -42 -3 -49 +4 -51 4 -100 0 -21 -2 -38 0 -38 3 0 4 -15 4 -33 -1 -18 -4 -43 -3 -55 1 -12 +5 -22 5 -22 1 0 -4 -24 -6 -52 -4 -66 4 -92 4 -146 0 -23 -2 -42 0 -42 3 0 3 +-20 3 -43 -1 -24 -3 -52 -3 -63 1 -10 3 -23 4 -28 1 -12 -7 -196 -8 -196 -1 0 +3 -20 3 -45 -1 -25 -4 -48 -3 -51 2 -3 4 -13 4 -22 0 -9 -5 -30 -6 -47 -2 -16 +3 -47 3 -68 -1 -20 -3 -40 -2 -43 2 -3 5 -13 5 -23 -1 -10 -5 -20 -7 -23 -5 +-4 4 -34 5 -198 6 -14 0 -44 -1 -68 -3 -23 -2 -42 0 -42 3 0 3 -20 3 -43 -1 +-24 -3 -52 -3 -63 1 -10 3 -23 4 -28 1 -12 -7 -181 -6 -193 1 -5 3 -15 2 -22 +-2 -7 -5 -29 -5 -49 -1 -20 3 -48 3 -62 0 -14 -4 -35 -3 -46 1 -12 4 -24 5 +-27 2 -8 -8 -77 -9 -77 -2 0 4 -15 4 -33 -1 -18 -4 -43 -3 -55 1 -12 5 -22 5 +-22 1 0 -4 -24 -6 -52 -4 -29 2 -66 2 -83 1 -16 0 -36 -1 -42 0 -19 1 -41 2 +-110 0 -34 0 -66 1 -70 4 -5 3 -9 595 -8 1316 0 721 -2 1311 -5 1312 -18 4 +-783 3 -789 -1z"/> +</g> +</svg> diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 00000000..b20abb7c --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/public/sprite.svg b/public/sprite.svg new file mode 100644 index 00000000..32f9014e --- /dev/null +++ b/public/sprite.svg @@ -0,0 +1,222 @@ +<svg xmlns="http://www.w3.org/2000/svg"> + <symbol id="logo" viewBox="0 0 30 30"> + <path d="M13.773 14.381v-11.48h3.2v10.543h11.062l1.557 3.2h-13.556l-7.986 7.985-1.481-3.044 7.204-7.204z"></path> + </symbol> + <symbol viewBox="0 0 32 24" id="2D"> + <path d="M23.797 3a6.21 6.21 0 016.21 6.21v5.58a6.21 6.21 0 01-6.21 6.21h-4.79V3h4.79zm0-1h-5.79v20h5.79a7.21 7.21 0 007.21-7.21V9.21A7.21 7.21 0 0023.797 2zM2.257 6.5c0-2.16 1.964-4 4.5-4s4.5 1.84 4.5 4c0 .499-.002.87-.15 1.354-.151.493-.464 1.133-1.137 2.113C8.648 11.889 6.014 15.013.757 20.76V22h12.25v-1H1.892c4.99-5.467 7.57-8.53 8.902-10.467.701-1.02 1.076-1.755 1.27-2.387.193-.634.193-1.134.193-1.63V6.5c0-2.81-2.513-5-5.5-5s-5.5 2.19-5.5 5v.75h1V6.5z"></path> + </symbol> + <symbol viewBox="0 0 31 24" id="3D"> + <path d="M23.547 3a6.21 6.21 0 016.21 6.21v5.58a6.21 6.21 0 01-6.21 6.21h-4.79V3h4.79zm0-1h-5.79v20h5.79a7.21 7.21 0 007.21-7.21V9.21A7.21 7.21 0 0023.547 2zM2.007 6.75c0-2.301 1.828-4.25 4.5-4.25 2.671 0 4.5 1.949 4.5 4.25S9.178 11 6.507 11h-1.25v1h1.25c2.943 0 5 2.168 5 4.75s-2.057 4.75-5 4.75-5-2.168-5-4.75h-1c0 3.217 2.592 5.75 6 5.75s6-2.533 6-5.75c0-2.383-1.31-4.39-3.502-5.271 1.91-.842 3.002-2.621 3.002-4.729 0-2.945-2.373-5.25-5.5-5.25s-5.5 2.305-5.5 5.25h1z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="angle"> + <path d="M11.742 20.5H3.757v-7.986a8.501 8.501 0 017.985 7.986zm1.002 0a9.5 9.5 0 00-8.987-8.987V2.5h-1v19h19v-1h-9.013z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="area"> + <path d="M5.257 3.39l13.14 4.38 2.59 12.08-15.73-1.75V3.39zm-1-1.39v17l18 2-3-14-15-5z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="back"> + <path d="M22.377 14.1a10.838 10.838 0 00-2.3-3.42 10.76 10.76 0 00-15.21 0l-2.61 2.61V8.64h-1V15h6.36v-1h-4.66l2.62-2.62a9.77 9.77 0 0113.79 0 9.63 9.63 0 012.09 3.11c.07.16.13.34.19.51h1.06c-.1-.3-.2-.61-.33-.9z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="brain"> + <g clip-path="url(#clip0)"> + <path d="M12.257 17.834l.267.422.233-.147v-.275h-.5zm-.013.008l-.268-.423-.212.135-.018.25.498.038zm-8.85-1.45l.485.124L4 16.03l-.484-.123-.123.485zM3.25 9.648l.144.48.643-.194-.37-.56-.417.274zm3.008-4.605l-.083.493.587.098-.004-.595-.5.004zm0-.042h-.5v.003l.5-.003zm5.5 0v12.5h1V5h-1zm0 12.5v.334h1V17.5h-1zm.232-.089l-.013.008.536.845.012-.008-.535-.845zM7.757 22.5a5 5 0 004.986-4.62l-.998-.076A4 4 0 017.758 21.5v1zm-5-5a5 5 0 005 5v-1a4 4 0 01-4-4h-1zm.152-1.23a5.01 5.01 0 00-.152 1.23h1c0-.34.042-.67.122-.985l-.97-.245zM.257 13a4.002 4.002 0 003.014 3.877l.246-.969A3.001 3.001 0 011.257 13h-1zm2.848-3.832A4.001 4.001 0 00.257 13h1c0-1.356.9-2.503 2.136-2.874l-.288-.958zM2.257 8c0 .709.211 1.37.575 1.922l.835-.55A2.486 2.486 0 013.257 8h-1zm3.5-3.5a3.5 3.5 0 00-3.5 3.5h1a2.5 2.5 0 012.5-2.5v-1zm.583.048a3.52 3.52 0 00-.583-.048v1a2.52 2.52 0 01.417.035l.166-.987zm-.583.455v.042l1-.007v-.041l-1 .006zm3.5-3.503a3.5 3.5 0 00-3.5 3.5h1a2.5 2.5 0 012.5-2.5v-1zm3.5 3.5a3.5 3.5 0 00-3.5-3.5v1a2.5 2.5 0 012.5 2.5h1z"></path> + <path d="M21.12 16.393l-.485.123-.123-.485.485-.123.123.485zm.144-6.746l-.143.48-.643-.194.369-.56.417.274zm-3.007-4.605l.082.493-.587.098.005-.595.5.004zm0-.042h.5v.003l-.5-.003zm-5.5 0v12.5h-1V5h1zm4 17.5a5 5 0 01-5-5h1a4 4 0 004 4v1zm5-5a5 5 0 01-5 5v-1a4 4 0 004-4h1zm-.153-1.23a5.008 5.008 0 01.153 1.23h-1c0-.34-.043-.67-.122-.985l.97-.245zM24.257 13a4.001 4.001 0 01-3.015 3.877l-.245-.969A3.001 3.001 0 0023.257 13h1zm-2.849-3.832A4.001 4.001 0 0124.257 13h-1c0-1.356-.9-2.503-2.136-2.874l.287-.958zM22.257 8c0 .709-.212 1.37-.575 1.922l-.835-.55A2.486 2.486 0 0021.257 8h1zm-3.5-3.5a3.5 3.5 0 013.5 3.5h-1a2.5 2.5 0 00-2.5-2.5v-1zm-.583.048a3.519 3.519 0 01.583-.048v1a2.5 2.5 0 00-.418.035l-.165-.987zm.583.455v.042l-1-.007v-.041l1 .006zm-3.5-3.503a3.5 3.5 0 013.5 3.5h-1a2.5 2.5 0 00-2.5-2.5v-1zm-3.5 3.5a3.5 3.5 0 013.5-3.5v1a2.5 2.5 0 00-2.5 2.5h-1z"></path> + </g> + <defs> + <clipPath id="clip0"> + <path transform="translate(.257)" d="M0 0h24v24H0z"></path> + </clipPath> + </defs> + </symbol> + <symbol viewBox="0 0 25 24" id="brightness"> + <path d="M12.757 3h-1v3h1V3zm-4.39 4.4l-2.11-2.12-.72.72 2.12 2.11.71-.71zm-2.11 4.1h-3v1h3v-1zm-.72 6.5l.71.71 2.12-2.11-.71-.71L5.537 18zm6.22 3h1v-3h-1v3zm4.39-4.4l2.11 2.12.71-.71-2.11-2.12-.71.71zm2.11-5.1v1h3v-1h-3zm.72-5.5l-.72-.72-2.11 2.12.71.71L18.977 6zm-6.72 2a4 4 0 00-2.829 6.828A4 4 0 1012.257 8zm0 7a3 3 0 01-2.942-3.585A3 3 0 1112.257 15z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="camera"> + <path d="M19.257 6h-1.86l-1.73-3h-6.82l-1.73 3h-1.86a3 3 0 00-3 3v9a3 3 0 003 3h14a3 3 0 003-3V9a3 3 0 00-3-3zm2 12a2 2 0 01-2 2h-14a2 2 0 01-2-2V9a2 2 0 012-2h2.44l.28-.5L9.427 4h5.66l1.45 2.5.28.5h2.44a2 2 0 012 2v9zm-9-9a4 4 0 00-2.829 6.828A4 4 0 1012.257 9zm0 7a3 3 0 01-2.943-3.585A3 3 0 1112.257 16z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="clear"> + <path d="M20.607 4.35l-.7-.7-7.65 7.64-7.65-7.64-.7.7 7.64 7.65-7.64 7.65.7.7 7.65-7.64 7.65 7.64.7-.7-7.64-7.65 7.64-7.65z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="collapse"> + <path d="M16.257 9V4h-1v6h6V9h-5zm-8 0h-5v1h6V4h-1v5zm7 11h1v-5h5v-1h-6v6zm-12-5h5v5h1v-6h-6v1z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="coronal"> + <path d="M9.586 7.16l.99.57.01-5.31 9.37 5.4-.03 10.77-4.99-2.88v1.13l5.97 3.45.04-13.04L9.606.7l-.02 6.46z"></path> + <path d="M13.926 21.58l-9.36-5.4.03-10.76 4.98 2.88.01-1.14-5.99-3.46-.03 13.05 11.35 6.55.02-6.46-1-.57-.01 5.31z" ></path> + <path d="M13.956 10.82l-.02 4.31 1 .58.02-5.45-4.38-2.53-.01 1.14 3.39 1.95z" ></path> + <path d="M13.937 15.13v1.14l1 .57v-1.13l-1-.58zm-3.37-6.26l.01-1.14-.99-.57-.01 1.14.99.57z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="cursor"> + <g clip-path="url(#clip0)"> + <path d="M3.034 3.713l17.327 6.819-7.15 2.75-.41.156-.155.41-2.75 7.15L3.033 3.712zM1.217 1.896l8.65 21.859 3.684-9.525 9.525-3.684-21.86-8.65z"></path> + </g> + <defs> + <clipPath id="clip0"> + <path transform="translate(.257)" d="M0 0h24v24H0z"></path> + </clipPath> + </defs> + </symbol> + <symbol viewBox="0 0 25 24" id="D"> + <path d="M11.547 3a6.21 6.21 0 016.21 6.21v5.58a6.21 6.21 0 01-6.21 6.21h-4.79V3h4.79zm0-1h-5.79v20h5.79a7.21 7.21 0 007.21-7.21V9.21A7.21 7.21 0 0011.547 2z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="download"> + <path d="M17.607 10.43l-.7-.71-4.15 4.15V2h-1v11.87l-4.15-4.15-.7.71 5.35 5.36 5.35-5.36zM3.257 19.5v1h18v-1h-18z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="E"> + <path d="M7.757 21v-8.67h9.36v-1h-9.36V3h10.06V2H6.757v20h11.36v-1H7.757z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="edge-detection" fill="none"> + <path stroke="#fff" d="M10.936 2.522c2.642.206 4.212 2.704 6.094 4.534 1.897 1.844 4.574 3.362 4.719 5.979.148 2.679-1.788 5.113-4.02 6.663-1.937 1.344-4.425.702-6.793.844-2.655.159-6.012 2.06-7.677.023-1.697-2.076 1.442-4.87 1.54-7.53.089-2.453-2.253-4.882-1.01-7.012 1.376-2.356 4.388-3.716 7.147-3.5z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="eraser"> + <g clip-path="url(#clip0)"> + <path d="M17.813 4l3.536 3.535c.339.34.557.559.714.738.15.172.192.252.21.294a1 1 0 010 .765c-.018.042-.06.122-.21.294-.157.18-.375.399-.714.738l-6.01 6.01-6.365-6.364L14.984 4c.34-.34.56-.558.738-.714.173-.15.253-.193.294-.21a1 1 0 01.766 0c.041.017.122.06.294.21.179.156.398.375.737.714zm-9.546 6.718l-6.01 6.01c-.34.34-.558.558-.714.737-.15.173-.193.253-.21.295a1 1 0 000 .765c.017.041.06.122.21.294.156.179.375.398.714.737L3.7 21h7.013l3.918-3.918-6.364-6.365zM12.127 21l9.929-9.929c.659-.659.988-.988 1.14-1.356a2 2 0 000-1.53c-.152-.368-.481-.698-1.14-1.357L18.52 3.293c-.659-.659-.988-.988-1.356-1.14a2 2 0 00-1.53 0c-.368.152-.697.481-1.356 1.14L1.55 16.021c-.66.659-.989.988-1.14 1.356a2 2 0 000 1.53c.151.368.48.698 1.14 1.357L3.286 22h20.049v-1H12.127z"></path> + </g> + <defs> + <clipPath id="clip0"> + <path transform="translate(.257)" d="M0 0h24v24H0z"></path> + </clipPath> + </defs> + </symbol> + <symbol viewBox="0 0 25 24" id="expand"> + <path d="M16.257 4v1h5v5h1V4h-6zm-14 6h1V5h5V4h-6v6zm19 9h-5v1h6v-6h-1v5zm-18-5h-1v6h6v-1h-5v-5z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="file"> + <path d="M15.257 3l4 4v14h-14V3h10zm.41-1H4.257v20h16V6.59L15.667 2z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="folder"> + <path d="M21.257 9V5h-10l-2-2h-6v6h-2l2 12h18l2-12h-2zm-17-5h4.54l2 2h9.46v3h-16V4zm-1.82 6h19.64l-1.67 10h-16.3l-1.67-10z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="forth"> + <path d="M22.257 8.64v4.65l-2.61-2.61a10.76 10.76 0 00-15.21 0 10.91 10.91 0 00-2.3 3.41c-.13.3-.23.6-.33.91h1.06c.06-.17.12-.35.19-.52a9.76 9.76 0 017.116-5.77 9.76 9.76 0 018.764 2.67l2.62 2.62h-4.66v1h6.36V8.64h-1z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="grid"> + <path d="M3.257 11h8V3h-8v8zm1-7h6v6h-6V4zm9-1v8h8V3h-8zm7 7h-6V4h6v6zm-17 11h8v-8h-8v8zm1-7h6v6h-6v-6zm9 7h8v-8h-8v8zm1-7h6v6h-6v-6z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="I"> + <path d="M17.616 3V2H6.896v1h4.86v18h-4.86v1h10.72v-1h-4.86V3h4.86z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="isosurface"> + <path d="M4.257 15.72V4h11.72v3.28h1V3H3.257v13.71h4.28v-.99h-3.28zm12.72-8.44v1h3.28V20H8.537v-3.29h-1V21h13.72V7.28h-4.28z" ></path> + <path d="M15.977 8.28v-1h-8.44v8.44h1V8.28h7.44zm-7.44 7.44h-1v1h1v-1zm8.44-8.44h-1v1h1v-1z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="lightning"> + <path d="M13.257 3l-1.47 5.76-.31 1.24h6.78l-8.1 12.88 1.94-7.65.32-1.23h-6l2.92-11h3.92zm1.28-1h-5.97l-3.4 13h6l-2.33 9h1.8l9.43-15h-7.31l1.74-7h.04z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="line"> + <path d="M20.614 2.942l.7.7L12.967 12l-.71.71L3.9 21.056l-.7-.7L11.547 12l.71-.71 8.357-8.348z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="link"> + <path d="M20.747 3.51a5 5 0 00-7.08 0l-2.19 2.2c.425 0 .847.05 1.26.15l1.64-1.64a4.002 4.002 0 015.66 5.66l-4.24 4.24a4 4 0 01-5.66 0 3.8 3.8 0 01-1-1.82l-.76.76a4.26 4.26 0 001.06 1.77 5 5 0 007.07 0l4.25-4.24a5 5 0 001.08-5.458 5 5 0 00-1.09-1.622zm-10.61 16.27a4.002 4.002 0 01-5.66-5.66l4.24-4.24a4 4 0 014.362-.868 4 4 0 011.298.868 3.8 3.8 0 011 1.82l.76-.76a4.26 4.26 0 00-1.06-1.77 5 5 0 00-7.07 0l-4.24 4.24a5.006 5.006 0 000 7.08 5.007 5.007 0 007.08 0l2.19-2.2a5.364 5.364 0 01-1.26-.15l-1.64 1.64z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="lungs"> + <g clip-path="url(#clip0)"> + <path fill-rule="evenodd" clip-rule="evenodd" d="M12.757 0h-1v8.76l-1.5 1.2V4.5h-2.86c-.869 0-1.545 0-2.093.036-.555.037-1.012.113-1.436.282a4.5 4.5 0 00-2.417 2.278c-.193.414-.295.865-.365 1.418-.068.544-.108 1.22-.159 2.086v.018l-.67 11.353-.035.605.6-.08 3.796-.508.122-.016c1.52-.204 2.423-.324 3.144-.711a4.5 4.5 0 002.085-2.383c.288-.766.288-1.676.287-3.21V11.24l2-1.6 2 1.6v4.428c0 1.534 0 2.444.287 3.21a4.5 4.5 0 002.085 2.383c.721.387 1.624.507 3.144.71l.121.017 3.796.508.601.08-.035-.605-.668-11.353-.001-.018c-.051-.867-.091-1.542-.16-2.086-.069-.553-.172-1.004-.365-1.417a4.5 4.5 0 00-2.416-2.28c-.424-.168-.88-.244-1.437-.28-.547-.037-1.224-.037-2.092-.037h-2.86v5.46l-1.5-1.2V0zm-8.52 5.747c.288-.114.628-.18 1.134-.213C5.88 5.5 6.524 5.5 7.415 5.5h1.842v10.045c0 1.694-.008 2.407-.223 2.981a3.5 3.5 0 01-1.622 1.853c-.54.29-1.246.393-2.925.618l-3.195.427.632-10.747c.053-.889.09-1.531.154-2.038.064-.503.149-.84.28-1.12a3.5 3.5 0 011.88-1.772zm16.04 0c-.288-.114-.628-.18-1.134-.213-.51-.034-1.154-.034-2.044-.034h-1.843v10.045c0 1.694.008 2.407.224 2.981a3.5 3.5 0 001.622 1.853c.54.29 1.246.393 2.925.618l3.195.427-.632-10.747c-.053-.889-.09-1.531-.155-2.038-.063-.503-.148-.84-.279-1.12a3.5 3.5 0 00-1.88-1.772z" ></path> + </g> + <defs> + <clipPath id="clip0"> + <path fill="#fff" transform="translate(.257)" d="M0 0h24v24H0z"></path> + </clipPath> + </defs> + </symbol> + <symbol viewBox="0 0 25 24" id="M"> + <path d="M17.727 2.02l-5.47 13.73-5.47-13.73h-1.41v20h1V3.48l5.4 13.54h.96l5.4-13.54v18.54h1v-20h-1.41z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="noise-reduction"> + <g clip-path="url(#clip0)"> + <path d="M18.62 5.636A9 9 0 115.894 18.364 9 9 0 0118.62 5.636zm.708-.707A10 10 0 008.43 2.76a10 10 0 1010.898 2.167z"></path> + <mask id="a" x="2" y="2" width="21" height="20"> + <path d="M5.186 4.928c3.905-3.905 10.237-3.905 14.142 0 3.905 3.906 3.905 10.237 0 14.143-3.905 3.905-10.237 3.905-14.142 0-3.905-3.906-3.905-10.237 0-14.143z"></path> + </mask> + <g mask="url(#a)"> + <path d="M3.065 21.9a.5.5 0 11-.707.707.5.5 0 01.706-.708zm1.414 1.414a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.12a.5.5 0 10-.707-.706.5.5 0 00.707.707zm1.414.708a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.121a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.415.707a.5.5 0 11-.708.708.5.5 0 01.708-.708zm1.414 2.122a.5.5 0 000-.707.5.5 0 10-.707.707.5.5 0 00.707 0zM4.479 20.485a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.122a.5.5 0 10-.707-.708.5.5 0 00.707.708zm1.414.707a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.12a.5.5 0 10-.707-.706.5.5 0 00.707.707zm1.415.708a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.121a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.414.707a.5.5 0 11-.707.707.5.5 0 01.707-.707zm-7.071-9.192a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.414.707a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.121a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.415.708a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.12a.5.5 0 000-.706.5.5 0 10-.707.707.5.5 0 00.707 0zm1.414.708a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.121a.5.5 0 10-.707-.707.5.5 0 00.707.707zm-7.07-10.606a.5.5 0 11-.708.707.5.5 0 01.707-.707zm1.413 2.121a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.415.707a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.122a.5.5 0 000-.708.5.5 0 10-.707.708.5.5 0 00.707 0zm1.414.707a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.12a.5.5 0 10-.707-.706.5.5 0 00.707.707zm1.414.708a.5.5 0 010 .707.5.5 0 01-.707 0 .5.5 0 11.707-.707zm-7.07-9.192a.5.5 0 10-.708-.707.5.5 0 00.707.707zm1.414.707a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.121a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.414.707a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.122a.5.5 0 10-.707-.708.5.5 0 00.707.708zm1.414.707a.5.5 0 010 .707.5.5 0 01-.707 0 .5.5 0 010-.707.5.5 0 01.707 0zm1.415 2.12a.5.5 0 000-.706.5.5 0 00-.707 0 .5.5 0 000 .707.5.5 0 00.707 0zm-7.071-10.606a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.122a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.414.707a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.121a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.414.707a.5.5 0 11-.707.707.5.5 0 010-.707.5.5 0 01.707 0zm1.415 2.122a.5.5 0 000-.708.5.5 0 00-.707 0 .5.5 0 10.707.708zm1.414.707a.5.5 0 010 .707.5.5 0 01-.707 0 .5.5 0 010-.707.5.5 0 01.707 0zM11.55 14.12a.5.5 0 000-.707.5.5 0 10-.707.707.5.5 0 00.707 0zm1.414.707a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.122a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.414.707a.5.5 0 010 .707.5.5 0 01-.707 0 .5.5 0 11.707-.707zm1.415 2.121a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.414.707a.5.5 0 11-.707.707.5.5 0 010-.707.5.5 0 01.707 0zm1.414 2.122a.5.5 0 000-.708.5.5 0 10-.707.708.5.5 0 00.707 0zM12.965 12a.5.5 0 11-.708.707.5.5 0 01.707-.707zm1.413 2.121a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.414.707a.5.5 0 010 .707.5.5 0 01-.707 0 .5.5 0 010-.707.5.5 0 01.707 0zm1.415 2.122a.5.5 0 10-.707-.707.5.5 0 000 .707.5.5 0 00.707 0zm1.414.707a.5.5 0 010 .707.5.5 0 01-.707 0 .5.5 0 11.707-.707zm1.414 2.121a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.414.707a.5.5 0 11-.707.707.5.5 0 01.707-.707zm-7.07-9.192a.5.5 0 10-.708-.707.5.5 0 00.707.707zm1.413.707a.5.5 0 010 .707.5.5 0 01-.707 0 .5.5 0 010-.707.5.5 0 01.707 0zm1.415 2.121a.5.5 0 000-.707.5.5 0 00-.707 0 .5.5 0 000 .707.5.5 0 00.707 0zm1.414.707a.5.5 0 010 .707.5.5 0 01-.707 0 .5.5 0 010-.707.5.5 0 01.707 0zm1.414 2.122a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.414.707a.5.5 0 010 .707.5.5 0 11-.707-.707.5.5 0 01.707 0zm1.415 2.121a.5.5 0 000-.707.5.5 0 00-.708 0 .5.5 0 000 .707.5.5 0 00.708 0zM15.792 9.172a.5.5 0 11-.707.706.5.5 0 11.707-.706zm1.415 2.12a.5.5 0 000-.706.5.5 0 00-.707 0 .5.5 0 10.707.707zM18.62 12a.5.5 0 010 .707.5.5 0 01-.707 0 .5.5 0 010-.707.5.5 0 01.707 0zm1.414 2.121a.5.5 0 000-.707.5.5 0 10-.707.707.5.5 0 00.707 0zm1.414.707a.5.5 0 010 .707.5.5 0 11-.707-.707.5.5 0 01.707 0zm1.415 2.122a.5.5 0 10-.708-.707.5.5 0 00.708.707zm1.414.707a.5.5 0 11-.708.707.5.5 0 01.708-.707zm-7.071-9.193a.5.5 0 10-.707-.707.5.5 0 10.707.707zm1.414.708a.5.5 0 11-.707.707.5.5 0 11.707-.707zm1.414 2.12a.5.5 0 000-.706.5.5 0 10-.707.707.5.5 0 00.707 0zM21.45 12a.5.5 0 010 .707.5.5 0 11-.707-.707.5.5 0 01.707 0zm1.415 2.121a.5.5 0 10-.708-.707.5.5 0 00.708.707zm1.414.707a.5.5 0 11-.708.707.5.5 0 01.708-.707zm1.414 2.122a.5.5 0 10-.707-.707.5.5 0 00.707.707zM18.621 6.343a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.121a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.414.707a.5.5 0 11-.707.708.5.5 0 01.707-.707zm1.415 2.122a.5.5 0 10-.708-.707.5.5 0 00.708.707zm1.414.707a.5.5 0 11-.708.707.5.5 0 01.708-.707zm1.414 2.121a.5.5 0 10-.707-.707.5.5 0 00.707.707zm1.414.707a.5.5 0 010 .707.5.5 0 01-.707 0 .5.5 0 010-.707.5.5 0 01.707 0zm-7.07-9.192a.5.5 0 10-.708-.707.5.5 0 00.707.707zm1.413.707a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.415 2.121a.5.5 0 10-.708-.707.5.5 0 00.708.707zm1.414.708a.5.5 0 01-.707.707.5.5 0 11.707-.707zm1.414 2.12a.5.5 0 10-.707-.706.5.5 0 00.707.707zm1.414.708a.5.5 0 010 .707.5.5 0 01-.707 0 .5.5 0 010-.707.5.5 0 01.707 0zm1.414 2.121a.5.5 0 000-.707.5.5 0 00-.707 0 .5.5 0 000 .707.5.5 0 00.707 0zM21.45 3.515a.5.5 0 11-.708.707.5.5 0 01.707-.707zm1.414 2.12a.5.5 0 10-.708-.706.5.5 0 00.708.707zm1.414.708a.5.5 0 11-.708.707.5.5 0 01.708-.707zm1.414 2.121a.5.5 0 00-.707-.707.5.5 0 10.707.707zm1.414.707a.5.5 0 11-.707.708.5.5 0 11.707-.707zm1.414 2.122a.5.5 0 000-.707.5.5 0 00-.707 0 .5.5 0 10.707.707zm1.415.707a.5.5 0 010 .707.5.5 0 11-.707-.707.5.5 0 01.707 0zm-7.071-9.192a.5.5 0 10-.708-.708.5.5 0 00.708.707zm1.414.707a.5.5 0 01-.707.707.5.5 0 11.707-.707zm1.414 2.12a.5.5 0 00-.707-.706.5.5 0 10.707.707zm1.414.708a.5.5 0 11-.707.707.5.5 0 11.707-.707zm1.414 2.121a.5.5 0 10-.707-.707.5.5 0 10.707.707zm1.415.708a.5.5 0 11-.707.707.5.5 0 01.707-.707zm1.414 2.12a.5.5 0 000-.706.5.5 0 10-.707.707.5.5 0 00.707 0z"></path> + </g> + </g> + <defs> + <clipPath id="clip0"> + <path transform="translate(.257)" d="M0 0h24v24H0z"></path> + </clipPath> + </defs> + </symbol> + <symbol viewBox="0 0 25 24" id="opacity"> + <path d="M16.937 7.32a7.5 7.5 0 00-5.356-5.09 7.5 7.5 0 00-4.004 14.45 7.5 7.5 0 005.357 5.091 7.5 7.5 0 009.094-9.094 7.5 7.5 0 00-5.09-5.357zM3.257 9.5a6.5 6.5 0 0112.53-2.42 7 7 0 00-1-.08 7.5 7.5 0 00-7.53 7.5c.003.335.03.67.08 1a6.51 6.51 0 01-4.08-6zm5 5a6.64 6.64 0 01.16-1.42l2.76 2.76a6.644 6.644 0 01-1.42.16 6.754 6.754 0 01-1.36-.14 6.75 6.75 0 01-.14-1.36zm4 1l-3.5-3.5a6.27 6.27 0 011.07-1.73l4.15 4.15a6.27 6.27 0 01-1.72 1.08zm2.44-1.78l-4.16-4.15a6.272 6.272 0 011.72-1.07l3.5 3.5a6.273 6.273 0 01-1.07 1.72h.01zm1.56-4.22a6.477 6.477 0 01-.16 1.41l-2.75-2.75a6.48 6.48 0 011.41-.16 6.75 6.75 0 011.36.14 6.747 6.747 0 01.14 1.36zm-1.5 11.5a6.51 6.51 0 01-6-4.08c.331.05.665.078 1 .08a7.5 7.5 0 007.5-7.5 6.99 6.99 0 00-.08-1 6.5 6.5 0 01-2.42 12.5z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="report"> + <path d="M15.667 2H4.257v20h16V6.59L15.667 2zm3.59 19h-14V3h10l4 4v14zm-11-7h5v-1h-5v1zm0-3h8v-1h-8v1z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="roll-up"> + <path d="M22.257 11.5h-20v1h20v-1z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="saggital"> + <path d="M4.586 18.59l-.03-10.76 9.37-5.41.01 5.31 1-.57-.02-6.46-11.35 6.55.04 13.05 5.98-3.46-.01-1.14-4.99 2.89z" ></path> + <path d="M13.946 8.87l-.01-1.14-4.37 2.53.01 5.44.99-.57-.01-4.31 3.39-1.95z" ></path> + <path d="M20.946 16.75l-.03-13.04-5.98 3.45v1.13l4.99-2.88.03 10.77-9.37 5.4-.01-5.31-.99.57.02 6.46 11.34-6.55z" ></path> + <path d="M10.566 15.13l-.99.57.01 1.14.99-.57-.01-1.14zm3.38-6.26l.99-.58V7.16l-1 .57.01 1.14z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="scissors"> + <path d="M20.697 4.48a1 1 0 00-1.42 0l-6.81 6.81-2.82-2.82A3.5 3.5 0 106.756 10a3.47 3.47 0 002.2-.8l2.8 2.8-2.8 2.8a3.47 3.47 0 00-2.2-.8 3.51 3.51 0 00-3.414 2.66 3.51 3.51 0 106.303-1.13l2.82-2.82 6.79 6.81a1 1 0 001.42 0L13.166 12l7.53-7.52zM6.757 9a2.5 2.5 0 110-5 2.5 2.5 0 010 5zm0 11a2.5 2.5 0 110-5 2.5 2.5 0 010 5z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="settings"> + <path d="M19.897 10.71l2.81-2.16a11.704 11.704 0 00-.92-2.05 11.597 11.597 0 00-1.32-1.82L17.197 6l-2.24-1.26-.46-3.51a11 11 0 00-4.48 0l-.46 3.51L7.317 6l-3.27-1.32c-.498.563-.94 1.172-1.32 1.82a11.71 11.71 0 00-.92 2.05l2.81 2.16v2.58l-2.81 2.16a11.713 11.713 0 00.92 2.05c.38.648.822 1.258 1.32 1.82L7.317 18l2.24 1.26.46 3.51a11 11 0 004.48 0l.46-3.51 2.24-1.26 3.27 1.35c.497-.562.94-1.172 1.32-1.82a11.707 11.707 0 00.92-2.05l-2.81-2.16v-2.61zm1.61 5.08a10.4 10.4 0 01-.59 1.21 9.103 9.103 0 01-.75 1.12l-2.59-1.07-.46-.19-.42.24-2.24 1.29-.43.25-.06.49-.37 2.78a10.004 10.004 0 01-2.68 0l-.37-2.78-.06-.49-.43-.25-2.24-1.29-.42-.24-.46.19-2.59 1.07a9.114 9.114 0 01-.75-1.12 10.415 10.415 0 01-.59-1.21l2.25-1.71.39-.3v-3.56l-.39-.3-2.25-1.71c.17-.415.367-.82.59-1.21a9.11 9.11 0 01.75-1.12L6.937 7l.46.19.42-.24 2.24-1.34.43-.25.06-.49.37-2.78a10 10 0 012.68 0l.37 2.78.06.49.43.25 2.24 1.29.42.24.46-.14 2.59-1.07c.275.339.526.696.75 1.07.222.39.42.795.59 1.21l-2.25 1.71-.39.3v3.56l.39.3 2.25 1.71zm-9.25-7.29a3.5 3.5 0 00-3.433 4.183 3.5 3.5 0 002.75 2.75 3.5 3.5 0 003.593-1.488 3.5 3.5 0 00-2.91-5.444zm0 6a2.5 2.5 0 110-5 2.5 2.5 0 010 5z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="square"> + <path d="M20.257 4v16h-16V4h16zm1-1h-18v18h18V3z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="T"> + <path d="M18.957 2H5.547v1h6.21v19h1V3h6.2V2z"></path> + </symbol> + <symbol id="edit" width="24" height="24" viewBox="0 0 24 24"> + <path d="M20.3765 4.98256L19.0174 3.62346C18.8281 3.43412 18.6033 3.28392 18.3559 3.18146C18.1085 3.07899 17.8434 3.02625 17.5756 3.02625C17.3079 3.02625 17.0428 3.07899 16.7954 3.18146C16.548 3.28392 16.3232 3.43412 16.1339 3.62346L3 16.7574V21H7.2427L20.3765 7.86606C20.7589 7.48367 20.9737 6.96506 20.9737 6.4243C20.9737 5.88355 20.7589 5.36494 20.3765 4.98256ZM6.8285 20H4V17.1716L14.2323 6.93926L17.0607 9.76766L6.8285 20ZM19.6694 7.15896L17.7677 9.06066L14.9393 6.23225L16.8409 4.33055C17.0358 4.13572 17.3 4.02626 17.5756 4.02626C17.8512 4.02626 18.1154 4.13572 18.3103 4.33055L19.6694 5.68996C19.8639 5.88492 19.9731 6.14907 19.9731 6.42446C19.9731 6.69984 19.8639 6.96399 19.6694 7.15896Z"/> + </symbol> + <symbol viewBox="0 0 25 24" id="target"> + <path d="M20.257 11.5a8 8 0 00-7.5-7.5V1h-1v3a8 8 0 00-7.5 7.5h-3v1h3a8 8 0 007.5 7.5v3h1v-3a8 8 0 007.5-7.5h3v-1h-3zm-8 7.5a7 7 0 01-4.95-11.95A7 7 0 1112.257 19zm0-7.75a.75.75 0 00-.736.896.75.75 0 00.59.59.75.75 0 00.896-.736.76.76 0 00-.75-.75z" ></path> + </symbol> + <symbol viewBox="0 0 25 24" id="transverse"> + <g clip-path="url(#clip0)"> + <path d="M16.537 12.59l5.05 2.92-9.3 5.4-9.36-5.41 5.05-2.94-.99-.57-6.05 3.51 11.35 6.55 11.28-6.55-6.04-3.49-.99.58z"></path> + <path d="M2.926 8.5l9.3-5.4 9.36 5.4-5.05 2.94.99.57 6.04-3.51-11.35-6.55L.936 8.5l6.05 3.49.99-.58-5.05-2.91z"></path> + <path d="M12.287 13.91l-3.32-1.92-.99.57 4.31 2.49 4.25-2.46-.99-.57-3.26 1.89z"></path> + <path d="M15.547 12.02l.99.57.99-.58-.99-.57-.99.58zm-6.58-.03l-.99-.58-.99.58.99.57.99-.57z"></path> + </g> + <defs> + <clipPath id="clip0"> + <path transform="translate(.257)" d="M0 0h24v24H0z"></path> + </clipPath> + </defs> + </symbol> + <symbol viewBox="0 0 25 24" id="triangle"> + <g clip-path="url(#clip0)"> + <path d="M12.257 3l9.81 17H2.447l9.81-17zm0-2L.707 21h23.1L12.257 1z" ></path> + </g> + <defs> + <clipPath id="clip0"> + <path transform="translate(.257)" d="M0 0h24v24H0z"></path> + </clipPath> + </defs> + </symbol> + <symbol viewBox="0 0 25 24" id="V"> + <path d="M18.417 1.98l-6.16 18.81-6.15-18.81h-1.06L11.597 22h1.32l6.55-20.02h-1.05z"></path> + </symbol> + <symbol viewBox="0 0 25 24" id="zoom"> + <path d="M21.8534 21.1465L15.9934 15.2865C17.3721 13.7241 18.0886 11.6864 17.9912 9.60497C17.8937 7.52352 16.99 5.56171 15.4714 4.13495C13.9527 2.70819 11.9384 1.92851 9.8549 1.961C7.77143 1.99349 5.78239 2.83561 4.30897 4.30903C2.83554 5.78245 1.99343 7.77149 1.96094 9.85497C1.92845 11.9384 2.70813 13.9528 4.13489 15.4714C5.56165 16.9901 7.52346 17.8938 9.60491 17.9912C11.6864 18.0887 13.724 17.3722 15.2864 15.9935L21.1464 21.8535L21.8534 21.1465ZM9.99993 17C8.61546 17 7.26208 16.5894 6.11094 15.8203C4.95979 15.0511 4.06259 13.9579 3.53277 12.6788C3.00296 11.3997 2.86434 9.99223 3.13443 8.63436C3.40453 7.27649 4.07122 6.02921 5.05018 5.05024C6.02915 4.07128 7.27643 3.40459 8.6343 3.13449C9.99216 2.8644 11.3996 3.00302 12.6787 3.53283C13.9578 4.06265 15.051 4.95986 15.8202 6.111C16.5894 7.26214 16.9999 8.61552 16.9999 9.99999C16.9978 11.8559 16.2597 13.6351 14.9474 14.9474C13.6351 16.2597 11.8558 16.9979 9.99993 17Z" /> </symbol> + <symbol viewBox="0 0 25 24" id="zoom_100"> + <path d="M15.9934 15.2865C17.3721 13.7241 18.0886 11.6864 17.9912 9.60497C17.8937 7.52352 16.99 5.56171 15.4714 4.13495C13.9527 2.70819 11.9384 1.92851 9.8549 1.961C7.77143 1.99349 5.78239 2.83561 4.30897 4.30903C2.83554 5.78245 1.99343 7.77149 1.96094 9.85497C1.92845 11.9384 2.70813 13.9528 4.13489 15.4714C5.56165 16.9901 7.52346 17.8938 9.60491 17.9912C11.6864 18.0887 13.724 17.3722 15.2864 15.9935L21.1464 21.8535L21.8534 21.1465L15.9934 15.2865ZM9.99993 17C8.61546 17 7.26208 16.5894 6.11094 15.8203C4.95979 15.0511 4.06259 13.9579 3.53277 12.6788C3.00296 11.3997 2.86434 9.99223 3.13443 8.63436C3.40453 7.27649 4.07122 6.02921 5.05018 5.05024C6.02915 4.07128 7.27643 3.40459 8.6343 3.13449C9.99216 2.8644 11.3996 3.00302 12.6787 3.53283C13.9578 4.06265 15.051 4.95986 15.8202 6.111C16.5894 7.26214 16.9999 8.61552 16.9999 9.99999C16.9978 11.8559 16.2597 13.6351 14.9474 14.9474C13.6351 16.2597 11.8558 16.9979 9.99993 17ZM12.0839 7.20899L9.99993 9.29299L7.91593 7.20899L7.20893 7.91599L9.29293 9.99999L7.20893 12.084L7.91593 12.791L9.99993 10.707L12.0839 12.791L12.7909 12.084L10.7069 9.99999L12.7909 7.91599L12.0839 7.20899Z"/> + </symbol> + <symbol viewBox="0 0 49 49" fill="none" id="dropzone"> + <path d="M0 7V3H1V1H3V0H7V1H13V0H17V1H23V0H27V1H33V0H37V1H39V3H40V7H39V13H40V17H39V23H40V27H39V33H40V37H39V39H37V40H33V39H27V40H23V39H17V40H13V39H7V40H3V39H1V37H0V33H1V27H0V23H1V17H0V13H1V7H0Z" stroke="white" stroke-width="2" stroke-dasharray="6 4"/> + <path d="M10 10H48V48H10V10Z" stroke="white" stroke-width="2"/> + </symbol> + <symbol viewBox="0 0 19 18" fill="none" id="model"> + <path d="M0.920166 8H8.92017V0H0.920166V8ZM1.92017 1H7.92017V7H1.92017V1ZM10.9202 0V8H18.9202V0H10.9202ZM17.9202 7H11.9202V1H17.9202V7ZM0.920166 18H8.92017V10H0.920166V18ZM1.92017 11H7.92017V17H1.92017V11ZM10.9202 18H18.9202V10H10.9202V18ZM11.9202 11H17.9202V17H11.9202V11Z" fill="white"/> + </symbol> + <symbol viewBox="0 0 120 115" fill="none" id="logo2"> + <path d="M31.2463 51.4078V0H33.9341V52.5211L1.24401 85.2113L0 82.6541L31.2463 51.4078Z" fill="white"/> + <path d="M15.3184 114.142L54.6494 74.8109H120L118.692 72.1231H53.5361L14.0744 111.585L15.3184 114.142Z" fill="white"/> + <path d="M11.7998 106.909L51.0657 67.6434H116.513L115.206 64.9556H49.9523L10.5558 104.352L11.7998 106.909Z" fill="white"/> + <path d="M8.28121 99.6766L47.4819 60.4759H113.026L111.719 57.7881H48.2692V0H45.5813V58.5753L7.03719 97.1195L8.28121 99.6766Z" fill="white"/> + <path d="M4.76261 92.4439L41.1016 56.1049V0H38.4138V54.9916L3.5186 89.8868L4.76261 92.4439Z" fill="white"/> + <path d="M109.539 53.3084L108.232 50.6206H55.4367V0H52.7489V53.3084H109.539Z" fill="white"/> + <path d="M106.052 46.1409L104.745 43.453H62.6042V0H59.9164V46.1409H106.052Z" fill="white"/> + </symbol> + +</svg> diff --git a/src/App.js b/src/App.js new file mode 100644 index 00000000..150e81ae --- /dev/null +++ b/src/App.js @@ -0,0 +1,19 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { Main } from './ui/Main'; +import { HTML5Backend } from 'react-dnd-html5-backend'; +import { DndProvider } from 'react-dnd'; + +const App = () => { + return ( + <DndProvider backend={HTML5Backend}> + <Main /> + </DndProvider> + ); +}; + +export default App; diff --git a/src/demo/config/config.js b/src/config/config.js similarity index 60% rename from src/demo/config/config.js rename to src/config/config.js index 559f7d42..3c6f3a74 100644 --- a/src/demo/config/config.js +++ b/src/config/config.js @@ -1,9 +1,12 @@ -export default { +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +const config = { // special demo dialog file locations - // - demoUrls: [ - ], + demoUrls: [], googleCloudDemoActivce: false, arrMenuGoogle: [ @@ -20,11 +23,10 @@ export default { tooltip: 'Write here smth please', }, ], - demoWomanPelvisPrefix : '', - demoWomanPelvisUrls : [ - ], + demoWomanPelvisPrefix: '', + demoWomanPelvisUrls: [], demoLungsPrefix: '', - demoLungsUrls: [ - ], + demoLungsUrls: [], +}; -}; \ No newline at end of file +export default config; diff --git a/src/demo/App.css b/src/demo/App.css deleted file mode 100644 index 92f956e8..00000000 --- a/src/demo/App.css +++ /dev/null @@ -1,32 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - animation: App-logo-spin infinite 20s linear; - height: 40vmin; -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/src/demo/App.js b/src/demo/App.js deleted file mode 100644 index 39440f27..00000000 --- a/src/demo/App.js +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import UiApp from './ui/UiApp'; - -import './App.css'; - -class App extends React.Component { - render() { - return <UiApp /> - } -} - -export default connect(store => store)(App); diff --git a/src/demo/App.test.js b/src/demo/App.test.js deleted file mode 100644 index c0b5d441..00000000 --- a/src/demo/App.test.js +++ /dev/null @@ -1,21 +0,0 @@ -// Global imports -import React from 'react'; -import { Provider } from 'react-redux' -import ReactDOM from 'react-dom'; -import { createStore } from 'redux'; - -// local imports -import App from './App'; -import rootReducer from './store/Store'; - -// tests -describe('AppTests', () => { - it('renders without crashing', () => { - const div = document.createElement('div'); - const store = createStore(rootReducer); - ReactDOM.render(<Provider store={store}> - <App /> - </Provider>, div); - ReactDOM.unmountComponentAtNode(div); - }); -}); diff --git a/src/demo/engine/GlSelector.js b/src/demo/engine/GlSelector.js deleted file mode 100644 index 5c570ba8..00000000 --- a/src/demo/engine/GlSelector.js +++ /dev/null @@ -1,63 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -// import * as THREE from 'three'; - -/** -* OpenGL, WebGL renderer selector -* @module lib/scripts/graphics3d/glselector -*/ - -export default class GlSelector { - /** constructor: defines fields - * @constructor - */ - constructor() { - this.m_useWebGL2 = undefined; - } - - /** Create compatible canvas - * - */ - createWebGLContext() { - this.canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas'); - let context = this.canvas.getContext('webgl2'); - this.m_useWebGL2 = 1; - if (context == null) { - console.log('WebGL 2 not supported, moving to webgl 1'); - context = this.canvas.getContext('webgl'); - this.m_useWebGL2 = 0; - } else { - console.log('WebGL 2 context created'); - } - return context; - } - - /** return canvas */ - getCanvas() { - return this.canvas; - } - - /** Create compatible canvas - * - */ - useWebGL2() { - return this.m_useWebGL2; - } -} diff --git a/src/demo/engine/Graphics2d.js b/src/demo/engine/Graphics2d.js deleted file mode 100644 index 7d54f22b..00000000 --- a/src/demo/engine/Graphics2d.js +++ /dev/null @@ -1,849 +0,0 @@ -/** - * @fileOverview Graphics2d - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; - -import Modes2d from '../store/Modes2d'; -import StoreActionType from '../store/ActionTypes'; -import ToolPick from './tools2d/ToolPick'; -import ToolZoom from './tools2d/ToolZoom'; -import ToolDistance from './tools2d/ToolDistance'; -import ToolClear from './tools2d/ToolClear'; -import ToolAngle from './tools2d/ToolAngle'; -import ToolArea from './tools2d/ToolArea'; -import ToolRect from './tools2d/ToolRect'; -import ToolText from './tools2d/ToolText'; -import ToolEdit from './tools2d/ToolEdit'; -import ToolDelete from './tools2d/ToolDelete'; - -import Tools2dType from './tools2d/ToolTypes'; -import Segm2d from './Segm2d'; - -import RoiPalette from './loaders/roipalette'; - -// import { timingSafeEqual } from 'crypto'; - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class Graphics2d some text later... - */ -class Graphics2d extends React.Component { - /** - * @param {object} props - props from up level object - */ - constructor(props) { - super(props); - - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); - this.onMouseMove = this.onMouseMove.bind(this); - this.onMouseWheel = this.onMouseWheel.bind(this); - - this.m_sliceRatio = 0.5; - this.m_mode2d = Modes2d.TRANSVERSE; - - // scale - this.m_zoom = 1; - this.m_xPos = 0; - this.m_yPos = 0; - - // mounted - this.m_isMounted = false; - - // animation - // this.animate = this.animate.bind(this); - // this.m_frameId = null; - - // actual render window dimenison - this.state = { - wRender: 0, - hRender: 0, - stateMouseDown: false, - xMouse: -1, - yMouse: -1, - }; - // segm 2d - this.segm2d = new Segm2d(this); - this.m_isSegmented = false; - - // tools2d - this.m_toolPick = new ToolPick(this); - this.m_toolDistance = new ToolDistance(this); - this.m_toolZoom = new ToolZoom(this); - this.m_toolClear = new ToolClear(this); - this.m_toolAngle = new ToolAngle(this); - this.m_toolArea = new ToolArea(this); - this.m_toolRect = new ToolRect(this); - this.m_toolText = new ToolText(this); - this.m_toolEdit = new ToolEdit(this); - this.m_toolDelete = new ToolDelete(this); - - // roi - this.m_roiPalette = new RoiPalette(); - - // store - const store = props; - store.dispatch({ type: StoreActionType.SET_GRAPHICS_2D, graphics2d: this }); - - } - - /* - start() { - if (this.m_frameId === null) { - this.m_frameId = requestAnimationFrame(this.animate); - } - } - stop() { - cancelAnimationFrame(this.m_frameId); - this.m_frameId = null; - } - animate() { - // this.renderScene(); - // this.m_frameId = window.requestAnimationFrame(this.animate); - } - */ - componentDidMount() { - this.m_isMounted = true; - // this.start(); - // this.renderScene(); - - this.prepareImageForRender(); - this.renderReadyImage(); - - - // detect actual render window dims - const w = this.m_mount.clientWidth; - const h = this.m_mount.clientHeight; - if (this.state.wRender === 0) { - this.setState({ wRender: w }); - this.setState({ hRender: h }); - } - } - - componentWillUnmount() { - this.m_isMounted = false; - } - - componentDidUpdate() { - // this.prepareImageForRender(); - if (this.m_isMounted) { - this.renderReadyImage(); - } - } - - /** - * Get screenshot - * - * @param {nuimber} wShot - x size of screenshot - * @param {nuimber} hShot - y size of screenshot - */ - screenshot(wShot, hShot) { - console.log(`get screenshot from 2d canvas: ${wShot}*${hShot}`); - const objCanvas = this.m_mount; - //const ctx = objCanvas.getContext('2d'); - //const imageData = ctx.getImageData(0, 0, wShot, hShot); - //console.log(`image data: ${imageData}`); - const dataUrl = objCanvas.toDataURL(); - return dataUrl; - } - - /** - * Render text info about volume - * - * @param {object} ctx - render context - * @param {VolumeSet} volSet - volume set to rener - */ - renderTextInfo(ctx, volSet, vol) { - let strMsg; - let xText = 4; - let yText = 4; - const FONT_SZ = 16; - ctx.font = FONT_SZ.toString() + 'px Arial'; - ctx.textAlign = 'left'; - ctx.textBaseline = 'top'; - ctx.fillStyle = 'grey'; - - strMsg = 'volume dim = ' + vol.m_xDim.toString() + ' * ' + - vol.m_yDim.toString() + ' * ' + - vol.m_zDim.toString(); - ctx.fillText(strMsg, xText, yText); - yText += FONT_SZ; - - const xSize = Math.floor(vol.m_boxSize.x); - const ySize = Math.floor(vol.m_boxSize.y); - const zSize = Math.floor(vol.m_boxSize.z); - strMsg = 'vol phys size = ' + xSize.toString() + ' * ' + - ySize.toString() + ' * ' + - zSize.toString(); - ctx.fillText(strMsg, xText, yText); - yText += FONT_SZ; - - const patName = volSet.m_patientName; - if (patName.length > 1) { - strMsg = 'patient name = ' + patName; - ctx.fillText(strMsg, xText, yText); - yText += FONT_SZ; - } - const patBirth = volSet.m_patientBirth; - if (patBirth.length > 1) { - strMsg = 'patient birth = ' + patBirth; - ctx.fillText(strMsg, xText, yText); - yText += FONT_SZ; - } - const seriesDescr = volSet.m_seriesDescr; - if (seriesDescr.length > 1) { - strMsg = 'series descr = ' + seriesDescr; - ctx.fillText(strMsg, xText, yText); - yText += FONT_SZ; - } - const institutionName = volSet.m_institutionName; - if (institutionName.length > 1) { - strMsg = 'institution name = ' + institutionName; - ctx.fillText(strMsg, xText, yText); - yText += FONT_SZ; - } - const operatorsName = volSet.m_operatorsName; - if (operatorsName.length > 1) { - strMsg = 'operators name = ' + operatorsName; - ctx.fillText(strMsg, xText, yText); - yText += FONT_SZ; - } - const physicansName = volSet.m_physicansName; - if (physicansName.length > 1) { - strMsg = 'physicans name = ' + physicansName; - ctx.fillText(strMsg, xText, yText); - yText += FONT_SZ; - } - - } - - prepareImageForRender(volIndexArg) { - // console.log('prepareImageForRender ...'); - const objCanvas = this.m_mount; - if (objCanvas === null) { - return; - } - const ctx = objCanvas.getContext('2d'); - const w = objCanvas.clientWidth; - const h = objCanvas.clientHeight; - if (w * h === 0) { - return; - } - - const store = this.props; - - ctx.fillStyle = 'rgb(64, 64, 64)'; - ctx.fillRect(0,0, w, h); - // console.log(`render scene 2d. screen = ${w} * ${h}`); - - // Test draw chessboard - const NEED_TEST_RAINBOW = false; - if (NEED_TEST_RAINBOW) { - const wImg = 800; - const hImg = 600; - const imgData = ctx.createImageData(wImg, hImg); - const dataDst = imgData.data; - let j = 0; - for (let y = 0; y < hImg; y++) { - for (let x = 0; x < wImg; x++) { - dataDst[j + 0] = Math.floor(255 * x / wImg); - dataDst[j + 1] = Math.floor(255 * y / hImg); - dataDst[j + 2] = 120; - dataDst[j + 3] = 255; - j += 4; - } // for (x) - } // for (y) - ctx.putImageData(imgData, 0, 0); - } - - const volSet = store.volumeSet; - // const volIndex = this.m_volumeIndex; - const volIndex = (volIndexArg !== undefined) ? volIndexArg : store.volumeIndex; - - const vol = volSet.getVolume(volIndex); - const mode2d = this.m_mode2d; - const sliceRatio = store.slider2d; - - if (vol !== null) { - if (vol.m_dataArray === null) { - console.log('Graphics2d. Volume has no data array'); - return; - } - const xDim = vol.m_xDim; - const yDim = vol.m_yDim; - const zDim = vol.m_zDim; - const xyDim = xDim * yDim; - const dataSrc = vol.m_dataArray; // 1 or 4 bytes array of pixels - if (dataSrc.length !== xDim * yDim * zDim * vol.m_bytesPerVoxel) { - console.log(`Bad src data len = ${dataSrc.length}, but expect ${xDim}*${yDim}*${zDim}`); - } - - // console.log(`Graphics2d. prepareImageForRender. mode= ${mode2d}`); - - const ONE = 1; - const FOUR = 4; - const OFF_3 = 3; - - let imgData = null; - let dataDst = null; - - const roiPal256 = this.m_roiPalette.getPalette256(); - - // determine actual render square (not w * h - viewport) - // calculate area using physical volume dimension - const TOO_SMALL = 1.0e-5; - const pbox = vol.m_boxSize; - if (pbox.x * pbox.y * pbox.z < TOO_SMALL) { - console.log(`Bad physical dimensions for rendered volume = ${pbox.x}*${pbox.y}*${pbox.z} `); - } - let wScreen = 0, hScreen = 0; - - const xPos = store.render2dxPos; - const yPos = store.render2dyPos; - const zoom = store.render2dZoom; - // console.log(`Gra2d. RenderScene. zoom=${zoom}, xyPos=${xPos}, ${yPos}`); - if (mode2d === Modes2d.TRANSVERSE) { - // calc screen rect based on physics volume slice size (z slice) - const xyRratio = pbox.x / pbox.y; - wScreen = w; - hScreen = Math.floor(w / xyRratio); - if (hScreen > h) { - hScreen = h; - wScreen = Math.floor(h * xyRratio); - if (wScreen > w) { - console.log(`logic error! wScreen * hScreen = ${wScreen} * ${hScreen}`); - } - } - hScreen = (hScreen > 0) ? hScreen : 1; - // console.log(`gra2d. render: wScreen*hScreen = ${wScreen} * ${hScreen}, but w*h=${w}*${h} `); - - this.m_toolPick.setScreenDim(wScreen, hScreen); - this.m_toolZoom.setScreenDim(wScreen, hScreen); - this.m_toolDistance.setScreenDim(wScreen, hScreen); - this.m_toolAngle.setScreenDim(wScreen, hScreen); - this.m_toolArea.setScreenDim(wScreen, hScreen); - this.m_toolRect.setScreenDim(wScreen, hScreen); - this.m_toolText.setScreenDim(wScreen, hScreen); - this.m_toolEdit.setScreenDim(wScreen, hScreen); - this.m_toolDelete.setScreenDim(wScreen, hScreen); - - // setup pixel size for 2d tools - const xPixelSize = vol.m_boxSize.x / xDim; - const yPixelSize = vol.m_boxSize.y / yDim; - // console.log(`xyPixelSize = ${xPixelSize} * ${yPixelSize}`); - this.m_toolDistance.setPixelSize(xPixelSize, yPixelSize); - this.m_toolAngle.setPixelSize(xPixelSize, yPixelSize); - this.m_toolArea.setPixelSize(xPixelSize, yPixelSize); - this.m_toolRect.setPixelSize(xPixelSize, yPixelSize); - this.m_toolText.setPixelSize(xPixelSize, yPixelSize); - this.m_toolEdit.setPixelSize(xPixelSize, yPixelSize); - this.m_toolDelete.setPixelSize(xPixelSize, yPixelSize); - - // create image data - imgData = ctx.createImageData(wScreen, hScreen); - dataDst = imgData.data; - if (dataDst.length !== wScreen * hScreen * 4) { - console.log(`Bad dst data len = ${dataDst.length}, but expect ${wScreen}*${hScreen}*4`); - } - - // z slice - let zSlice = Math.floor(zDim * sliceRatio); - zSlice = (zSlice < zDim) ? zSlice : (zDim - 1); - const zOff = zSlice * xyDim; - const xStep = zoom * xDim / wScreen; - const yStep = zoom * yDim / hScreen; - let j = 0; - let ay = yPos * yDim; - if (vol.m_bytesPerVoxel === ONE) { - for (let y = 0; y < hScreen; y++, ay += yStep) { - const ySrc = Math.floor(ay); - const yOff = ySrc * xDim; - let ax = xPos * xDim; - for (let x = 0; x < wScreen; x++, ax += xStep) { - const xSrc = Math.floor(ax); - const val = dataSrc[zOff + yOff + xSrc]; - dataDst[j + 0] = val; - dataDst[j + 1] = val; - dataDst[j + 2] = val; - dataDst[j + 3] = 255; // opacity - j += 4; - } // for (x) - } // for (y) - - } else if (vol.m_bytesPerVoxel === FOUR) { - for (let y = 0; y < hScreen; y++, ay += yStep) { - const ySrc = Math.floor(ay); - const yOff = ySrc * xDim; - let ax = xPos * xDim; - for (let x = 0; x < wScreen; x++, ax += xStep) { - const xSrc = Math.floor(ax); - const val = dataSrc[(zOff + yOff + xSrc) * FOUR + OFF_3]; - const val4 = val * FOUR; - const rCol = roiPal256[val4 + 0]; - const gCol = roiPal256[val4 + 1]; - const bCol = roiPal256[val4 + 2]; - - dataDst[j + 0] = bCol; - dataDst[j + 1] = gCol; - dataDst[j + 2] = rCol; - dataDst[j + 3] = 255; - j += 4; - } // for (x) - } // for (y) - - } // if 4 bpp - - } else if (mode2d === Modes2d.SAGGITAL) { - // calc screen rect based on physics volume slice size (x slice) - const yzRatio = pbox.y / pbox.z; - wScreen = w; - hScreen = Math.floor(w / yzRatio); - if (hScreen > h) { - hScreen = h; - wScreen = Math.floor(h * yzRatio); - if (wScreen > w) { - console.log(`logic error! wScreen * hScreen = ${wScreen} * ${hScreen}`); - } - } - hScreen = (hScreen > 0) ? hScreen : 1; - // console.log(`gra2d. render: wScreen*hScreen = ${wScreen} * ${hScreen}, but w*h=${w}*${h} `); - - this.m_toolPick.setScreenDim(wScreen, hScreen); - this.m_toolZoom.setScreenDim(wScreen, hScreen); - this.m_toolDistance.setScreenDim(wScreen, hScreen); - this.m_toolAngle.setScreenDim(wScreen, hScreen); - this.m_toolArea.setScreenDim(wScreen, hScreen); - this.m_toolRect.setScreenDim(wScreen, hScreen); - this.m_toolText.setScreenDim(wScreen, hScreen); - this.m_toolEdit.setScreenDim(wScreen, hScreen); - this.m_toolDelete.setScreenDim(wScreen, hScreen); - - // setup pixel size for 2d tools - const xPixelSize = vol.m_boxSize.y / yDim; - const yPixelSize = vol.m_boxSize.z / zDim; - // console.log(`xyPixelSize = ${xPixelSize} * ${yPixelSize}`); - this.m_toolDistance.setPixelSize(xPixelSize, yPixelSize); - this.m_toolAngle.setPixelSize(xPixelSize, yPixelSize); - this.m_toolArea.setPixelSize(xPixelSize, yPixelSize); - this.m_toolRect.setPixelSize(xPixelSize, yPixelSize); - this.m_toolText.setPixelSize(xPixelSize, yPixelSize); - this.m_toolEdit.setPixelSize(xPixelSize, yPixelSize); - this.m_toolDelete.setPixelSize(xPixelSize, yPixelSize); - - // create image data - imgData = ctx.createImageData(wScreen, hScreen); - dataDst = imgData.data; - if (dataDst.length !== wScreen * hScreen * 4) { - console.log(`Bad dst data len = ${dataDst.length}, but expect ${wScreen}*${hScreen}*4`); - } - - // x slice - let xSlice = Math.floor(xDim * sliceRatio); - xSlice = (xSlice < xDim) ? xSlice : (xDim - 1); - - const yStep = zoom * yDim / wScreen; - const zStep = zoom * zDim / hScreen; - let j = 0; - let az = yPos * zDim; - if (vol.m_bytesPerVoxel === ONE) { - for (let y = 0; y < hScreen; y++, az += zStep) { - const zSrc = Math.floor(az); - const zOff = zSrc * xDim * yDim; - let ay = xPos * yDim; - for (let x = 0; x < wScreen; x++, ay += yStep) { - const ySrc = Math.floor(ay); - const yOff = ySrc * xDim; - const val = dataSrc[zOff + yOff + xSlice]; - - dataDst[j + 0] = val; - dataDst[j + 1] = val; - dataDst[j + 2] = val; - dataDst[j + 3] = 255; // opacity - - j += 4; - } // for (x) - } // for (y) - } else if (vol.m_bytesPerVoxel === FOUR) { - for (let y = 0; y < hScreen; y++, az += zStep) { - const zSrc = Math.floor(az); - const zOff = zSrc * xDim * yDim; - let ay = xPos * yDim; - for (let x = 0; x < wScreen; x++, ay += yStep) { - const ySrc = Math.floor(ay); - const yOff = ySrc * xDim; - const val = dataSrc[(zOff + yOff + xSlice) * FOUR + OFF_3]; - const val4 = val * FOUR; - const rCol = roiPal256[val4 + 0]; - const gCol = roiPal256[val4 + 1]; - const bCol = roiPal256[val4 + 2]; - - dataDst[j + 0] = bCol; - dataDst[j + 1] = gCol; - dataDst[j + 2] = rCol; - dataDst[j + 3] = 255; // opacity - - j += 4; - } // for (x) - } // for (y) - } // if 4 bppp - } else if (mode2d === Modes2d.CORONAL) { - // calc screen rect based on physics volume slice size (y slice) - const xzRatio = pbox.x / pbox.z; - wScreen = w; - hScreen = Math.floor(w / xzRatio); - if (hScreen > h) { - hScreen = h; - wScreen = Math.floor(h * xzRatio); - if (wScreen > w) { - console.log(`logic error! wScreen * hScreen = ${wScreen} * ${hScreen}`); - } - } - hScreen = (hScreen > 0) ? hScreen : 1; - // console.log(`gra2d. render: wScreen*hScreen = ${wScreen} * ${hScreen}, but w*h=${w}*${h} `); - - this.m_toolPick.setScreenDim(wScreen, hScreen); - this.m_toolZoom.setScreenDim(wScreen, hScreen); - this.m_toolDistance.setScreenDim(wScreen, hScreen); - this.m_toolAngle.setScreenDim(wScreen, hScreen); - this.m_toolArea.setScreenDim(wScreen, hScreen); - this.m_toolRect.setScreenDim(wScreen, hScreen); - this.m_toolText.setScreenDim(wScreen, hScreen); - this.m_toolEdit.setScreenDim(wScreen, hScreen); - this.m_toolDelete.setScreenDim(wScreen, hScreen); - - // setup pixel size for 2d tools - const xPixelSize = vol.m_boxSize.x / xDim; - const yPixelSize = vol.m_boxSize.z / zDim; - // console.log(`xyPixelSize = ${xPixelSize} * ${yPixelSize}`); - this.m_toolDistance.setPixelSize(xPixelSize, yPixelSize); - this.m_toolAngle.setPixelSize(xPixelSize, yPixelSize); - this.m_toolArea.setPixelSize(xPixelSize, yPixelSize); - this.m_toolRect.setPixelSize(xPixelSize, yPixelSize); - this.m_toolText.setPixelSize(xPixelSize, yPixelSize); - this.m_toolEdit.setPixelSize(xPixelSize, yPixelSize); - this.m_toolDelete.setPixelSize(xPixelSize, yPixelSize); - - // create image data - imgData = ctx.createImageData(wScreen, hScreen); - dataDst = imgData.data; - if (dataDst.length !== wScreen * hScreen * 4) { - console.log(`Bad dst data len = ${dataDst.length}, but expect ${wScreen}*${hScreen}*4`); - } - - // y slice - let ySlice = Math.floor(yDim * sliceRatio); - ySlice = (ySlice < yDim) ? ySlice : (yDim - 1); - const yOff = ySlice * xDim; - - const xStep = zoom * xDim / wScreen; - const zStep = zoom * zDim / hScreen; - let j = 0; - let az = yPos * zDim; - if (vol.m_bytesPerVoxel === ONE) { - for (let y = 0; y < hScreen; y++, az += zStep) { - const zSrc = Math.floor(az); - const zOff = zSrc * xDim * yDim; - let ax = xPos * xDim; - for (let x = 0; x < wScreen; x++, ax += xStep) { - const xSrc = Math.floor(ax); - const val = dataSrc[zOff + yOff + xSrc]; - - dataDst[j + 0] = val; - dataDst[j + 1] = val; - dataDst[j + 2] = val; - dataDst[j + 3] = 255; // opacity - - j += 4; - } // for (x) - } // for (y) - } else if (vol.m_bytesPerVoxel === FOUR) { - for (let y = 0; y < hScreen; y++, az += zStep) { - const zSrc = Math.floor(az); - const zOff = zSrc * xDim * yDim; - let ax = xPos * xDim; - for (let x = 0; x < wScreen; x++, ax += xStep) { - const xSrc = Math.floor(ax); - const val = dataSrc[(zOff + yOff + xSrc) * FOUR + OFF_3]; - const val4 = val * FOUR; - const rCol = roiPal256[val4 + 0]; - const gCol = roiPal256[val4 + 1]; - const bCol = roiPal256[val4 + 2]; - - dataDst[j + 0] = bCol; - dataDst[j + 1] = gCol; - dataDst[j + 2] = rCol; - dataDst[j + 3] = 255; // opacity - - j += 4; - } // for (x) - } // for (y) - } // end if 4 bpp - } - - // check is segmentation 2d mode is active - // const isSegm = store.graphics2dModeSegmentation; - // console.log("Segm2d mode = " + isSegm); - - this.imgData = imgData; - this.segm2d.setImageData(imgData); - } // if vol not null - } // prepareImageForRender - - renderReadyImage() { - // console.log('renderReadyImage ...'); - if (!this.m_isMounted) { - return; - } - - const objCanvas = this.m_mount; - if (objCanvas === null) { - return; - } - const ctx = objCanvas.getContext('2d'); - const store = this.props; - - const volSet = store.volumeSet; - if (volSet.getNumVolumes() === 0) { - return; - } - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - if (vol === null) { - return; - } - - const isSegm = this.m_isSegmented; - if (isSegm) { - const w = this.m_toolPick.m_wScreen; - const h = this.m_toolPick.m_hScreen; - this.segm2d.render(ctx, w, h, this.imgData); - } else { - ctx.putImageData(this.imgData, 0, 0); - } - // render text info - this.renderTextInfo(ctx, volSet, vol); - // render all tools - this.m_toolPick.render(ctx); - this.m_toolDistance.render(ctx, store); - this.m_toolAngle.render(ctx, store); - this.m_toolArea.render(ctx, store); - this.m_toolRect.render(ctx, store); - this.m_toolText.render(ctx, store); - this.m_toolEdit.render(ctx, store); - this.m_toolDelete.render(ctx, store); - } - - onMouseWheel(evt) { - const store = this.props; - const indexTools2d = store.indexTools2d; - if (indexTools2d === Tools2dType.ZOOM) { - this.m_toolZoom.onMouseWheel(store, evt); - } - } - - onMouseUp(evt) { - const store = this.props; - const indexTools2d = store.indexTools2d; - if (indexTools2d === Tools2dType.ZOOM) { - this.m_toolZoom.onMouseUp(); - } - if (indexTools2d === Tools2dType.DISTANCE) { - const store = this.props; - const box = this.m_mount.getBoundingClientRect(); - const xScr = evt.clientX - box.left; - const yScr = evt.clientY - box.top; - this.m_toolDistance.onMouseUp(xScr, yScr, store); - } - if (indexTools2d === Tools2dType.ANGLE) { - const store = this.props; - const box = this.m_mount.getBoundingClientRect(); - const xScr = evt.clientX - box.left; - const yScr = evt.clientY - box.top; - this.m_toolAngle.onMouseUp(xScr, yScr, store); - } - if (indexTools2d === Tools2dType.AREA) { - const store = this.props; - const box = this.m_mount.getBoundingClientRect(); - const xScr = evt.clientX - box.left; - const yScr = evt.clientY - box.top; - this.m_toolArea.onMouseUp(xScr, yScr, store); - } - if (indexTools2d === Tools2dType.RECT) { - const store = this.props; - const box = this.m_mount.getBoundingClientRect(); - const xScr = evt.clientX - box.left; - const yScr = evt.clientY - box.top; - this.m_toolRect.onMouseUp(xScr, yScr, store); - } - if (indexTools2d === Tools2dType.EDIT) { - const store = this.props; - const box = this.m_mount.getBoundingClientRect(); - const xScr = evt.clientX - box.left; - const yScr = evt.clientY - box.top; - this.m_toolEdit.onMouseUp(xScr, yScr, store); - } - if (indexTools2d === Tools2dType.DELETE) { - const store = this.props; - const box = this.m_mount.getBoundingClientRect(); - const xScr = evt.clientX - box.left; - const yScr = evt.clientY - box.top; - this.m_toolDelete.onMouseUp(xScr, yScr, store); - } - } - - onMouseMove(evt) { - const store = this.props; - const indexTools2d = store.indexTools2d; - const box = this.m_mount.getBoundingClientRect(); - const xContainer = evt.clientX - box.left; - const yContainer = evt.clientY - box.top; - const xScr = xContainer; - const yScr = yContainer; - - if (indexTools2d === Tools2dType.ZOOM) { - this.m_toolZoom.onMouseMove(store, xScr, yScr); - } - if (indexTools2d === Tools2dType.DISTANCE) { - this.m_toolDistance.onMouseMove(xScr, yScr, store); - } - if (indexTools2d === Tools2dType.ANGLE) { - this.m_toolAngle.onMouseMove(xScr, yScr, store); - } - if (indexTools2d === Tools2dType.AREA) { - this.m_toolArea.onMouseMove(xScr, yScr, store); - } - if (indexTools2d === Tools2dType.RECT) { - this.m_toolRect.onMouseMove(xScr, yScr, store); - } - if (indexTools2d === Tools2dType.EDIT) { - this.m_toolEdit.onMouseMove(xScr, yScr, store); - } - if (indexTools2d === Tools2dType.DELETE) { - this.m_toolDelete.onMouseMove(xScr, yScr, store); - } - } - - onMouseDown(evt) { - const box = this.m_mount.getBoundingClientRect(); - const xContainer = evt.clientX - box.left; - const yContainer = evt.clientY - box.top; - const xScr = xContainer; - const yScr = yContainer; - // console.log(`onMouseDown. down = ${xScr}, ${yScr}`); - - const store = this.props; - const indexTools2d = store.indexTools2d; - // console.log(`onMouseDown. tool index = ${indexTools2d}`); - - - switch (indexTools2d) { - case Tools2dType.INTENSITY: - this.m_toolPick.onMouseDown(xScr, yScr, store); - break; - case Tools2dType.DISTANCE: - this.m_toolDistance.onMouseDown(xScr, yScr, store); - break; - case Tools2dType.ZOOM: - this.m_toolZoom.onMouseDown(xScr, yScr); - break; - case Tools2dType.ANGLE: - this.m_toolAngle.onMouseDown(xScr, yScr, store); - break; - case Tools2dType.AREA: - this.m_toolArea.onMouseDown(xScr, yScr, store); - break; - case Tools2dType.RECT: - this.m_toolRect.onMouseDown(xScr, yScr, store); - break; - case Tools2dType.TEXT: - this.m_toolText.onMouseDown(xScr, yScr, store); - break; - case Tools2dType.EDIT: - this.m_toolEdit.onMouseDown(xScr, yScr, store); - break; - case Tools2dType.DELETE: - this.m_toolDelete.onMouseDown(xScr, yScr, store); - break; - default: - // not defined - } // switch - // force update - this.forceUpdate(); - } // onMouseDown - - /** - * Invoke clear all tools - */ - clear() { - this.m_toolDistance.clear(); - this.m_toolAngle.clear(); - this.m_toolArea.clear(); - this.m_toolRect.clear(); - this.m_toolText.clear(); - this.m_toolEdit.clear(); - this.m_toolDelete.clear(); - } - - /** - * Invoke forced rendering, after some tool visual changes - */ - forceUpdate(volIndex) { - // console.log('forceUpdate ...'); - this.prepareImageForRender(volIndex); - // this.forceRender(); - if (this.m_isSegmented) { // need to draw segmented image - if (this.segm2d.model !== null) { - // we have loaded model: applt it to image - this.segm2d.startApplyImage(); - } - } else { - this.forceRender(); - } // if not segmented image - } - - forceRender() { - if (this.m_isMounted) { - // console.log('forceRender ...'); - this.setState({ state: this.state }); - } - } - - /** - * Main component render func callback - */ - render() { - // const store = this.props; - // const volSet = store.volumeSet; - this.m_sliceRatio = this.props.sliderValue; - this.m_mode2d = this.props.mode2d; - - const styleObj = { - width: '100%', - height: '100%', - }; - - const jsxGrapNonSized = <canvas ref={ (mount) => {this.m_mount = mount} } style={styleObj} /> - const jsxGrapSized = <canvas ref={ (mount) => {this.m_mount = mount} } width={this.state.wRender} height={this.state.hRender} - onMouseDown={this.onMouseDown} onMouseUp={this.onMouseUp} onMouseMove={this.onMouseMove} onWheel={this.onMouseWheel} /> - const jsx = (this.state.wRender > 0) ? jsxGrapSized : jsxGrapNonSized; - return jsx; - } -} - -export default connect(store => store)(Graphics2d); diff --git a/src/demo/engine/LoadResult.js b/src/demo/engine/LoadResult.js deleted file mode 100644 index b4202d0a..00000000 --- a/src/demo/engine/LoadResult.js +++ /dev/null @@ -1,113 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* Loading result codes -* @module lib/scripts/loaders/loadresult -*/ - -// ****************************************************************** -// imports -// ****************************************************************** - -/** Class LoadResult to report loading status of binary files (Ktx, Dicom, Nifti)*/ -export default class LoadResult { - static getResultString(errorCode) { - switch (errorCode) { - case LoadResult.SUCCESS: - return 'Success'; - case LoadResult.UNKNOWN: - return 'Unknown'; - case LoadResult.BAD_DICOM: - return 'Bad Dicom'; - case LoadResult.BAD_HEADER: - return 'Bad header'; - case LoadResult.UNSUPPORTED_ENDIANNESS: - return 'Unsupported endianness'; - case LoadResult.UNSUPPORTED_COLOR_FORMAT: - return 'Unsupported color format'; - case LoadResult.WRONG_HEADER_DATA_SIZE: - return 'Wrong header data size'; - case LoadResult.WRONG_HEADER_DIMENSIONS: - return 'Wrong header dimensions'; - case LoadResult.WRONG_HEADER_DATA_TYPE: - return 'Wrong header data type'; - case LoadResult.WRONG_HEADER_BITS_PER_PIXEL: - return 'Wrong header bits per pixel'; - case LoadResult.WRONG_HEADER_MAGIC: - return 'Wrong header magic'; - case LoadResult.ERROR_PROCESS_HISTOGRAM: - return 'Wrong histogram'; - case LoadResult.WRONG_IMAGE_DIM_X: - return 'Wrong image dim x'; - case LoadResult.WRONG_IMAGE_DIM_Y: - return 'Wrong image dim y'; - case LoadResult.WRONG_IMAGE_DIM_Z: - return 'Wrong image dim z'; - case LoadResult.ERROR_PIXELS_TAG_NOT_FOUND: - return 'Pixels tag is not found'; - case LoadResult.ERROR_NO_MEMORY: - return 'No memory during loading'; - case LoadResult.ERROR_CANT_OPEN_URL: - return 'Cant open file via url'; - case LoadResult.ERROR_WRONG_NUM_SLICES: - return 'Wrong number of slices'; - case LoadResult.ERROR_HISTOGRAM_DETECT_RIDGES: - return 'Error detect histogram ridges'; - case LoadResult.ERROR_SCALING: - return 'Error scaling 16 bit data into 8 bit'; - case LoadResult.ERROR_INVALID_SLICE_INDEX: - return 'Invalid slice index. Possible reason: incomplete dicom folder'; - case LoadResult.ERROR_TOO_SMALL_DATA_SIZE: - return 'Too small input data size'; - case LoadResult.ERROR_TOO_LARGE_DATA_SIZE: - return 'Too large input data size'; - case LoadResult.ERROR_COMPRESSED_IMAGE_NOT_SUPPORTED: - return 'Compressed image formats read is not supported'; - default: - return 'Unknown error code'; - } // switch - } // getResultString -} // class LoadResult - -LoadResult.SUCCESS = 0; -LoadResult.UNKNOWN = 1; -LoadResult.BAD_DICOM = 2; -LoadResult.BAD_HEADER = 3; -LoadResult.UNSUPPORTED_ENDIANNESS = 4; -LoadResult.UNSUPPORTED_COLOR_FORMAT = 5; -LoadResult.WRONG_HEADER_DATA_SIZE = 6; -LoadResult.WRONG_HEADER_DIMENSIONS = 7; -LoadResult.WRONG_HEADER_DATA_TYPE = 8; -LoadResult.WRONG_HEADER_BITS_PER_PIXEL = 9; -LoadResult.WRONG_HEADER_MAGIC = 10; -LoadResult.ERROR_PROCESS_HISTOGRAM = 11; -LoadResult.WRONG_IMAGE_DIM_X = 12; -LoadResult.WRONG_IMAGE_DIM_Y = 13; -LoadResult.ERROR_PIXELS_TAG_NOT_FOUND = 14; -LoadResult.ERROR_NO_MEMORY = 15; -LoadResult.ERROR_CANT_OPEN_URL = 16; -LoadResult.ERROR_WRONG_NUM_SLICES = 17; -LoadResult.ERROR_HISTOGRAM_DETECT_RIDGES = 18; -LoadResult.ERROR_SCALING = 19; -LoadResult.ERROR_INVALID_SLICE_INDEX = 20; -LoadResult.ERROR_TOO_SMALL_DATA_SIZE = 21; -LoadResult.ERROR_TOO_LARGE_DATA_SIZE = 22; -LoadResult.ERROR_COMPRESSED_IMAGE_NOT_SUPPORTED = 23; - diff --git a/src/demo/engine/MaterialTex2d.js b/src/demo/engine/MaterialTex2d.js deleted file mode 100644 index 2289673a..00000000 --- a/src/demo/engine/MaterialTex2d.js +++ /dev/null @@ -1,274 +0,0 @@ -/** - * @fileOverview MaterialTex2d - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import * as THREE from 'three'; - -// ******************************************************** -// Const -// ******************************************************** - -const TEX2D_PLANE_X = 0; -const TEX2D_PLANE_Y = 1; -const TEX2D_PLANE_Z = 2; - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class MaterialTex2d some text later... - */ -export default class MaterialTex2d { - constructor() { - this.m_defines = { - useWebGL2: 1, - }; - this.m_uniforms = { - volTexture: { type: 't', value: null }, - palTexture: { type: 't', value: null }, - // plane values are: 0-x, 1-y, 2-z - plane: { type: 'i', value: 0 }, - tilesHor: { type: 'f', value: 1.0 }, - sliceIndex: { type: 'i', value: 0 }, - numSlices: { type: 'i', value: 0 }, - xDim: { type: 'i', value: 0 }, - yDim: { type: 'i', value: 0 }, - zDim: { type: 'i', value: 0 }, - isRoiVolume: { type: 'f', value: 1.0 }, - contrast: { type: 'f', value: 1.0 }, - brightness: { type: 'f', value: 0.0 }, - sigma: { type: 'f', value: 0.85 }, - //sigmaB: { type: 'f', value: 0.01 }, - xPixelSize: { type: 'f', value: 0.0 }, - yPixelSize: { type: 'f', value: 0.0 }, - flag: { type: 'b', value: false }, - showAll: { type: 'b', value: false }, - zoom: { type: 'f', value: 1 }, - posX: { type: 'f', value: 0 }, - posY: { type: 'f', value: 0 }, - }; - this.m_strShaderVertex = ` - varying vec3 vecPos; - varying vec2 vecUV; - void main() { - vecPos = position; - vecUV = uv; - gl_Position = vec4(position, 1.0); - } - `; - this.m_strShaderFragment = ` - precision highp float; - precision highp int; - - - varying vec3 vecPos; - varying vec2 vecUV; - - precision highp sampler3D; - uniform sampler3D volTexture; - uniform sampler2D palTexture; - uniform int plane; - uniform float tilesHor; - uniform int sliceIndex; - uniform int numSlices; - uniform int xDim; - uniform int yDim; - uniform int zDim; - uniform float isRoiVolume; - uniform float contrast; - uniform float brightness; - uniform float sigma; - uniform float zoom; - uniform float posX; - uniform float posY; - //uniform float sigmaB; - uniform float xPixelSize; - uniform float yPixelSize; - uniform bool flag; - uniform bool showAll; - - const int SLICE_AXIS_X = 0; - const int SLICE_AXIS_Y = 1; - const int SLICE_AXIS_Z = 2; - - vec2 getTexCoord(vec3 vecVol) { - float tileScale = 1.0 / (tilesHor); - vec2 vTex = vecVol.xy; - float sliceZ = float(zDim); - float zSliceIndex = floor(vecVol.z * sliceZ); - zSliceIndex = min(zSliceIndex, sliceZ - 1.0); - - // add tile x corner - float floorPart = floor((zSliceIndex) / (tilesHor)); - float modPart = zSliceIndex - floorPart * (tilesHor); - vTex.x += modPart;//mod((zSliceIndex), float(tilesHor)); - // add tile y corner - vTex.y += floorPart;//floor((zSliceIndex) / (tilesHor)); - return vTex * tileScale; - } - vec4 tex3D(vec3 vecVol) { - #if useWebGL2 == 0 - return texture2D(volTexture, getTexCoord(vecVol)); - #else - return texture(volTexture, vecVol).rrrr; - #endif - } - - void main() { - vec3 vVol = vec3(0.0, 0.0, 0.0); - if (plane == SLICE_AXIS_Z) { - vVol.x = vecUV.x * float(zoom) + float(posX) / 2.0; - vVol.y = vecUV.y * float(zoom) - float(posY) / 2.0; - vVol.z = float(sliceIndex) / float(numSlices); - } // if z slices - if (plane == SLICE_AXIS_Y) { - vVol.x = vecUV.x * float(zoom) + float(posX) / 2.0; - vVol.y = float(sliceIndex) / float(numSlices); - vVol.z = vecUV.y * float(zoom) - float(posY) / 2.0; - } // if y slices - if (plane == SLICE_AXIS_X) { - vVol.x = float(sliceIndex) / float(numSlices); - vVol.y = vecUV.x * float(zoom) + float(posX) / 2.0; - vVol.z = vecUV.y * float(zoom) - float(posY) / 2.0; - } // if x slices - - vec2 texCoord = getTexCoord(vVol); - // get texture pixel from source texture - -/* if (isRoiVolume > 0.5) { - gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); - return; - } -*/ - if (isRoiVolume > 0.5) { - //vec4 vColTex = texture2D(texture, texCoord); - vec4 vColTex = tex3D(vVol); - vec4 col = vec4(1.0, 0.0, 0.0, 1.0); - //float fPalIndex = vColTex.w; - //vec2 vPalCoord = vec2(fPalIndex, 0.0); - //vColTex = texture2D(palTexture, vPalCoord); - if (vColTex.a > 0.4) - col = vec4(vColTex.rgb, 1.0); - else - col = vec4(2.0 * vColTex.r, 2.0 * vColTex.g, 2.0 * vColTex.b, 1.0); - - gl_FragColor = col; - return; - } - float sigma2 = sigma*sigma; - //float sigmaB2 = sigmaB*sigmaB; - - float val = tex3D(vVol).a;//texture2D(texture, texCoord).a; - float BIFICOBR = 0.0; - float norm_factorB = 0.0; - //Bilateral Filtering - - for (float i = -2.0; i < 2.5; i += 1.0) - for (float j = -2.0; j < 2.5; j += 1.0) - for(float k = -2.0; k < 2.5; k += 1.0) - { - vec3 vAdd = vec3(0.0,0.0,0.0); - if (plane == SLICE_AXIS_Z) { - vAdd.x = xPixelSize * i; - vAdd.y = yPixelSize * j; - vAdd.z = k/float(numSlices); - } // if z slices - if (plane == SLICE_AXIS_Y) { - vAdd.x = xPixelSize * i; - vAdd.y = k/float(numSlices); - vAdd.z = yPixelSize * j; - } // if y slices - if (plane == SLICE_AXIS_X) { - vAdd.x = k/float(numSlices); - vAdd.y = xPixelSize * i; - vAdd.z = yPixelSize * j; - } // if x slices - - vec2 curTexCoord = getTexCoord(vVol + vAdd); - float curVal = tex3D(vVol + vAdd).a;//texture2D(texture,curTexCoord).a; - float gaussB = exp( -(i*i + j*j + k*k) / (2.0 * sigma2)); - BIFICOBR += curVal * gaussB; - norm_factorB += gaussB; - } - // intensity - BIFICOBR = BIFICOBR / norm_factorB; - BIFICOBR = contrast * (BIFICOBR - 0.5) + 0.5 + brightness; - gl_FragColor = vec4(BIFICOBR,BIFICOBR,BIFICOBR, 1.0); - } // end of main - `; - } // end construrot - - /** Create material for 2d texture display - * @param {object} tex - texture with 2d layout of 3d source - * @param {int} xDim - 3d texture dimension on x - * @param {int} yDim - 3d texture dimension on y - * @param {int} zDim - 3d texture dimension on z - * @param {int} planeMode - see TEX2D_PLANE_X, TEX2D_PLANE_Y, TEX2D_PLANE_Z - * @param {int} sliceIndex - current sliceIndex - * @param {bool} isRoiVolume - is roi volume or not - */ - create(tex, xDim, yDim, zDim, planeMode, sliceIndex, isRoiVolume) { - this.m_uniforms.volTexture.value = tex; - this.m_uniforms.plane.value = planeMode; - this.m_uniforms.sliceIndex.value = sliceIndex; - this.m_uniforms.xDim.value = xDim; - this.m_uniforms.yDim.value = yDim; - this.m_uniforms.zDim.value = zDim; - this.m_uniforms.isRoiVolume.value = (isRoiVolume) ? 1.0 : 0.0; - if (isRoiVolume) { - // const roiPalette = new RoiPalette(); - const roiPalette = null; // TODO - - const palette = roiPalette.getPalette256(); - const BYTES_PER_COLOR = 4; - const MAGIC_COLOR = 250; - const OFFS_0 = 0; - const OFFS_1 = 1; - const OFFS_2 = 2; - - const palB = palette[MAGIC_COLOR * BYTES_PER_COLOR + OFFS_0]; - const palG = palette[MAGIC_COLOR * BYTES_PER_COLOR + OFFS_1]; - const palR = palette[MAGIC_COLOR * BYTES_PER_COLOR + OFFS_2]; - console.log(`RoiPalette: pal[250] = ${palR}, ${palG}, ${palB}`); - - const TEX_W = 256; - const TEX_H = 1; - if (this.m_palTexture) { - this.m_palTexture.dispose(); - } - this.m_palTexture = new THREE.DataTexture(palette, TEX_W, TEX_H, THREE.RGBAFormat); - this.m_palTexture.needsUpdate = true; - this.m_palTexture.wrapS = THREE.ClampToEdgeWrapping; - this.m_palTexture.wrapT = THREE.ClampToEdgeWrapping; - this.m_palTexture.magFilter = THREE.NearestFilter; - this.m_palTexture.minFilter = THREE.NearestFilter; - this.m_uniforms.palTexture.value = this.m_palTexture; - } else { - this.m_uniforms.palTexture.value = null; - } - - if (planeMode === TEX2D_PLANE_X) { - this.m_uniforms.numSlices.value = xDim - 1; - } else if (planeMode === TEX2D_PLANE_Y) { - this.m_uniforms.numSlices.value = yDim - 1; - } else if (planeMode === TEX2D_PLANE_Z) { - this.m_uniforms.numSlices.value = zDim - 1; - } - - this.m_material = new THREE.ShaderMaterial({ - uniforms: this.m_uniforms, - defines: this.m_defines, - vertexShader: this.m_strShaderVertex, - fragmentShader: this.m_strShaderFragment - }); - this.m_material.needsUpdate = true; - } // enmd create -} // end class diff --git a/src/demo/engine/Texture3D.js b/src/demo/engine/Texture3D.js deleted file mode 100644 index a967b1b3..00000000 --- a/src/demo/engine/Texture3D.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @fileOverview Texture3D - * @author Epam - * @version 1.0.0 - */ - -// ******************************************************** -// Imports -// ******************************************************** - -import * as THREE from 'three'; - - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class Texture3D some text later... - */ -export default class Texture3D { - constructor() { - this.m_texture = -1; - } - - createFromRawVolume(vol) { - this.m_texture = new THREE.DataTexture3D(vol.m_dataArray, vol.m_xDim, vol.m_yDim, vol.m_zDim); - } -} diff --git a/src/demo/engine/actvolume/actvol.js b/src/demo/engine/actvolume/actvol.js deleted file mode 100644 index 7b54dd10..00000000 --- a/src/demo/engine/actvolume/actvol.js +++ /dev/null @@ -1,2122 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* Active volume algorithm implementation -* @module lib/scripts/actvolume/actvol -*/ - -// absolute imports -import * as THREE from 'three'; - -// relative imports -import TetrahedronGenerator from './tetra'; -import GeoRender from './georender'; -import LaplasianSmoother from './lapsmooth'; -// import VolumeClipper from './volclip'; -import VolumeGenerator from './volgen'; -// import KtxLoader from '../loaders/ktxloader'; -import VolumeTools from '../loaders/voltools'; - -// **************************************************************************** -// Const -// **************************************************************************** - -// Minimum volume size (for volume scale down: increase performance) -const X_MAX_DIM = 256; -const Y_MAX_DIM = 256; -const Z_MAX_DIM = 256; - -const AV_NUM_COLORS = 256; - -const AV_STATE_NA = -1; -const AV_STATE_NOT_STARTED = 0; -const AV_STATE_PREPARE_GAUSS = 1; -const AV_STATE_PREPARE_UNIFORMITY = 2; -const AV_STATE_UPDATE_GEO = 3; -const AV_STATE_FINISHED = 4; - -const AV_METHOD_NORMALS = 1; -const AV_METHOD_UNIFORMITY = 2; -const AV_METHOD_COLOR_KOEFS = 4; -const AV_METHOD_ALL = 0xffff; - -// **************************************************************************** -// Class -// **************************************************************************** - -/** -* Class ActiveVolume perform skull detection and removal -* @class ActiveVolume -*/ -export default class ActiveVolume { - /** - * Init all internal data - * @constructs ActiveVolume - */ - constructor() { - this.m_state = AV_STATE_NA; - this.m_pixelsSrc = null; - this.m_xDim = 0; - this.m_yDim = 0; - this.m_zDim = 0; - this.m_xWorldBox = 0; - this.m_yWorldBox = 0; - this.m_zWorldBox = 0; - this.m_imageGauss = null; - this.m_imageUniformity = null; - this.m_verticesNew = null; - this.m_lapSmoother = null; - this.m_imageSrc = null; - this.m_imageGrad = null; - this.m_gaussStage = -1; - this.m_uniformityStage = -1; - this.m_geoStage = -1; - this.m_histogram = new Int32Array(AV_NUM_COLORS); - this.m_colorProbability = new Float32Array(AV_NUM_COLORS); - this.m_colorKoefs = new Float32Array(AV_NUM_COLORS); - for (let i = 0; i < AV_NUM_COLORS; i++) { - this.m_histogram[i] = 0; - this.m_colorProbability[i] = 0.0; - this.m_colorKoefs[i] = 0.0; - } - this.m_sphereCenter = null; - this.m_sphereRadius = null; - this.m_indexMinColor = -1; - // debug counter to save geo - this.m_updateCounter = 0; - // for display 3d geo - this.m_geoRender = null; - this.m_wasAllocated = false; - this.m_xScale = 1; - this.m_yScale = 1; - this.m_zScale = 1; - } - - /** - * - * Set initial sphere center - */ - setSphereCenter(xCenter, yCenter, zCenter) { - this.m_sphereCenter = new THREE.Vector3(); - this.m_sphereCenter.set(xCenter, yCenter, zCenter); - // console.log(`ActiveVolume. set sphere center = ${xCenter}, ${yCenter}, ${zCenter}`); - } - - /** - * - * Set initial sphere radius - */ - setSphereRadius(xRadius, yRadius, zRadius) { - this.m_sphereRadius = new THREE.Vector3(); - this.m_sphereRadius.set(xRadius, yRadius, zRadius); - // console.log(`ActiveVolume. set sphere radius = ${xRadius}, ${yRadius}, ${zRadius}`); - } - - /** - * - * Get sphere center - */ - getSphereCenter() { - return this.m_sphereCenter; - } - - /** - * - * Get sphere radius - */ - getSphereRadius() { - return this.m_sphereRadius; - } - - /** - * - * Set physical volume dimensions - * @param {number} xWorldBox world box size on x - * @param {number} yWorldBox world box size on y - * @param {number} zWorldBox world box size on z - */ - setupPhysDims(xWorldBox, yWorldBox, zWorldBox) { - this.m_xWorldBox = xWorldBox; - this.m_yWorldBox = yWorldBox; - this.m_zWorldBox = zWorldBox; - // console.log(`setupPhysDims: ${xWorldBox} * ${yWorldBox} * ${zWorldBox}`); - } - - copyScaleUp(pixelsDst, xDimDst, yDimDst, zDimDst) { - console.log('perform scale up generated mask ...'); - if (this.m_xScale === 1) { - console.log('ActiveVolume. copyScaleUp. should be scaled'); - return; - } - const xScale = this.m_xDim / xDimDst; - const yScale = this.m_yDim / yDimDst; - const zScale = this.m_zDim / zDimDst; - let offDst = 0; - for (let z = 0; z < zDimDst; z++) { - const zSrc = Math.floor(z * zScale); - const zSrcOff = zSrc * this.m_xDim * this.m_yDim; - for (let y = 0; y < yDimDst; y++) { - const ySrc = Math.floor(y * yScale); - const ySrcOff = ySrc * this.m_xDim; - for (let x = 0; x < xDimDst; x++) { - const xSrc = Math.floor(x * xScale); - const offSrc = xSrc + ySrcOff + zSrcOff; - const val = this.m_pixelsSrc[offSrc]; - pixelsDst[offDst] = val; - offDst++; - } - } - } - } - - save() { - const numPixels = this.m_xDim * this.m_yDim * this.m_zDim; - let volTexDst = new Uint8Array(numPixels); - // create clipped volume - - let i; - // const resClip = VolumeClipper.clipVolumeByNonConvexGeo(this.m_pixelsSrc, this.m_xDim, this.m_yDim, this.m_zDim, - // volTexDst, this.m_geoRender, ActiveVolume.REMOVE_SKULL); - for (i = 0; i < numPixels; i++) { - volTexDst[i] = 0; - } - const WITH_FILL = true; - const resBoolFill = VolumeGenerator.generateFromFaces(this.m_xDim, this.m_yDim, this.m_zDim, - volTexDst, this.m_geoRender, WITH_FILL); - - if (resBoolFill) { - console.log('perform clip of source volume by generated mask ...'); - const DECREASE_NON_VIS = 6; - for (i = 0; i < numPixels; i++) { - if (volTexDst[i] === 0) { - this.m_pixelsSrc[i] = Math.floor(this.m_pixelsSrc[i] / DECREASE_NON_VIS); - // this.m_pixelsSrc[i] = volTexDst[i]; - } - } - } else { - console.log(`generateFromFaces returned ${resBoolFill} !`); - } - volTexDst = null; - } - - /** - * - * Create internal structures: render sphere - */ - createGeoSphere() { - if (this.m_xDim === 0) { - const ERR_NO_VOLUME = -1; - return ERR_NO_VOLUME; - } - if (this.m_sphereRadius === null) { - const ERR_NO_SPHERE = -2; - return ERR_NO_SPHERE; - } - - const genTetra = new TetrahedronGenerator(); - const vRadius = new THREE.Vector3(0.5, 0.5, 0.5); - const NUM_SUBDIVIDES = 3; - const okCreateTetra = genTetra.create(vRadius, NUM_SUBDIVIDES); - if (okCreateTetra < 1) { - return okCreateTetra; - } - const geoRender = new GeoRender(); - const errGeo = geoRender.createFromTetrahedronGenerator(genTetra); - const GEO_OK = 1; - if (errGeo !== GEO_OK) { - const ERR_CREATE_GEO = -3; - return ERR_CREATE_GEO; - } - - // scale geo render vertices to fit initial sphere - const numVertices = geoRender.getNumVertices(); - const vertices = geoRender.getVertices(); - const COORDS_IN_VERTEX = 4; - const NUM_0 = 0; - const NUM_1 = 1; - const NUM_2 = 2; - const HALF = 0.5; - const xScale = (this.m_sphereRadius.x / this.m_xScale) / HALF; - const yScale = (this.m_sphereRadius.y / this.m_yScale) / HALF; - const zScale = (this.m_sphereRadius.z / this.m_zScale) / HALF; - - for (let i = 0, i4 = 0; i < numVertices; i++, i4 += COORDS_IN_VERTEX) { - vertices[i4 + NUM_0] = (this.m_sphereCenter.x / this.m_xScale) + vertices[i4 + NUM_0] * xScale; - vertices[i4 + NUM_1] = (this.m_sphereCenter.y / this.m_yScale) + vertices[i4 + NUM_1] * yScale; - vertices[i4 + NUM_2] = (this.m_sphereCenter.z / this.m_zScale) + vertices[i4 + NUM_2] * zScale; - } // for (i) all vertices - // save render geo to obj file - const NEED_SAVE_INITIAL_GEO = false; - if (NEED_SAVE_INITIAL_GEO) { - const TEST_SAVE_INIT_GEO_FILE_NAME = 'geo_init.obj'; - geoRender.saveGeoToObjFile(TEST_SAVE_INIT_GEO_FILE_NAME); - } - - // Test save bounding sphere - const NEED_SAVE_BOUND_SPHERE = false; - if (NEED_SAVE_BOUND_SPHERE) { - const vMin = new THREE.Vector3(); - const vMax = new THREE.Vector3(); - ActiveVolume.getBoundingBox(this.m_xDim, this.m_yDim, this.m_zDim, this.m_pixelsSrc, vMin, vMax); - const geoSphere = new GeoRender(); - const vCenter = new THREE.Vector3(); - const vRad = new THREE.Vector3(); - vCenter.x = (vMin.x + vMax.x) * 0.5; - vCenter.y = (vMin.y + vMax.y) * 0.5; - vCenter.z = (vMin.z + vMax.z) * 0.5; - vRad.x = (vMax.x - vMin.x) * 0.5; - vRad.y = (vMax.y - vMin.y) * 0.5; - vRad.z = (vMax.z - vMin.z) * 0.5; - - const NUM_SEGM_HOR = 16; - const NUM_SEGM_VER = 8; - geoSphere.createFromEllipse(vCenter, vRad, NUM_SEGM_HOR, NUM_SEGM_VER); - const TEST_SAVE_BSPHERE_GEO_FILE_NAME = 'geo_bsph.obj'; - geoSphere.saveGeoToObjFile(TEST_SAVE_BSPHERE_GEO_FILE_NAME); - } - this.m_geoRender = geoRender; - return 1; - } - - /** - * - * Create THREE js geometry (can be rendered in 3d scene) - * from current sphere - */ - createThreeJsGeoFromSphere() { - const geoSrc = this.m_geoRender; - if (geoSrc === null) { - console.log('createThreeJsGeoFromSphere. logic error: call createGeoSphere() first'); - return null; - } - const xScale = 1.0 / this.m_xDim; - const yScale = 1.0 / this.m_yDim; - const zScale = 1.0 / this.m_zDim; - const verticesSrc = geoSrc.getVertices(); - const geoDst = new THREE.Geometry(); - const COORDS_IN_VERTEX = 4; - const OFF_X = 0; - const OFF_Y = 1; - const OFF_Z = 2; - const HALF = 0.5; - // push vertices - for (let i = 0, i4 = 0; i < geoSrc.m_numVertices; i++, i4 += COORDS_IN_VERTEX) { - const x = verticesSrc[i4 + OFF_X] * xScale - HALF; - const y = verticesSrc[i4 + OFF_Y] * yScale - HALF; - const z = verticesSrc[i4 + OFF_Z] * zScale - HALF; - const vNew = new THREE.Vector3(x, y, z); - geoDst.vertices.push(vNew); - } - // push faces - const INDICES_IN_TRI = 3; - const OFF_0 = 0; - const OFF_1 = 1; - const OFF_2 = 2; - for (let i = 0, i3 = 0; i < geoSrc.m_numTriangles; i++, i3 += INDICES_IN_TRI) { - const i0 = geoSrc.m_indices[i3 + OFF_0]; - const i1 = geoSrc.m_indices[i3 + OFF_1]; - const i2 = geoSrc.m_indices[i3 + OFF_2]; - const faceNew = new THREE.Face3(i0, i1, i2); - geoDst.faces.push(faceNew); - } - // calc bound box - geoDst.computeBoundingSphere(); - return geoDst; - } - - /** - * Clip volume by geometry sphere - * - */ - clipVolumeBySphere(xDim, yDim, zDim, - volTexSrc, volTexDst, - geoSphere, box) { - // check args - if (volTexDst === null) { - console.log('`clipVolumeBySphere. volTexDst == null'); - return; - } - let sideMax = (box.x > box.y) ? box.x : box.y; - sideMax = (box.z > sideMax) ? box.z : sideMax; - const vBoxVirtX = box.x / sideMax; - const vBoxVirtY = box.y / sideMax; - const vBoxVirtZ = box.z / sideMax; - - // create usual geometry from buffered geometry - const geoRender = new GeoRender(); - geoRender.fromBufferGeometry(geoSphere); - - // scale vertices from [-0.5 .. +0.5] to [0 .. xDim], [0 .. yDim], [0 .. zDim] - const numVerts = geoRender.getNumVertices(); - const vertices = geoRender.getVertices(); // float array - // console.log(`scale vertices. numVerts = ${numVerts}`); - - const HALF = 0.5; - const NUM_4 = 4; - const OFF_0 = 0; - const OFF_1 = 1; - const OFF_2 = 2; - let ind = 0; - for (let i = 0; i < numVerts; i++, ind += NUM_4) { - const x = -vertices[ind + OFF_0] / vBoxVirtX; - const y = vertices[ind + OFF_1] / vBoxVirtY; - const z = vertices[ind + OFF_2] / vBoxVirtZ; - const xVol = Math.floor((x + HALF) * xDim); - const yVol = Math.floor((y + HALF) * yDim); - const zVol = Math.floor((z + HALF) * zDim); - vertices[ind + OFF_0] = xVol; - vertices[ind + OFF_1] = yVol; - vertices[ind + OFF_2] = zVol; - } // for (i) all vertices - const xyzDim = xDim * yDim * zDim; - // create mask array - const volMask = new Uint8Array(xyzDim); - for (let i = 0; i < xyzDim; i++) { - volMask[i] = 0; - } - - // Create mask from geometry - const WITH_FILL = 1; - const resFill = VolumeGenerator.generateFromFaces(xDim, yDim, zDim, - volMask, - geoRender, - WITH_FILL); - if (resFill < 0) { - console.log(`ActVol. generateFromFaces returned ${resFill} !`); - } - // apply volMask to volSrc - for (let i = 0; i < xyzDim; i++) { - volTexDst[i] = (volMask[i] !== 0) ? volTexSrc[i] : 0; - } - } // clipVolumeBySphere - - /** - * Automatic sphere evolve - * - */ - sphereEvolve(xDim, yDim, zDim, - volTexSrc, volTexDst, - geoSphere, valBarrier01, - modeEvolve, sphereCenter, box) { - let sideMax = (box.x > box.y) ? box.x : box.y; - sideMax = (box.z > sideMax) ? box.z : sideMax; - const vBoxVirtX = box.x / sideMax; - const vBoxVirtY = box.y / sideMax; - const vBoxVirtZ = box.z / sideMax; - const TEX_MIN_SIDE = 8; - if ((xDim < TEX_MIN_SIDE) || (yDim < TEX_MIN_SIDE) || (zDim < TEX_MIN_SIDE)) { - console.log(`sphereEvolve: too small vol dim = ${xDim} * ${yDim} * ${zDim}`); - return false; - } - const TEX_MAX_SIDE = 4095; - if ((xDim > TEX_MAX_SIDE) || (yDim > TEX_MAX_SIDE) || (zDim > TEX_MAX_SIDE)) { - console.log(`sphereEvolve: too large vol dim = ${xDim} * ${yDim} * ${zDim}`); - return false; - } - if (typeof volTexSrc !== 'object') { - console.log(`sphereEvolve: bad source vol type = ${typeof volTexSrc}`); - return false; - } - const xyzDim = xDim * yDim * zDim; - if (volTexSrc.length !== xyzDim) { - console.log(`sphereEvolve: bad src vol size = ${volTexSrc.length}, but expect = ${xyzDim}`); - return false; - } - if (volTexDst !== null) { - if (typeof volTexDst !== 'object') { - console.log(`sphereEvolve: bad dest vol type = ${typeof volTexDst}`); - return false; - } - if (volTexDst.length !== xyzDim) { - console.log(`sphereEvolve: bad dst vol size = ${volTexDst.length}, but expect = ${xyzDim}`); - return false; - } - } - if (typeof geoSphere !== 'object') { - console.log(`sphereEvolve: bad sphere type = ${typeof geoSphere}`); - return false; - } - if (!('getAttribute' in geoSphere)) { - console.log('geoSphere has no getAttribute method'); - return false; - } - const attrVertices = geoSphere.getAttribute('position'); - // const attrWireVertices = geoSphere.getAttribute('position'); - - if (typeof attrVertices === 'undefined') { - console.log('geoSphere has no position attr'); - return false; - } - const numVertices = attrVertices.count; - const MIN_NUM_VERTS = 16; - const MAX_NUM_VERTS = 4095; - if ((numVertices < MIN_NUM_VERTS) | (numVertices > MAX_NUM_VERTS)) { - console.log(`sphereEvolve: bad num vertices in pshere geo = ${numVertices}`); - return false; - } - console.log(`sphereEvolve: num vertices in sphere geo = ${numVertices}`); - const numCompsVert = attrVertices.itemSize; - const NUM_COMPS_IN_VERTEX = 3; - if (numCompsVert !== NUM_COMPS_IN_VERTEX) { - console.log(`sphereEvolve: bad vertices num components = ${numCompsVert} `); - } - - const attrNormals = geoSphere.getAttribute('normal'); - if (typeof attrNormals === 'undefined') { - console.log('geoSphere has no normal attr'); - return false; - } - const numNormals = attrNormals.count; - if (numNormals !== numVertices) { - console.log(`sphereEvolve: num vertices ${numVertices} != num normals ${numNormals}`); - return false; - } - const numCompsNorm = attrNormals.itemSize; - const NUM_COMPS_IN_NORMAT = 3; - if (numCompsNorm !== NUM_COMPS_IN_NORMAT) { - console.log(`sphereEvolve: bad normals num components = ${numCompsNorm} `); - } - // center of vol - const HALF = 0.5; - const xc = Math.floor(xDim * HALF); - const yc = Math.floor(yDim * HALF); - const zc = Math.floor(zDim * HALF); - let MAX_DIM = (xDim > yDim) ? xDim : yDim; - MAX_DIM = (zDim > MAX_DIM) ? zDim : MAX_DIM; - const xyDim = xDim * yDim; - // start position for scanning - const START_SCAN_RATIO = 0.0;//0.2; - const NUM_2 = 3.0; - const DIAG_ONE_TRI = Math.sqrt(NUM_2); - const J_START = Math.floor(0.5 * MAX_DIM * START_SCAN_RATIO); - const J_END = Math.floor(0.5 * MAX_DIM * DIAG_ONE_TRI); - if ((valBarrier01 < 0.0) || (valBarrier01 > 1.0)) { - console.log(`sphereEvolve. Invalid barrier value: ${valBarrier01}. Should be in [0..1]`); - } - // when stop scanning: border value - const NUM_COLORS = 255; - const VAL_MIN_BORDER = valBarrier01 * NUM_COLORS; - console.log(`Autodetect brain shape with barrier range ${VAL_MIN_BORDER}`); - // for all vertices: move along normal direction - for (let i = 0; i < numVertices; i++) { - //for (let i = 10; i < 11; i++) { - const vSrc = new THREE.Vector3(attrVertices.getX(i), - attrVertices.getY(i), - attrVertices.getZ(i)); - const vn = new THREE.Vector3(attrNormals.getX(i) - sphereCenter.x, - attrNormals.getY(i) - sphereCenter.y, - attrNormals.getZ(i) - sphereCenter.z); - vn.normalize(); - // scan from out of sphere - if (modeEvolve === ActiveVolume.SPHERE_EVOLVE_FROM_OUTSIDE) { - let j; - let x, y, z; - - let xLocMin = -1; - let yLocMin = -1; - let zLocMin = -1; - - let valPrev = -1; - // search for non-zero skull - let hasFoundMinBorder = false; - for (j = J_END; (j >= J_START) && !hasFoundMinBorder; j--) { - x = xc + Math.floor(vn.x * j); - y = yc + Math.floor(vn.y * j); - z = zc + Math.floor(vn.z * j); - // skip if outside of volume - if ((x < 0) || (y < 0) || (z < 0) || (x >= xDim) || (y >= yDim) || (z >= zDim)) { - continue; - } - const off = x + (y * xDim) + (z * xyDim); - const val = volTexSrc[off]; - if ((valPrev > 0) && (val < valPrev) && (val < VAL_MIN_BORDER)) { - hasFoundMinBorder = true; - } - if ((xLocMin < 0) && (val < valPrev)) { - xLocMin = x; yLocMin = y; - zLocMin = z; - } - - valPrev = val; - } - if (!hasFoundMinBorder) { - // console.log(`sphereEvolve. Min border (${VAL_MIN_BORDER}) not found for ${i} / ${numVertices} point`); - // continue; - x = xLocMin; y = yLocMin; - z = zLocMin; - } - // place result point in [-0.5 .. +0.5] - const xv = (x / xDim) - HALF; - const yv = (y / yDim) - HALF; - const zv = (z / zDim) - HALF; - attrVertices.setXYZ(i, xv, yv, zv); - // attrWireVertices.setXYZ(i, xv, yv, zv); - } - if (modeEvolve === ActiveVolume.SPHERE_EVOLVE_FROM_INSIDE) { - - - // scan vol from center - let j; - let x, y, z, off; - // let hasFoundLowPixel = false; - // let hasFoundVolExit = false; - const ONE = 0; - const TWO = 2; - const SKAL = 0.5; - for (j = ONE; j < TWO * J_END; j++) { - x = vSrc.x + SKAL * vn.x * j / sideMax; - y = vSrc.y + SKAL * vn.y * j / sideMax; - z = vSrc.z + SKAL * vn.z * j / sideMax; - if ((x < -SKAL) || (y < -SKAL) || (z < -SKAL) || (x >= SKAL) || (y >= SKAL) || (z >= SKAL)) { - console.log(`MysphereEvolve. Stop at exit [${i}] = ${x}, ${y}, ${z}, `); - // hasFoundVolExit = true; - break; - } - const xV_ = (-x / vBoxVirtX + HALF) * xDim; - const yV_ = (y / vBoxVirtY + HALF) * yDim; - const zV_ = (z / vBoxVirtZ + HALF) * zDim; - const xV = Math.floor(xV_); - const yV = Math.floor(yV_); - const zV = Math.floor(zV_); - const dx = xV_ - xV; - const dy = yV_ - yV; - const dz = zV_ - zV; - off = xV + (yV * xDim) + (zV * xyDim); - let vx1 = (1.0 - dx) * volTexSrc[off] + dx * volTexSrc[off + 1]; - off = xV + ((yV + 1) * xDim) + (zV * xyDim); - let vx2 = (1.0 - dx) * volTexSrc[off] + dx * volTexSrc[off + 1]; - const v1 = (1.0 - dy) * vx1 + dy * vx2; - off = xV + (yV * xDim) + ((zV + 1) * xyDim); - vx1 = (1.0 - dx) * volTexSrc[off] + dx * volTexSrc[off + 1]; - off = xV + ((yV + 1) * xDim) + ((zV + 1) * xyDim); - vx2 = (1.0 - dx) * volTexSrc[off] + dx * volTexSrc[off + 1]; - const v2 = (1.0 - dy) * vx1 + dy * vx2; - const val = (1.0 - dz) * v1 + dz * v2; - if (val < VAL_MIN_BORDER) { - // hasFoundLowPixel = true; - break; - } - } // for (j) all normals extension - attrVertices.setXYZ(i, x, y, z); - } // if evolve from inside - - } // for (i) all vertices - geoSphere.getAttribute('position').needsUpdate = true; - - if (volTexDst !== null) { - // create usual geometry from buffered geometry - const geoRender = new GeoRender(); - geoRender.fromBufferGeometry(geoSphere); - - // scale vertices from [-0.5 .. +0.5] to [0 .. xDim], [0 .. yDim], [0 .. zDim] - const numVerts = geoRender.getNumVertices(); - const vertices = geoRender.getVertices(); // float array - // console.log(`scale vertices. numVerts = ${numVerts}`); - - const NUM_4 = 4; - const OFF_0 = 0; - const OFF_1 = 1; - const OFF_2 = 2; - let ind = 0; - for (let i = 0; i < numVerts; i++, ind += NUM_4) { - const x = vertices[ind + OFF_0]; - const y = vertices[ind + OFF_1]; - const z = vertices[ind + OFF_2]; - const xVol = Math.floor((x + HALF) * xDim); - const yVol = Math.floor((y + HALF) * yDim); - const zVol = Math.floor((z + HALF) * zDim); - vertices[ind + OFF_0] = xVol; - vertices[ind + OFF_1] = yVol; - vertices[ind + OFF_2] = zVol; - } // for (i) all vertices - - // create mask array - const volMask = new Uint8Array(xyzDim); - for (let i = 0; i < xyzDim; i++) { - volMask[i] = 0; - } - - // Create mask from geometry - const WITH_FILL = 1; - const resFill = VolumeGenerator.generateFromFaces(xDim, yDim, zDim, - volMask, - geoRender, - WITH_FILL); - if (resFill < 0) { - console.log(`ActVol. generateFromFaces returned ${resFill} !`); - } - // apply volMask to volSrc - for (let i = 0; i < xyzDim; i++) { - volTexDst[i] = (volMask[i] !== 0) ? volTexSrc[i] : 0; - } - } - return true; - } - - /** - * - * @param {*} xDim - * @param {*} yDim - * @param {*} zDim - * @param {*} volTexSrc - * @param {*} volTexDst - * @param {*} createType - * @param {*} needLog - */ - skullRemoveStart(xDim, yDim, zDim, volTexSrc, volTexDst, createType, needLog) { - const TOO_MUCH_SIZE = 8192; - if ((createType !== ActiveVolume.REMOVE_SKULL) && (createType !== ActiveVolume.CREATE_MASK)) { - console.log('skullRemoveStart: wrong argument createType'); - } - if ((xDim >= TOO_MUCH_SIZE) || (yDim >= TOO_MUCH_SIZE) || (zDim >= TOO_MUCH_SIZE)) { - console.log(`Too bad volume dimension: ${xDim} * ${yDim} * ${zDim}`); - return -1; - } - if ((xDim <= 1) || (yDim <= 1) || (zDim <= 1)) { - console.log(`Too bad volume dimension: ${xDim} * ${yDim} * ${zDim}`); - return -1; - } - const volSizeSrc = volTexSrc.length; - const numPixSrc = xDim * yDim * zDim; - if (volSizeSrc !== numPixSrc) { - console.log(`skullRemoveStart: bad vol size = ${volSizeSrc}, expected ${numPixSrc}`); - return -1; - } - const okCreate = this.create(xDim, yDim, zDim, volTexSrc); - if (okCreate !== 1) { - return okCreate; - } - const genTetra = new TetrahedronGenerator(); - const vRadius = new THREE.Vector3(0.5, 0.5, 0.5); - const NUM_SUBDIVIDES = 3; - const okCreateTetra = genTetra.create(vRadius, NUM_SUBDIVIDES); - if (okCreateTetra < 1) { - return okCreateTetra; - } - const geoRender = new GeoRender(); - const errGeo = geoRender.createFromTetrahedronGenerator(genTetra); - const GEO_OK = 1; - if (errGeo !== GEO_OK) { - const ERR_CREATE_GEO = -3; - return ERR_CREATE_GEO; - } - - // get half from volume dimension - const xDim2 = Math.floor((this.m_xDim - 1) * 0.5); - const yDim2 = Math.floor((this.m_yDim - 1) * 0.5); - const zDim2 = Math.floor((this.m_zDim - 1) * 0.5); - - // scale geo render vertices - const numVertices = geoRender.getNumVertices(); - const vertices = geoRender.getVertices(); - const COORDS_IN_VERTEX = 4; - const NUM_0 = 0; - const NUM_1 = 1; - const NUM_2 = 2; - for (let i = 0, i4 = 0; i < numVertices; i++, i4 += COORDS_IN_VERTEX) { - vertices[i4 + NUM_0] = xDim2 + xDim2 * vertices[i4 + NUM_0]; - vertices[i4 + NUM_1] = yDim2 + yDim2 * vertices[i4 + NUM_1]; - vertices[i4 + NUM_2] = zDim2 + zDim2 * vertices[i4 + NUM_2]; - } // for (i) all vertices - - // save render geo to obj file - const NEED_SAVE_INITIAL_GEO = false; - if (NEED_SAVE_INITIAL_GEO) { - const TEST_SAVE_INIT_GEO_FILE_NAME = 'geo_init.obj'; - geoRender.saveGeoToObjFile(TEST_SAVE_INIT_GEO_FILE_NAME); - } - - // Test save bounding sphere - const NEED_SAVE_BOUND_SPHERE = false; - if (NEED_SAVE_BOUND_SPHERE) { - const vMin = new THREE.Vector3(); - const vMax = new THREE.Vector3(); - ActiveVolume.getBoundingBox(this.m_xDim, this.m_yDim, this.m_zDim, this.m_pixelsSrc, vMin, vMax); - const geoSphere = new GeoRender(); - const vCenter = new THREE.Vector3(); - const vRad = new THREE.Vector3(); - vCenter.x = (vMin.x + vMax.x) * 0.5; - vCenter.y = (vMin.y + vMax.y) * 0.5; - vCenter.z = (vMin.z + vMax.z) * 0.5; - vRad.x = (vMax.x - vMin.x) * 0.5; - vRad.y = (vMax.y - vMin.y) * 0.5; - vRad.z = (vMax.z - vMin.z) * 0.5; - - const NUM_SEGM_HOR = 16; - const NUM_SEGM_VER = 8; - geoSphere.createFromEllipse(vCenter, vRad, NUM_SEGM_HOR, NUM_SEGM_VER); - const TEST_SAVE_BSPHERE_GEO_FILE_NAME = 'geo_bsph.obj'; - geoSphere.saveGeoToObjFile(TEST_SAVE_BSPHERE_GEO_FILE_NAME); - } - let numPredSteps = this.getPredictedStepsForActiveVolumeUpdate(); - const SOME_ADD_STEPS = 12; - numPredSteps += SOME_ADD_STEPS; - - const strTypeArr = ['REMOVE_SKULL', 'CREATE_MASK']; - const strType = strTypeArr[createType]; - console.log(`skullRemoveStart. Will be ${numPredSteps} updates approximately. In ${strType} mode `); - - this.m_updateCounter = 0; - this.m_isFinished = false; - this.m_numPredSteps = numPredSteps; - this.m_createType = createType; - this.m_volTexSrc = volTexSrc; - this.m_volTexDst = volTexDst; - this.m_needLog = needLog; - - return geoRender; - } - - skullRemoveUpdate(geoRender) { - // for (this.m_updateCounter = 0; (this.m_updateCounter < numPredSteps) && !isFinished; this.m_updateCounter++) { - // console.log(`skullRemove(${this.m_updateCounter})`); - // this.updateGeo(geoRender, AV_METHOD_ALL); - // isFinished = (this.m_state === AV_STATE_FINISHED); - // } - const isLoopComplete = (this.m_updateCounter >= this.m_numPredSteps) || this.m_isFinished; - if (isLoopComplete) { - return true; - } - this.updateGeo(geoRender, AV_METHOD_ALL); - this.m_isFinished = (this.m_state === AV_STATE_FINISHED); - this.m_updateCounter++; - return false; - } - - skullRemoveStop(geoRender) { - // save geo render after all modification iterations - const NEED_SAVE_FINAL_GEO_RENDER = false; - if (NEED_SAVE_FINAL_GEO_RENDER) { - this.finalizeUpdatesGeo(geoRender, NEED_SAVE_FINAL_GEO_RENDER); - } - const NUM_2 = 2; - - // Save smoothed image into file - const NEED_SAVE_NONCLIPPED_SLICE_BMP = false; - if (NEED_SAVE_NONCLIPPED_SLICE_BMP) { - const TEST_SAVE_VOL_FILE_NAME = 'test_nonclipped_slice.bmp'; - const zSlice = Math.floor(this.m_zDim / NUM_2); - ActiveVolume.saveVolumeSliceToFile(this.m_pixelsSrc, - this.m_xDim, this.m_yDim, this.m_zDim, zSlice, TEST_SAVE_VOL_FILE_NAME); - } - - // create clipped volume - // const resClip = VolumeClipper.clipVolumeByNonConvexGeo(this.m_pixelsSrc, this.m_xDim, this.m_yDim, this.m_zDim, - // volTexDst, geoRender, createType); - // if (resClip < 0) { - // console.log(`clipVolumeByNonConvexGeo returned ${resClip} !`); - // } - - // let i; - // const numPixels = this.m_xDim * this.m_yDim * this.m_zDim; - // for (i = 0; i < numPixels; i++) { - // volTexDst[i] = this.m_pixelsSrc[i]; - // } - - if (this.m_createType === ActiveVolume.REMOVE_SKULL) { - const numPixels = this.m_xDim * this.m_yDim * this.m_zDim; - const volMask = new Uint8Array(numPixels); - - // create volume mask. 255: visible part, 0 - invisible - const WITH_FILL = 1; - const resFill = VolumeGenerator.generateFromFaces(this.m_xDim, this.m_yDim, this.m_zDim, - volMask, - geoRender, - WITH_FILL); - if (resFill < 0) { - console.log(`generateFromFaces returned ${resFill} !`); - } - // apply volMask to volSrc - for (let i = 0; i < numPixels; i++) { - this.m_volTexDst[i] = (volMask[i] !== 0) ? this.m_volTexSrc[i] : 0; - } - } else if (this.m_createType === ActiveVolume.CREATE_MASK) { - // create volume mask. 255: visible part, 0 - invisible - const WITH_FILL = 1; - const resFill = VolumeGenerator.generateFromFaces(this.m_xDim, this.m_yDim, this.m_zDim, - this.m_volTexDst, - geoRender, - WITH_FILL); - if (resFill < 0) { - console.log(`generateFromFaces returned ${resFill} !`); - } - } - - // save result for deep debug - const NEED_SAVE_CLIPPED_SLICE_BMP = false; - if (this.m_needLog && NEED_SAVE_CLIPPED_SLICE_BMP) { - const TEST_SLICE_SAVE_FILE_NAME = 'test_clipped_slice.bmp'; - const zSlice = Math.floor(this.m_zDim / NUM_2); - ActiveVolume.saveVolumeSliceToFile(this.m_volTexDst, - this.m_xDim, this.m_yDim, this.m_zDim, zSlice, TEST_SLICE_SAVE_FILE_NAME); - } - - /* - // Save clipped volume into KTX file - const NEED_SAVE_CLIPPED_VOLUME_KTX = false; - if (NEED_SAVE_CLIPPED_VOLUME_KTX) { - const ktxVol = new KtxLoader(); - const xSize = this.m_xDim; - const ySize = this.m_yDim; - const zSize = this.m_zDim; - ktxVol.createFromMemory(this.m_xDim, this.m_yDim, this.m_zDim, volTexDst, xSize, ySize, zSize); - const TEST_CLIPPED_VOL_KTX_NAME = 'test_clipped.ktx'; - ktxVol.writeFile(TEST_CLIPPED_VOL_KTX_NAME); - } - */ - return +1; - } - - /** - * Remove skull - * @param {number} xDim volume dimension on x - * @param {number} yDim volume dimension on y - * @param {number} zDim volume dimension on z - * @param {array} volTexSrc source volume - * @param {array} volTexDst destination volume - * @param {number} createType Kind of - * @param {boolean} needLog Need intensive log - * @param {object} progressCallback callback function for progress - * @return {number} 1, if success. <0 if failed - */ - skullRemove(xDim, yDim, zDim, volTexSrc, volTexDst, createType, needLog) { - const TOO_MUCH_SIZE = 8192; - if ((createType !== ActiveVolume.REMOVE_SKULL) && (createType !== ActiveVolume.CREATE_MASK)) { - console.log('skullRemove: wrong argument createType'); - } - if ((xDim >= TOO_MUCH_SIZE) || (yDim >= TOO_MUCH_SIZE) || (zDim >= TOO_MUCH_SIZE)) { - console.log(`Too bad volume dimension: ${xDim} * ${yDim} * ${zDim}`); - return -1; - } - if ((xDim <= 1) || (yDim <= 1) || (zDim <= 1)) { - console.log(`Too bad volume dimension: ${xDim} * ${yDim} * ${zDim}`); - return -1; - } - const volSizeSrc = volTexSrc.length; - const numPixSrc = xDim * yDim * zDim; - if (volSizeSrc !== numPixSrc) { - console.log(`skullRemove: bad vol size = ${volSizeSrc}, expected ${numPixSrc}`); - return -1; - } - const okCreate = this.create(xDim, yDim, zDim, volTexSrc); - if (okCreate !== 1) { - return okCreate; - } - const genTetra = new TetrahedronGenerator(); - const vRadius = new THREE.Vector3(0.5, 0.5, 0.5); - const NUM_SUBDIVIDES = 3; - const okCreateTetra = genTetra.create(vRadius, NUM_SUBDIVIDES); - if (okCreateTetra < 1) { - return okCreateTetra; - } - const geoRender = new GeoRender(); - const errGeo = geoRender.createFromTetrahedronGenerator(genTetra); - const GEO_OK = 1; - if (errGeo !== GEO_OK) { - const ERR_CREATE_GEO = -3; - return ERR_CREATE_GEO; - } - - // get half from volume dimension - const xDim2 = Math.floor((this.m_xDim - 1) * 0.5); - const yDim2 = Math.floor((this.m_yDim - 1) * 0.5); - const zDim2 = Math.floor((this.m_zDim - 1) * 0.5); - - // scale geo render vertices - const numVertices = geoRender.getNumVertices(); - const vertices = geoRender.getVertices(); - const COORDS_IN_VERTEX = 4; - const NUM_0 = 0; - const NUM_1 = 1; - const NUM_2 = 2; - for (let i = 0, i4 = 0; i < numVertices; i++, i4 += COORDS_IN_VERTEX) { - vertices[i4 + NUM_0] = xDim2 + xDim2 * vertices[i4 + NUM_0]; - vertices[i4 + NUM_1] = yDim2 + yDim2 * vertices[i4 + NUM_1]; - vertices[i4 + NUM_2] = zDim2 + zDim2 * vertices[i4 + NUM_2]; - } // for (i) all vertices - - // save render geo to obj file - const NEED_SAVE_INITIAL_GEO = false; - if (NEED_SAVE_INITIAL_GEO) { - const TEST_SAVE_INIT_GEO_FILE_NAME = 'geo_init.obj'; - geoRender.saveGeoToObjFile(TEST_SAVE_INIT_GEO_FILE_NAME); - } - - // Test save bounding sphere - const NEED_SAVE_BOUND_SPHERE = false; - if (NEED_SAVE_BOUND_SPHERE) { - const vMin = new THREE.Vector3(); - const vMax = new THREE.Vector3(); - ActiveVolume.getBoundingBox(this.m_xDim, this.m_yDim, this.m_zDim, this.m_pixelsSrc, vMin, vMax); - const geoSphere = new GeoRender(); - const vCenter = new THREE.Vector3(); - const vRad = new THREE.Vector3(); - vCenter.x = (vMin.x + vMax.x) * 0.5; - vCenter.y = (vMin.y + vMax.y) * 0.5; - vCenter.z = (vMin.z + vMax.z) * 0.5; - vRad.x = (vMax.x - vMin.x) * 0.5; - vRad.y = (vMax.y - vMin.y) * 0.5; - vRad.z = (vMax.z - vMin.z) * 0.5; - - const NUM_SEGM_HOR = 16; - const NUM_SEGM_VER = 8; - geoSphere.createFromEllipse(vCenter, vRad, NUM_SEGM_HOR, NUM_SEGM_VER); - const TEST_SAVE_BSPHERE_GEO_FILE_NAME = 'geo_bsph.obj'; - geoSphere.saveGeoToObjFile(TEST_SAVE_BSPHERE_GEO_FILE_NAME); - } - - // perform itertaions: update geo - let numPredSteps = this.getPredictedStepsForActiveVolumeUpdate(); - const SOME_ADD_STEPS = 12; - numPredSteps += SOME_ADD_STEPS; - - const strTypeArr = ['REMOVE_SKULL', 'CREATE_MASK']; - const strType = strTypeArr[createType]; - console.log(`skullRemove. Will be ${numPredSteps} updates approximately. In ${strType} mode `); - - let isFinished = false; - if (numPredSteps > 0) { - for (this.m_updateCounter = 0; (this.m_updateCounter < numPredSteps) && !isFinished; this.m_updateCounter++) { - //if (needLogPrintf) { - // printf("."); - // } - console.log(`skullRemove(${this.m_updateCounter})`); - this.updateGeo(geoRender, AV_METHOD_ALL); - isFinished = (this.m_state === AV_STATE_FINISHED); - } - } - - // save geo render after all modification iterations - const NEED_SAVE_FINAL_GEO_RENDER = false; - if (NEED_SAVE_FINAL_GEO_RENDER) { - this.finalizeUpdatesGeo(geoRender, NEED_SAVE_FINAL_GEO_RENDER); - } - - // Save smoothed image into file - const NEED_SAVE_NONCLIPPED_SLICE_BMP = false; - if (NEED_SAVE_NONCLIPPED_SLICE_BMP) { - const TEST_SAVE_VOL_FILE_NAME = 'test_nonclipped_slice.bmp'; - const zSlice = Math.floor(this.m_zDim / NUM_2); - ActiveVolume.saveVolumeSliceToFile(this.m_pixelsSrc, - this.m_xDim, this.m_yDim, this.m_zDim, zSlice, TEST_SAVE_VOL_FILE_NAME); - } - - // create clipped volume - // const resClip = VolumeClipper.clipVolumeByNonConvexGeo(this.m_pixelsSrc, this.m_xDim, this.m_yDim, this.m_zDim, - // volTexDst, geoRender, createType); - // if (resClip < 0) { - // console.log(`clipVolumeByNonConvexGeo returned ${resClip} !`); - // } - - // let i; - // const numPixels = this.m_xDim * this.m_yDim * this.m_zDim; - // for (i = 0; i < numPixels; i++) { - // volTexDst[i] = this.m_pixelsSrc[i]; - // } - - if (createType === ActiveVolume.REMOVE_SKULL) { - const numPixels = this.m_xDim * this.m_yDim * this.m_zDim; - const volMask = new Uint8Array(numPixels); - - // create volume mask. 255: visible part, 0 - invisible - const WITH_FILL = 1; - const resFill = VolumeGenerator.generateFromFaces(this.m_xDim, this.m_yDim, this.m_zDim, - volMask, - geoRender, - WITH_FILL); - if (resFill < 0) { - console.log(`generateFromFaces returned ${resFill} !`); - } - // apply volMask to volSrc - for (let i = 0; i < numPixels; i++) { - volTexDst[i] = (volMask[i] !== 0) ? volTexSrc[i] : 0; - } - } else if (createType === ActiveVolume.CREATE_MASK) { - // create volume mask. 255: visible part, 0 - invisible - const WITH_FILL = 1; - const resFill = VolumeGenerator.generateFromFaces(this.m_xDim, this.m_yDim, this.m_zDim, - volTexDst, - geoRender, - WITH_FILL); - if (resFill < 0) { - console.log(`generateFromFaces returned ${resFill} !`); - } - } - - // save result for deep debug - const NEED_SAVE_CLIPPED_SLICE_BMP = false; - if (needLog && NEED_SAVE_CLIPPED_SLICE_BMP) { - const TEST_SLICE_SAVE_FILE_NAME = 'test_clipped_slice.bmp'; - const zSlice = Math.floor(this.m_zDim / NUM_2); - ActiveVolume.saveVolumeSliceToFile(volTexDst, - this.m_xDim, this.m_yDim, this.m_zDim, zSlice, TEST_SLICE_SAVE_FILE_NAME); - } - - /* - // Save clipped volume into KTX file - const NEED_SAVE_CLIPPED_VOLUME_KTX = false; - if (NEED_SAVE_CLIPPED_VOLUME_KTX) { - const ktxVol = new KtxLoader(); - const xSize = this.m_xDim; - const ySize = this.m_yDim; - const zSize = this.m_zDim; - ktxVol.createFromMemory(this.m_xDim, this.m_yDim, this.m_zDim, volTexDst, xSize, ySize, zSize); - const TEST_CLIPPED_VOL_KTX_NAME = 'test_clipped.ktx'; - ktxVol.writeFile(TEST_CLIPPED_VOL_KTX_NAME); - } - */ - return +1; - } // skullRemove - - static getBoundingBox(xDim, yDim, zDim, volTexSrc, vMin, vMax) { - const MIN_VIS_COLOR = 50; - let x, y, z; - vMax.set(0.0, 0.0, 0.0); - vMin.set(xDim, yDim, zDim); - let ind = 0; - for (z = 0; z < zDim; z++) { - for (y = 0; y < yDim; y++) { - for (x = 0; x < xDim; x++) { - const val = volTexSrc[ind]; - ind++; - if (val < MIN_VIS_COLOR) { - continue; - } - // update bbox - vMin.x = (x < vMin.x) ? x : vMin.x; - vMin.y = (y < vMin.y) ? y : vMin.y; - vMin.z = (z < vMin.z) ? z : vMin.z; - vMax.x = (x > vMax.x) ? x : vMax.x; - vMax.y = (y > vMax.y) ? y : vMax.y; - vMax.z = (z > vMax.z) ? z : vMax.z; - } // for (x) - } // for (y) - } // for (z) - } - - /** - * Save volume slice to BMP file. Only for deep debug - * @param {array} pixelsSrc array of source voxels in volume - * @param {number} xDim Volume dimension on x - * @param {number} yDim Volume dimension on y - * @param {number} zDim Volume dimension on z - * @param {number} zSlice index of slice in volume - * @param {string } fileName save file name - */ - static saveVolumeSliceToFile(pixelsSrc, xDim, yDim, zDim, zSlice, fileName) { - const SIZE_HEADER = 14; - const SIZE_INFO = 40; - const COMPS_IN_COLOR = 3; - const numPixels = xDim * yDim; - let pixStride = COMPS_IN_COLOR * xDim; - pixStride = (pixStride + COMPS_IN_COLOR) & (~COMPS_IN_COLOR); - const totalBufSize = SIZE_HEADER + SIZE_INFO + (numPixels * COMPS_IN_COLOR); - const buf = new Uint8Array(totalBufSize); - for (let j = 0; j < totalBufSize; j++) { - buf[j] = 0; - } - const BYTE_MASK = 255; - const BITS_IN_BYTE = 8; - // write header - const BYTES_IN_DWORD = 4; - - let i = 0; - // bfType[16] - buf[i++] = 0x42; - buf[i++] = 0x4D; - // bfSize[32] - let bfSize = SIZE_HEADER + SIZE_INFO + pixStride * yDim; - buf[i++] = bfSize & BYTE_MASK; bfSize >>= BITS_IN_BYTE; - buf[i++] = bfSize & BYTE_MASK; bfSize >>= BITS_IN_BYTE; - buf[i++] = bfSize & BYTE_MASK; bfSize >>= BITS_IN_BYTE; - buf[i++] = bfSize & BYTE_MASK; - // bfReserved1 + bfReserved2 - i += BYTES_IN_DWORD; - // bfOffBits[32] - let bfOffBits = SIZE_HEADER + SIZE_INFO; - buf[i++] = bfOffBits & BYTE_MASK; bfOffBits >>= BITS_IN_BYTE; - buf[i++] = bfOffBits & BYTE_MASK; bfOffBits >>= BITS_IN_BYTE; - buf[i++] = bfOffBits & BYTE_MASK; bfOffBits >>= BITS_IN_BYTE; - buf[i++] = bfOffBits & BYTE_MASK; - - // write info - - // biSize[32] - let biSize = SIZE_INFO; - buf[i++] = biSize & BYTE_MASK; biSize >>= BITS_IN_BYTE; - buf[i++] = biSize & BYTE_MASK; biSize >>= BITS_IN_BYTE; - buf[i++] = biSize & BYTE_MASK; biSize >>= BITS_IN_BYTE; - buf[i++] = biSize & BYTE_MASK; - // biWidth[32] - let biWidth = xDim; - buf[i++] = biWidth & BYTE_MASK; biWidth >>= BITS_IN_BYTE; - buf[i++] = biWidth & BYTE_MASK; biWidth >>= BITS_IN_BYTE; - buf[i++] = biWidth & BYTE_MASK; biWidth >>= BITS_IN_BYTE; - buf[i++] = biWidth & BYTE_MASK; - // biHeight[32] - let biHeight = yDim; - buf[i++] = biHeight & BYTE_MASK; biHeight >>= BITS_IN_BYTE; - buf[i++] = biHeight & BYTE_MASK; biHeight >>= BITS_IN_BYTE; - buf[i++] = biHeight & BYTE_MASK; biHeight >>= BITS_IN_BYTE; - buf[i++] = biHeight & BYTE_MASK; - // biPlanes[16] - buf[i++] = 1; - buf[i++] = 0; - // biBitCount[16] - buf[i++] = 24; - buf[i++] = 0; - // biCompression[32] - i += BYTES_IN_DWORD; - // biSizeImage[32] - let biSizeImage = pixStride * yDim; - buf[i++] = biSizeImage & BYTE_MASK; biSizeImage >>= BITS_IN_BYTE; - buf[i++] = biSizeImage & BYTE_MASK; biSizeImage >>= BITS_IN_BYTE; - buf[i++] = biSizeImage & BYTE_MASK; biSizeImage >>= BITS_IN_BYTE; - buf[i++] = biSizeImage & BYTE_MASK; - // biXPelsPerMeter[32] - i += BYTES_IN_DWORD; - // biYPelsPerMeter[32] - i += BYTES_IN_DWORD; - // biClrUsed[32] - i += BYTES_IN_DWORD; - // biClrImportant[32] - i += BYTES_IN_DWORD; - - let j; - // get max volume - const offSlice = zSlice * xDim * yDim; - let valMax = 0; - for (j = 0; j < numPixels; j++) { - const valGrey = pixelsSrc[offSlice + j]; - valMax = (valGrey > valMax) ? valGrey : valMax; - } // for (j) - console.log(`saveVolumeSlice. valMax = ${valMax}`); - - // write pixels - const MAX_COLOR = 255; - for (j = 0; j < numPixels; j++) { - const valGrey = Math.floor(pixelsSrc[offSlice + j] * MAX_COLOR / valMax); - // write rgb components - buf[i++] = valGrey; - buf[i++] = valGrey; - buf[i++] = valGrey; - } // for (j) - - // write buffer to file - const blob = new Blob([buf], { type: 'application/octet-stream' }); - const url = URL.createObjectURL(blob); - const linkGen = document.createElement('a'); - linkGen.setAttribute('href', url); - linkGen.setAttribute('download', fileName); - const eventGen = document.createEvent('MouseEvents'); - eventGen.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null); - linkGen.dispatchEvent(eventGen); - } - - getPredictedStepsForActiveVolumeUpdate() { - const TWO = 2; - const hx = this.m_xDim; - const hy = this.m_yDim; - const hz = this.m_zDim; - const xyMax = (hx > hy) ? hx : hy; - const xyzMax = (xyMax > hz) ? xyMax : hz; - const SCAN_RAD = 4; - const stepsByRad = (xyzMax - SCAN_RAD); - const SOME_ADD_STEPS = 4; - const stepsAll = stepsByRad + (TWO * ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES) + SOME_ADD_STEPS; - return stepsAll; - } - - /** - * Create members for iterations later - * @return {number} 1, if success. <0 if failed - */ - create(xDim, yDim, zDim, volTexSrc) { - if ((xDim > X_MAX_DIM) || (yDim > Y_MAX_DIM) || (zDim > Z_MAX_DIM)) { - // scale down twice or 4 - this.m_xScale = Math.floor(xDim / X_MAX_DIM); - this.m_yScale = Math.floor(yDim / Y_MAX_DIM); - this.m_zScale = Math.floor(zDim / Z_MAX_DIM); - let maxScale = (this.m_xScale > this.m_yScale) ? this.m_xScale : this.m_yScale; - maxScale = (this.m_zScale > maxScale) ? this.m_zScale : maxScale; - const TWO = 2; - if (maxScale <= 1) { - this.m_xScale = this.m_yScale = this.m_zScale = TWO; - } - this.m_xScale = (this.m_xScale >= 1) ? this.m_xScale : 1; - this.m_yScale = (this.m_yScale >= 1) ? this.m_yScale : 1; - this.m_zScale = (this.m_zScale >= 1) ? this.m_zScale : 1; - - const xScaled = Math.floor(xDim / this.m_xScale); - const yScaled = Math.floor(yDim / this.m_yScale); - const zScaled = Math.floor(zDim / this.m_zScale); - const numPixelsScaled = xScaled * yScaled * zScaled; - const pixelsScaled = new Uint8Array(numPixelsScaled); - VolumeTools.scaleDown(volTexSrc, xDim, yDim, zDim, pixelsScaled, this.m_xScale, this.m_yScale, this.m_zScale); - this.m_pixelsSrc = pixelsScaled; - this.m_wasAllocated = true; - this.m_xDim = xScaled; - this.m_yDim = yScaled; - this.m_zDim = zScaled; - console.log(`ActiveVolume. Scaled down to ${xScaled} * ${yScaled} * ${zScaled}`); - } else { - this.m_xDim = xDim; - this.m_yDim = yDim; - this.m_zDim = zDim; - this.m_pixelsSrc = volTexSrc; - this.m_wasAllocated = false; - } - - this.m_state = AV_STATE_NOT_STARTED; - const numPixels = this.m_xDim * this.m_yDim * this.m_zDim; - this.m_imageGauss = new Float32Array(numPixels); - this.m_imageUniformity = new Float32Array(numPixels); - this.m_verticesNew = null; - // add checks - if (this.m_pixelsSrc.length !== numPixels) { - // console.log(`ActiveVolume.create: Bad vol.expect data len=${numPixels},actual len=${volTexSrc.length}`); - return 0; - } - return 1; - } - - /** - * Make special unifoirmity image for whole volume - */ - makeUniformityImage(pixelsSrc, xDim, yDim, zDim, - zStart, zEnd, - pixelsGrad, - pixelsDst, - koefAlpha) { - // radius neighbours - const TWICE = 2; - const RAD_UNI = 1; - const DIA_UNI = (1 + TWICE * RAD_UNI); - - const SCALE_ALL_ELEMS = 1.0 / (DIA_UNI * DIA_UNI * DIA_UNI); - // let maxLen = 0.0; - let cx, cy, cz; - - const zs = (zStart > RAD_UNI) ? zStart : RAD_UNI; - const ze = (zEnd < zDim - RAD_UNI) ? zEnd : (zDim - RAD_UNI); - - for (cz = zs; cz < ze; cz++) { - const czOff = cz * xDim * yDim; - for (cy = RAD_UNI; cy < yDim - RAD_UNI; cy++) { - const cyOff = cy * xDim; - for (cx = RAD_UNI; cx < xDim - RAD_UNI; cx++) { - let sumDx = 0.0; - let sumDy = 0.0; - let sumDz = 0.0; - let dx, dy, dz; - - for (dz = -RAD_UNI; dz <= +RAD_UNI; dz++) { - const z = cz + dz; - const zOff = z * xDim * yDim; - for (dy = -RAD_UNI; dy <= +RAD_UNI; dy++) { - const y = cy + dy; - const yOff = y * xDim; - for (dx = -RAD_UNI; dx <= +RAD_UNI; dx++) { - const x = cx + dx; - const offSrc = x + yOff + zOff; - // if ((offSrc < 0) || (offSrc >= numPixelsVol)) { - // console.log('!!! Out of array'); - // } - const val = pixelsSrc[offSrc]; - sumDx += val * dx; - sumDy += val * dy; - sumDz += val * dz; - } // for (dx) - } // for (dy) - } // for (dz) - - sumDx *= SCALE_ALL_ELEMS; - sumDy *= SCALE_ALL_ELEMS; - sumDz *= SCALE_ALL_ELEMS; - - // maxLen = (gradLen > maxLen) ? gradLen : maxLen; - - const gradLen = Math.sqrt(sumDx * sumDx + sumDy * sumDy + sumDz * sumDz); - pixelsGrad[cx + cyOff + czOff] = gradLen; - pixelsDst[cx + cyOff + czOff] = Math.exp(-koefAlpha * gradLen); - - } // for (cx) - } // for (cy) - } // for (cz) - // console.log(`makeUniformityImage done for z = ${zs} to ${ze}`); - } - - /** - * Start image smoothimg by Gauss convolution - */ - startImageSmooth() { - const numPixels = this.m_xDim * this.m_yDim * this.m_zDim; - let i; - for (i = 0; i < numPixels; i++) { - this.m_imageGauss[i] = 0.0; - this.m_imageUniformity[i] = 0.0; - } - this.m_imageSrc = new Float32Array(numPixels); - this.m_imageGrad = new Float32Array(numPixels); - for (i = 0; i < numPixels; i++) { - this.m_imageGrad[i] = 0.0; - const val = this.m_pixelsSrc[i]; - this.m_imageSrc[i] = val; - } - return 1; - } - - /** - * Stop volume smothing by Gauss - */ - stopImageSmooth() { - this.m_imageGrad = null; - this.m_imageSrc = null; - } - - applyPartGaussSmooth(zStart, zEnd, rad, sigma) { - const TWICE = 2; - const dia = 1 + TWICE * rad; - // fill gauss matrix - const THREE_DIMS = 3.0; - const koef = 1.0 / (THREE_DIMS * sigma * sigma); - let dx, dy, dz; - let j = 0; - if (zStart === 0) { - const GAUSS_MAX_RAD = 9; - const GAUSS_MAX_DIA = (1 + TWICE * GAUSS_MAX_RAD); - this.m_gaussMatrix = new Float32Array(GAUSS_MAX_DIA * GAUSS_MAX_DIA * GAUSS_MAX_DIA); - let wSum = 0.0; - for (dz = -rad; dz <= +rad; dz++) { - const fz = dz / rad; - for (dy = -rad; dy <= +rad; dy++) { - const fy = dy / rad; - for (dx = -rad; dx <= +rad; dx++) { - const fx = dx / rad; - const dist2 = fx * fx + fy * fy + fz * fz; - const weight = Math.exp(-1.0 * dist2 * koef); - this.m_gaussMatrix[j++] = weight; - wSum += weight; - } - } - } // for (dz) - // normalize weights - const numGaussElems = dia * dia * dia; - const gScale = 1.0 / wSum; - for (j = 0; j < numGaussElems; j++) { - this.m_gaussMatrix[j] *= gScale; - } - const numPixels = this.m_xDim * this.m_yDim * this.m_zDim; - for (j = 0; j < numPixels; j++) { - this.m_imageGauss[j] = this.m_imageSrc[j]; - } - } - // apply gauss matrix to source image - const zs = (zStart > rad) ? zStart : rad; - const ze = (zEnd < this.m_zDim - rad) ? zEnd : (this.m_zDim - rad); - let cx, cy, cz; - for (cz = zs; cz < ze; cz++) { - const czOff = cz * this.m_xDim * this.m_yDim; - for (cy = rad; cy < this.m_yDim - rad; cy++) { - const cyOff = cy * this.m_xDim; - for (cx = rad; cx < this.m_xDim - rad; cx++) { - let sum = 0.0; - j = 0; - for (dz = -rad; dz <= +rad; dz++) { - const z = cz + dz; - const zOff = z * this.m_xDim * this.m_yDim; - for (dy = -rad; dy <= +rad; dy++) { - const y = cy + dy; - const yOff = y * this.m_xDim; - for (dx = -rad; dx <= +rad; dx++) { - const x = cx + dx; - const weight = this.m_gaussMatrix[j++]; - const val = this.m_imageSrc[x + yOff + zOff]; - sum += val * weight; - } // for (dx) - } // for (dy) - } // for (dz) - this.m_imageGauss[cx + cyOff + czOff] = sum; - // this.m_imageGauss[cx + cyOff + czOff] = 0.0; - } // for (cx) - } // for (cy) - } // for (cz) - } - - /** - * Smooth step - */ - static smoothStep(minRange, maxRange, arg) { - let t = (arg - minRange) / (maxRange - minRange); - t = (t > 0.0) ? t : 0.0; - t = (t < 1.0) ? t : 1.0; - const NUM_2 = 2.0; - const NUM_3 = 3.0; - const res = t * t * (NUM_3 - NUM_2 * t); - return res; - } - - /** - * Smooth 1d float array - */ - static smoothArray(values, numValues, gaussRad, gaussSigma) { - const dst = new Float32Array(AV_NUM_COLORS); - const mult = 1.0 / (gaussSigma * gaussSigma); - for (let ci = 0; ci < numValues; ci++) { - let sum = 0.0; - let sumWeight = 0.0; - for (let di = -gaussRad; di <= +gaussRad; di++) { - let i = ci + di; - i = (i >= 0) ? i : 0; - i = (i < numValues) ? i : (numValues - 1); - const t = di / gaussRad; - const weight = 1.0 / Math.exp(t * t * mult); - sumWeight += weight; - sum += values[i] * weight; - } - const valSmoothed = sum / sumWeight; - dst[ci] = valSmoothed; - } - // copy back - for (let i = 0; i < numValues; i++) { - values[i] = dst[i]; - } - } - - /** - * Get histogram from gaussian smoothed image - * and detect "dark" color range - */ - getHistogram() { - const MAX_COLOR = 255; - - let i; - // clear histogram - for (i = 0; i < AV_NUM_COLORS; i++) { - this.m_histogram[i] = 0; - } - - const TWO = 2; - // scan central image part - const SCAN_RANGE = 4; - const zMin = Math.floor(this.m_zDim / TWO - SCAN_RANGE); - const zMax = Math.floor(this.m_zDim / TWO + SCAN_RANGE); - const yMin = Math.floor(this.m_yDim / TWO - SCAN_RANGE); - const yMax = Math.floor(this.m_yDim / TWO + SCAN_RANGE); - - let x, y, z; - let numPixels = 0; - for (z = zMin; z < zMax; z++) { - const zOff = z * this.m_xDim * this.m_yDim; - for (y = yMin; y < yMax; y++) { - const yOff = y * this.m_xDim; - for (x = 0; x < this.m_xDim; x++) { - const off = x + yOff + zOff; - let val = this.m_imageGauss[off]; - val = (val < MAX_COLOR) ? val : MAX_COLOR; - this.m_histogram[Math.floor(val)]++; - numPixels++; - } // for (x) - } // for (y) - } // for (z) - // get probabilities of each color in histogram - for (i = 0; i < AV_NUM_COLORS; i++) { - const h = this.m_histogram[i]; - this.m_colorProbability[i] = h / numPixels; - } - - // smooth prob - const GAUSS_RAD = 5; - const GAUSS_SIGMA = 1.6; - ActiveVolume.smoothArray(this.m_colorProbability, AV_NUM_COLORS, GAUSS_RAD, GAUSS_SIGMA); - - // - // Histogram looks like this - // Brain - // - // +-----------------------> - // *** ******** - // * ** **** * - // * * * * * - // * * * * - // * * - // * - // * - // * - // * - - // Lungs - // +-----------------------> - // ***** ********** - // * * * - // * * * - // ** * * - // * * - // * * - // * * - // * - // - - // Find las local maximum: this is most frequent bright (white) color intensity - let j; - let indBrightColor = -1; - const DIST_DETECT_LOC_MAX = 9; - for (i = AV_NUM_COLORS - DIST_DETECT_LOC_MAX; i > DIST_DETECT_LOC_MAX; i--) { - let isLocMax = 1; - let isLarger = 0; - for (j = i - DIST_DETECT_LOC_MAX; j <= i + DIST_DETECT_LOC_MAX; j++) { - if (this.m_colorProbability[i] > this.m_colorProbability[j]) { - isLarger = 1; - } - if (this.m_colorProbability[i] < this.m_colorProbability[j]) { - isLocMax = 0; - break; - } - } // for (j) around i - if (isLocMax && isLarger) { - indBrightColor = i; - break; - } - } - if (indBrightColor === -1) { - console.log('Bright color cant be detected !'); - } - // console.log(`indBrightColor = ${indBrightColor}`); - - // Find first local maximum - let indDarkColor = -1; - for (i = 0; i < indBrightColor; i++) { - let isLocMax = true; - let isLarger = false; - const indScanMin = (i - DIST_DETECT_LOC_MAX >= 0) ? (i - DIST_DETECT_LOC_MAX) : 0; - const indScanMax = (i + DIST_DETECT_LOC_MAX <= MAX_COLOR) ? (i + DIST_DETECT_LOC_MAX) : MAX_COLOR; - for (j = indScanMin; j <= indScanMax; j++) { - if (this.m_colorProbability[i] > this.m_colorProbability[j]) { - isLarger = true; - } - if (this.m_colorProbability[i] < this.m_colorProbability[j]) { - isLocMax = false; - break; - } - } // for (j) around i - if (isLocMax && isLarger) { - indDarkColor = i; - break; - } - } // for (i) ind dark color - if (indDarkColor === -1) { - console.log('indDarkColor should not be -1'); - } - if (indDarkColor >= indBrightColor) { - console.log('indDarkColor should not less then indBrightColor'); - } - // console.log(`indDarkColor = ${indDarkColor}`); - - // Half of bright color is barrier to detect "black" / "white" change - const indBrightHalf = Math.floor(indBrightColor / TWO); - - // clear histogram - for (i = 0; i < AV_NUM_COLORS; i++) { - this.m_histogram[i] = 0; - } - - // Get histogram of part image - numPixels = 0; - for (z = zMin; z < zMax; z++) { - const zOff = z * this.m_xDim * this.m_yDim; - for (y = yMin; y < yMax; y++) { - const yOff = y * this.m_xDim; - let isExitFromBrightZoneDetected = false; - let numPixelsDarkZone = 0; - for (x = 0; x < this.m_xDim - 1; x++) { - const off = x + yOff + zOff; - const valCur = Math.floor(this.m_imageGauss[off + 0]); - const valNex = Math.floor(this.m_imageGauss[off + 1]); - const isCurGreat = (valCur > indBrightHalf) ? 1 : 0; - const isNexLess = (valNex <= indBrightHalf) ? 1 : 0; - if ((isCurGreat & isNexLess) !== 0) { - isExitFromBrightZoneDetected = true; - continue; - } - if (isExitFromBrightZoneDetected) { - const TOO_MUCH_BRIGHT_ZONE = 40; - if (numPixelsDarkZone > TOO_MUCH_BRIGHT_ZONE) { - break; - } - if (isCurGreat) { - break; - } - numPixelsDarkZone++; - const valOrig = Math.floor(this.m_pixelsSrc[off + 0]); - this.m_histogram[valOrig]++; - numPixels++; - } // if was exit from bright zone - } // for (x) - } // for (y) - } // for (z) - - // get probabilities of each color in histogram - for (i = 0; i < AV_NUM_COLORS; i++) { - const h = this.m_histogram[i]; - this.m_colorProbability[i] = h / numPixels; - } - - // smooth prob - const GAUSS_RAD_FOR_LOC = 8; - const GAUSS_SIGMA_FOR_LOC = 2.4; - ActiveVolume.smoothArray(this.m_colorProbability, AV_NUM_COLORS, GAUSS_RAD_FOR_LOC, GAUSS_SIGMA_FOR_LOC); - - // Find first local maximum - indDarkColor = -1; - for (i = 0; i < indBrightColor; i++) { - let isLocMax = true; - let isLarger = false; - const indScanMin = (i - DIST_DETECT_LOC_MAX >= 0) ? (i - DIST_DETECT_LOC_MAX) : 0; - const indScanMax = (i + DIST_DETECT_LOC_MAX <= MAX_COLOR) ? (i + DIST_DETECT_LOC_MAX) : MAX_COLOR; - for (j = indScanMin; j <= indScanMax; j++) { - if (this.m_colorProbability[i] > this.m_colorProbability[j]) { - isLarger = true; - } - if (this.m_colorProbability[i] < this.m_colorProbability[j]) { - isLocMax = false; - break; - } - } // for (j) around i - if (isLocMax && isLarger) { - indDarkColor = i; - break; - } - } // for (i) bright color - // console.log(`indDarkColor = ${indDarkColor}`); - - // Find next local min - let indDarkColorMax = -1; - for (i = indDarkColor + 1; i < indBrightColor; i++) { - let isLocMin = true; - let isLess = false; - const indScanMin = (i - DIST_DETECT_LOC_MAX >= 0) ? (i - DIST_DETECT_LOC_MAX) : 0; - const indScanMax = (i + DIST_DETECT_LOC_MAX <= MAX_COLOR) ? (i + DIST_DETECT_LOC_MAX) : MAX_COLOR; - for (j = indScanMin; j <= indScanMax; j++) { - if (this.m_colorProbability[i] < this.m_colorProbability[j]) { - isLess = 1; - } - if (this.m_colorProbability[i] > this.m_colorProbability[j]) { - isLocMin = false; - break; - } - } // for (j) around i - if (isLocMin && isLess) { - indDarkColorMax = i; - break; - } - } - if (indDarkColorMax <= indDarkColor) { - console.log('indDarkColorMax should be more indDarkColor!'); - } - - if (indDarkColorMax >= indBrightColor) { - console.log('indDarkColorMax should be less indBrightColor!'); - } - console.log(`ActiveVolume. Dark colors range is [${indDarkColor}, ${indDarkColorMax}]`); - - // Make smooth step function for range [indDarkColor .. indDarkColorMax] - for (i = 0; i < AV_NUM_COLORS; i++) { - this.m_colorProbability[i] = ActiveVolume.smoothStep(indDarkColor, indDarkColorMax, i); - } - // Debug here - indDarkColorMax++; - return 1; - } - - resetStateForGeoUpdates() { - this.m_geoStage = 0; - this.m_state = AV_STATE_UPDATE_GEO; - this.m_geoRender.createNormalsForGeometry(); - } - - resetStateToStartUpdates() { - this.m_geoStage = 0; - this.m_gaussStage = 0; - this.m_state = AV_STATE_NOT_STARTED; - } - - /** - * Update render geo - * @param {object} geo RederGeo to modify - * @param {number} method Method - * @return {number} 1, if success. < 0, if failed - */ - updateGeo(geo, method) { - if (geo === 'undefined') { - console.log('ActiveVolume. updateGeo: geo undefined'); - const FAIL_UNDEF = -1; - return FAIL_UNDEF; - } - if (geo === null) { - console.log('ActiveVolume. updateGeo: geo null'); - const FAIL_NULL = -2; - return FAIL_NULL; - } - - if (this.m_state === AV_STATE_FINISHED) { - return 1; - } - if (this.m_state === AV_STATE_NOT_STARTED) { - // first update - const okCreateNormals = geo.createNormalsForGeometry(); - if (okCreateNormals !== 1) { - console.log('geo.createNormalsForGeometry returned fail'); - return okCreateNormals; - } - - this.startImageSmooth(); - this.m_gaussStage = 0; - this.m_state = AV_STATE_PREPARE_GAUSS; - } - if (this.m_state === AV_STATE_PREPARE_GAUSS) { - const GAUSS_RAD = 2; - const GAUSS_SIGMA = 1.8; - const zStart = Math.floor(this.m_zDim * (this.m_gaussStage + 0) / ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES); - const zEnd = Math.floor(this.m_zDim * (this.m_gaussStage + 1) / ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES); - this.applyPartGaussSmooth(zStart, zEnd, GAUSS_RAD, GAUSS_SIGMA); - - this.m_gaussStage++; - if (this.m_gaussStage >= ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES) { - this.m_state = AV_STATE_PREPARE_UNIFORMITY; - this.m_uniformityStage = 0; - console.log('UpdateGeo. AV_STATE_PREPARE_UNIFORMITY.'); - return 1; - } - } - if (this.m_state === AV_STATE_PREPARE_UNIFORMITY) { - const zStart = Math.floor(this.m_zDim * (this.m_uniformityStage + 0) / ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES); - const zEnd = Math.floor(this.m_zDim * (this.m_uniformityStage + 1) / ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES); - const KOEF_UNIFORMITY = 0.07; - this.makeUniformityImage(this.m_imageGauss, this.m_xDim, this.m_yDim, this.m_zDim, - zStart, zEnd, this.m_imageGrad, this.m_imageUniformity, KOEF_UNIFORMITY); - this.m_uniformityStage++; - if (this.m_uniformityStage >= ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES) { - // DEBUG save - const DEBUG_SAVE_UNI = false; - if (DEBUG_SAVE_UNI) { - const TEST_SAVE_UNI_FILE_NAME = 'uni.bmp'; - const TWO = 2; - const zSlice = this.m_zDim / TWO; - ActiveVolume.saveVolumeSliceToFile(this.m_imageUniformity, - this.m_xDim, this.m_yDim, this.m_zDim, zSlice, TEST_SAVE_UNI_FILE_NAME); - } - - // finally get image histogram - // console.log('UpdateGeo. getHistogram...'); - this.getHistogram(); - this.stopImageSmooth(); - this.m_geoStage = 0; - this.m_state = AV_STATE_UPDATE_GEO; - // console.log('UpdateGeo. AV_STATE_UPDATE_GEO.'); - return 1; - } - } - - if (this.m_state === AV_STATE_UPDATE_GEO) { - if (this.m_verticesNew === null) { - const numVertices = geo.getNumVertices(); - const COORDS_IN_VERTREX = 4; - this.m_verticesNew = new Float32Array(numVertices * COORDS_IN_VERTREX); - } - - const updateNormals = (method & AV_METHOD_NORMALS) !== 0; - const updateUniformity = (method & AV_METHOD_UNIFORMITY) !== 0; - const updateColorKoefs = (method & AV_METHOD_COLOR_KOEFS) !== 0; - - const SPEED_NORMALS = 1.1; - if (updateNormals && !updateUniformity) { - this.updateGeoByVertexNormals(geo, SPEED_NORMALS); - } - if (updateNormals && updateUniformity && !updateColorKoefs) { - this.updateGeoByVertexNormalsAndUniformity(geo, SPEED_NORMALS); - } - if (updateNormals && updateUniformity && updateColorKoefs) { - const isFinished = this.updateGeoNormalsUniformityColors(geo, SPEED_NORMALS); - if (isFinished) { - console.log(`updateGeoNormalsUniformityColors is FINISHED. m_geoStage = ${this.m_geoStage}`); - this.m_state = AV_STATE_FINISHED; - } - } - this.m_geoStage++; - } // if state is update geo - return 1; - } - - getAveUniformityForGeoVertices(geo) { - let i, i4; - const numVertices = geo.getNumVertices(); - const vertices = geo.getVertices(); - const xyDim = this.m_xDim * this.m_yDim; - let uniAve = 0.0; - const NUM_COMPS_VERTEX = 4; - const OFF_0 = 0; - const OFF_1 = 1; - const OFF_2 = 2; - for (i = 0, i4 = 0; i < numVertices; i++, i4 += NUM_COMPS_VERTEX) { - // pixel coordinate in the volume - const x = Math.floor(vertices[i4 + OFF_0]); - const y = Math.floor(vertices[i4 + OFF_1]); - const z = Math.floor(vertices[i4 + OFF_2]); - - const off = x + (y * this.m_xDim) + (z * xyDim); - const uni = this.m_imageUniformity[off]; - uniAve += uni; - } - uniAve /= numVertices; - return uniAve; - } - - finalizeUpdatesGeo(geo, inDebugMode) { - if (inDebugMode) { - console.log(`geoUpdates are finished in ${this.m_updateCounter} steps`); - const FILE_NAME_GEO = 'geo_final.obj'; - geo.saveGeoToObjFile(FILE_NAME_GEO); - } - } - - /** - * Update geometry with normals, uniformity map and colors distribution - * @param {object} geo RederGeo to modify - * @param {number} normalSpeed speed for increase geo size - */ - updateGeoNormalsUniformityColors(geo, normalSpeed) { - const numVertices = geo.getNumVertices(); - // float array - const vertices = geo.getVertices(); - // THREE.Vector3 array - const normals = geo.getNormals(); - const numTriangles = geo.getNumTriangles(); - const indices = geo.getIndices(); - - // perform laplasian smoother - // ... - if (this.m_lapSmoother === null) { - this.m_lapSmoother = new LaplasianSmoother(); - } - - this.m_lapSmoother.performSmoothStep(numVertices, vertices, numTriangles, indices, this.m_verticesNew); - - const DEEP_DEBUG = false; - - // use smoothed vertices to update geo - const NUM_COMPS_VERTEX = 4; - const OFF_0 = 0; - const OFF_1 = 1; - const OFF_2 = 2; - let i, i4; - - // when sphere touch edges, this definately means iterations end - let sphereTouchEdge = false; - // if too much matched, than stop iterations - // let numMatchedToColor = 0; - - for (i = 0, i4 = 0; i < numVertices; i++, i4 += NUM_COMPS_VERTEX) { - let vx = vertices[i4 + OFF_0]; - let vy = vertices[i4 + OFF_1]; - let vz = vertices[i4 + OFF_2]; - const vn = normals[i]; - - // pixel coordinate in the volume - let x = Math.floor(vx); - let y = Math.floor(vy); - let z = Math.floor(vz); - - if (DEEP_DEBUG && (i === 0)) { - console.log(`v = ${vx}, ${vy}, ${vz}. int xyz = ${x},${y},${z}`); - console.log(`vn = ${vn.x}, ${vn.y}, ${vn.z}`); - } - - if (x >= this.m_xDim) { - sphereTouchEdge = true; - x = this.m_xDim - 1; - } - if (y >= this.m_yDim) { - sphereTouchEdge = true; - y = this.m_yDim - 1; - } - if (z >= this.m_zDim) { - sphereTouchEdge = true; - z = this.m_zDim - 1; - } - if (x < 0) { - sphereTouchEdge = true; - x = 0; - } - if (y < 0) { - sphereTouchEdge = true; - y = 0; - } - if (z < 0) { - sphereTouchEdge = true; - z = 0; - } - - const xyDim = this.m_xDim * this.m_yDim; - const off = x + (y * this.m_xDim) + (z * xyDim); - const uni = this.m_imageUniformity[off]; - const valGaussCur = this.m_imageGauss[off]; - - if (DEEP_DEBUG && (i === 0)) { - console.log(`uni = ${uni}, valGaussCur = ${valGaussCur}`); - } - - let compSum = uni; - // predict next position - const NEXT_STEP = 2.5; - let nx = Math.floor(vx + vn.x * NEXT_STEP); - let ny = Math.floor(vy + vn.y * NEXT_STEP); - let nz = Math.floor(vz + vn.z * NEXT_STEP); - - if (DEEP_DEBUG && (i === 0)) { - console.log(`nx = ${nx}, ny = ${ny}, nz = ${nz}`); - } - if ((nx < 0) || (ny < 0) || (nz < 0) || - (nx >= this.m_xDim) || (ny >= this.m_yDim) || (nz >= this.m_zDim)) { - sphereTouchEdge = true; - } - nx = (nx >= 0) ? nx : 0; - ny = (ny >= 0) ? ny : 0; - nz = (nz >= 0) ? nz : 0; - nx = (nx < this.m_xDim) ? nx : (this.m_xDim - 1); - ny = (ny < this.m_yDim) ? ny : (this.m_yDim - 1); - nz = (nz < this.m_zDim) ? nz : (this.m_zDim - 1); - - const nextOff = nx + (ny * this.m_xDim) + (nz * xyDim); - const valGaussNext = this.m_imageGauss[nextOff]; - const KOEF_GAUSS_DEC_MULT = 0.3; - if (valGaussNext > valGaussCur) { - compSum *= KOEF_GAUSS_DEC_MULT; - } - - if (DEEP_DEBUG && (i === 0)) { - console.log(`valGaussNext = ${valGaussNext}`); - } - - // use colors - const koef = this.m_colorProbability[Math.floor(valGaussCur)]; - compSum *= koef; - const COLOR_MATCH = 0.9; - const isColorMatch = (koef <= COLOR_MATCH); - // numMatchedToColor += (isColorMatch) ? 1 : 0; - - if (DEEP_DEBUG && (i === 0)) { - console.log(`koef = ${koef}, isColorMatch = ${isColorMatch}`); - } - - const vAddSmooth = new THREE.Vector3(); - vAddSmooth.x = this.m_verticesNew[i4 + OFF_0] - vx; - vAddSmooth.y = this.m_verticesNew[i4 + OFF_1] - vy; - vAddSmooth.z = this.m_verticesNew[i4 + OFF_2] - vz; - vAddSmooth.normalize(); - vAddSmooth.multiplyScalar(normalSpeed); - - const vAddGeo = new THREE.Vector3(); - vAddGeo.x = vn.x * compSum * normalSpeed; - vAddGeo.y = vn.y * compSum * normalSpeed; - vAddGeo.z = vn.z * compSum * normalSpeed; - - if (DEEP_DEBUG && (i === 0)) { - console.log(`vAddSmooth = ${vAddSmooth.x}, ${vAddSmooth.y}, ${vAddSmooth.z}`); - console.log(`vAddGeo = ${vAddGeo.x}, ${vAddGeo.y}, ${vAddGeo.z}`); - } - - const KOEF_ADD_SMOOTH = 0.3; - const KOEF_ADD_GEO = (1.0 - KOEF_ADD_SMOOTH); - - if (isColorMatch) { - // do nothing - } else { - const vNew = new THREE.Vector3(); - vNew.x = vx + vAddGeo.x * KOEF_ADD_GEO + vAddSmooth.x * KOEF_ADD_SMOOTH; - vNew.y = vy + vAddGeo.y * KOEF_ADD_GEO + vAddSmooth.y * KOEF_ADD_SMOOTH; - vNew.z = vz + vAddGeo.z * KOEF_ADD_GEO + vAddSmooth.z * KOEF_ADD_SMOOTH; - - vx = vNew.x; vy = vNew.y; - vz = vNew.z; - } - - this.m_verticesNew[i4 + OFF_0] = vx; - this.m_verticesNew[i4 + OFF_1] = vy; - this.m_verticesNew[i4 + OFF_2] = vz; - } // for i - - // debug - // if (numMatchedToColor > 0) { - // console.log(`numMatchedToColor = ${numMatchedToColor}. geoStage = ${this.m_geoStage}`); - // } - - // copy back - let errAve = 0.0; - for (i = 0, i4 = 0; i < numVertices; i++, i4 += NUM_COMPS_VERTEX) { - // estimate error of modification - const dx = this.m_verticesNew[i4 + OFF_0] - vertices[i4 + OFF_0]; - const dy = this.m_verticesNew[i4 + OFF_1] - vertices[i4 + OFF_1]; - const dz = this.m_verticesNew[i4 + OFF_2] - vertices[i4 + OFF_2]; - const err = dx * dx + dy * dy + dz * dz; - errAve += err; - - vertices[i4 + OFF_0] = this.m_verticesNew[i4 + OFF_0]; - vertices[i4 + OFF_1] = this.m_verticesNew[i4 + OFF_1]; - vertices[i4 + OFF_2] = this.m_verticesNew[i4 + OFF_2]; - } - errAve /= numVertices; - errAve = Math.sqrt(errAve); - const DIF_VERTICES_LIMIT = 0.12; - if (errAve < DIF_VERTICES_LIMIT) { - this.finalizeUpdatesGeo(geo, DEEP_DEBUG); - return true; - } - const aveUni = this.getAveUniformityForGeoVertices(geo); - const MIN_POSSIBLE_UNIFORMITY = 0.60; - if (aveUni < MIN_POSSIBLE_UNIFORMITY) { - this.finalizeUpdatesGeo(geo, DEEP_DEBUG); - return true; - } - if (sphereTouchEdge) { - this.finalizeUpdatesGeo(geo, DEEP_DEBUG); - return true; - } - - const DEEP_ERR_DEBUG = false; - if (DEEP_ERR_DEBUG) { - const VERTICES_UNIFORMITY = 1024; - console.log(`Iters errAve = ${errAve} < ${DIF_VERTICES_LIMIT}. aveUni = ${aveUni} < ${VERTICES_UNIFORMITY}`); - } - return false; - } // updateGeoNormalsUniformityColors - -} // class ActiveVolume - -/** Output flags */ -ActiveVolume.REMOVE_SKULL = 0; -ActiveVolume.CREATE_MASK = 1; - -/** Sphere evolve direction */ -ActiveVolume.SPHERE_EVOLVE_FROM_INSIDE = 0; -ActiveVolume.SPHERE_EVOLVE_FROM_OUTSIDE = 1; - -/** num iteration stages */ -ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES = 64; - diff --git a/src/demo/engine/actvolume/lungsfill/lft.js b/src/demo/engine/actvolume/lungsfill/lft.js deleted file mode 100644 index 8574114d..00000000 --- a/src/demo/engine/actvolume/lungsfill/lft.js +++ /dev/null @@ -1,278 +0,0 @@ -/** -* Lungs fill tool -* @module lib/scripts/lungsfill/lft -*/ -// relative imports -import FloodFillTool from './floodfill'; -import SeedPoints from './seedPoints'; - -const TOO_MIN_VAL = 40; - -/** -* Class LungsFillTool perform lungs selection (segmentation) -* @class LungsFillTool -*/ -export default class LungsFillTool { - /** - * Init all internal data - * @constructs LungsFillTool - */ - //constructor(xDim, yDim, zDim, volTexSrc, volTexMask, srcData) { - constructor(volume) { - this.VESSEL = true; - this.m_xDim = volume.m_xDim; - this.m_yDim = volume.m_yDim; - this.m_zDim = volume.m_zDim; - this.xBorderMin = 0; - this.yBorderMin = 0; - this.xBorderMax = 0; - this.yBorderMax = 0; - this.m_volTexSrc = volume.m_dataArray; - this.m_volTexMask = new Uint8Array(this.m_xDim * this.m_yDim * this.m_zDim); - this.m_volTexMask1 = new Uint8Array(this.m_xDim * this.m_yDim * this.m_zDim); - this.m_volTexMask2 = new Uint8Array(this.m_xDim * this.m_yDim * this.m_zDim); - this.m_ratioUpdate = 0; - } - - detectNonEmptyBox(pixelsSrc, xDim, yDim, zDim) { - const MIN_VAL_BARRIER = 8; - const TWICE = 2; - const xyDim = xDim * yDim; - const xDimHalf = Math.floor(xDim / TWICE); - const yDimHalf = Math.floor(yDim / TWICE); - let x, y, z; - let isEmpty; - const numBytesPerPixel = 1; - if (numBytesPerPixel === 1) { - isEmpty = true; - for (x = 0; (x < xDimHalf) && isEmpty; x++) { - // check is empty plane - for (y = 0; (y < yDim) && (isEmpty); y++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; - if (pixelsSrc[off] > MIN_VAL_BARRIER) { - isEmpty = false; - } - } // for (z) - } // for (y() - } // for (x) - this.xBorderMin = x - 1; - isEmpty = true; - for (x = xDim - 1; (x > xDimHalf) && (isEmpty); x--) { - // check is empty plane - for (y = 0; (y < yDim) && (isEmpty); y++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; - if (pixelsSrc[off] > MIN_VAL_BARRIER) { - isEmpty = false; - } - } // for (z) - } // for (y() - } // for (x) - this.xBorderMax = x + 1; - isEmpty = true; - for (y = 0; (y < yDimHalf) && (isEmpty); y++) { - // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; - if (pixelsSrc[off] > MIN_VAL_BARRIER) { - isEmpty = false; - } - } // for (z) - } // for (y() - } // for (x) - this.yBorderMin = y - 1; - isEmpty = true; - for (y = yDim - 1; (y > yDimHalf) && (isEmpty); y--) { - // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; - if (pixelsSrc[off] > MIN_VAL_BARRIER) { - isEmpty = false; - } - } // for (z) - } // for (y() - } // for (x) - this.yBorderMax = y + 1; - } - } - - delatation() { - let x, y, z; - let x1, y1, z1; - let zOff = 0; - let yOff = 0; - let count = 0; - let val = 0; - const VIS = 255; - const TWO = 2; - for (z = 0; z < this.m_zDim; z++) { - for (y = this.yBorderMin; y < this.yBorderMax; y++) { - for (x = this.xBorderMin; x < this.xBorderMax; x++) { - count = 0; - for (z1 = -1; z1 < TWO; z1++) { - zOff = (z + z1) * this.m_xDim * this.m_yDim; - for (y1 = -1; y1 < TWO; y1++) { - yOff = (y + y1) * this.m_xDim; - for (x1 = -1; x1 < TWO; x1++) { - if (this.m_volTexMask[x + x1 + yOff + zOff] === VIS) { - count++; - } - } - } - } - val = 0; - if (count > 0) { - val = VIS; - } - this.m_volTexMask1[x + y * this.m_xDim + z * this.m_xDim * this.m_yDim] = val; - } - } - } - } - - erosion() { - let x, y, z; - let x1, y1, z1; - let zOff = 0; - let yOff = 0; - let off = 0; - let count = 0; - const TWO = 2; - for (z = 0; z < this.m_zDim; z++) { - for (y = this.yBorderMin; y < this.yBorderMax; y++) { - for (x = this.xBorderMin; x < this.xBorderMax; x++) { - off = x + y * this.m_xDim + z * this.m_xDim * this.m_yDim; - this.m_volTexMask2[off] = this.m_volTexMask1[off]; - if (this.m_volTexMask1[off] !== this.m_volTexMask[off]) { - count = 0; - for (z1 = -1; z1 < TWO; z1++) { - zOff = (z + z1) * this.m_xDim * this.m_yDim; - for (y1 = -1; y1 < TWO; y1++) { - yOff = (y + y1) * this.m_xDim; - for (x1 = -1; x1 < TWO; x1++) { - if (this.m_volTexMask1[x + x1 + yOff + zOff] === 0) { - count++; - } - } - } - } - if (count > 0) { - this.m_volTexMask2[off] = 0; - } - } - } - } - } - } - - run() { - const xyzDim = this.m_xDim * this.m_yDim * this.m_zDim; - const VIS = 255; - if (this.m_ratioUpdate === 0) { - this.vSeed = { x: 0, y: 0, z: 0 }; - let resFind = 0; - this.seedPoints = new SeedPoints(this.m_volTexSrc, this.m_xDim, this.m_yDim, this.m_zDim); - resFind = this.seedPoints.findSeedPointOnCentralSlice(this.vSeed); - if (resFind) { - console.log('Lungs Central fill run: seed point not found'); - return resFind; - } - // copy dst volume before fill - for (let i = 0; i < xyzDim; i++) { - this.m_volTexMask[i] = this.m_volTexSrc[i]; - } - this.m_ratioUpdate = 20; - return false; - } - if (this.m_ratioUpdate === 20) { - const valThreshold = TOO_MIN_VAL; - this.fillTool = new FloodFillTool(); - this.fillTool.floodFill3dThreshold(this.m_xDim, this.m_yDim, this.m_zDim, this.m_volTexMask, this.vSeed, valThreshold); - this.m_ratioUpdate = 50; - return false; - } - //now this.m_volTexMask = 255, if lung, else = this.m_volTexSrc[i]; - // copy only filled with 255 pixels back and scale them to [0.255] - if (this.m_ratioUpdate === 50) { - let x; - const VIS = 255; - const SCALE = VIS / TOO_MIN_VAL; - if (!this.VESSEL) { - // not detect blood vessels - for (x = 0; x < xyzDim; x++) { - let val = 0; - if (this.m_volTexMask[x] === VIS) { - val = Math.floor(this.m_volTexSrc[x] * SCALE); - } - this.m_volTexSrc[x] = val; - } - } else { - // additional detect blood vessels - for (x = 0; x < xyzDim; x++) { - let val = 0; - if (this.m_volTexMask[x] === VIS) { - val = VIS; - } - this.m_volTexMask[x] = val; - } - } - this.m_ratioUpdate = 80; - return false; - } - if (this.m_ratioUpdate === 80) { - let x; - // additional detect blood vessels - for (x = 0; x < xyzDim; x++) { - let val = 0; - if (this.m_volTexMask[x] === VIS) { - val = VIS; - } - this.m_volTexMask[x] = val; - } - //now this.m_volTexMask = 255, if lung, else = 0; - this.detectNonEmptyBox(this.m_volTexMask, this.m_xDim, this.m_yDim, this.m_zDim); - // extend this.m_volTexMask to this.m_volTexMask1 - this.delatation(); - // erosion this.m_volTexMask1 to this.m_volTexMask2 - this.erosion(); - // save this.m_volTexSrc[i] in this.m_volTexMask1[i] - for (let i = 0; i < xyzDim; i++) { - this.m_volTexMask1[i] = this.m_volTexSrc[i]; - } - // airway to this.m_volTexMask1 - const resFind = this.seedPoints.findSeedPointOnFirstSlice(this.vSeed); - if (resFind) { - console.log('Airway fill run: seed point not found'); - return resFind; - } - this.minv = this.vSeed.z; - this.vSeed.z = 2; - console.log(`Airway fill run: seed point: ${this.vSeed.x} ${this.vSeed.y} ${this.minv}`); - this.m_ratioUpdate = 90; - return false; - } - if (this.m_ratioUpdate === 90) { - this.fillTool.floodFill3dThreshold(this.m_xDim, this.m_yDim, this.m_zDim, this.m_volTexMask1, this.vSeed, this.minv); - const HALF = 128.0; - for (let x = 0; x < xyzDim; x++) { - let val = 0.5 * this.m_volTexMask[x];//0; - if (this.m_volTexMask2[x] - this.m_volTexMask[x] === VIS) { - val = HALF + this.m_volTexSrc[x];//0.5 + this.m_srcData;VIS; this.m_volTexSrc[x];this.m_srcData - } - if (this.m_volTexMask1[x] === VIS) { - val = VIS; - } - this.m_volTexSrc[x] = val; - } - } - return true; - } -} -// errors -LungsFillTool.RESULT_NA = 0; -LungsFillTool.RESULT_COMPLETED = 1; -LungsFillTool.RESULT_BAD_HIST = 2; -LungsFillTool.RESULT_SEED_X_NOT_FOUND = 3; diff --git a/src/demo/engine/actvolume/pointlink.js b/src/demo/engine/actvolume/pointlink.js deleted file mode 100644 index ffb34a89..00000000 --- a/src/demo/engine/actvolume/pointlink.js +++ /dev/null @@ -1,44 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* Simple point link -* @module lib/scripts/actvolume/pointlink -*/ - -// absolute imports -import * as THREE from 'three'; - -// relative imports -// import PointLink from './pointlink'; - -/** -* Class PointLink define link entry -* @class PointLink -*/ -export default class PointLink { - /** - * Init all internal data - * @constructs PointLink - */ - constructor() { - this.m_point = new THREE.Vector3(); - this.m_next = null; - } -} diff --git a/src/demo/engine/actvolume/triangleset.js b/src/demo/engine/actvolume/triangleset.js deleted file mode 100644 index 2a0dd43a..00000000 --- a/src/demo/engine/actvolume/triangleset.js +++ /dev/null @@ -1,76 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* Triangle set -* @module lib/scripts/actvolume/triangleset -*/ - -// absolute imports -// import TetrahedronGenerator from 'tetra'; - -// relative imports -import TriangleIndices from './triindices'; - -/** -* Class TriangleSet define set of trinagles -* @class TriangleSet -*/ -export default class TriangleSet { - /** - * Init all internal data - * @constructs TriangleSet - */ - constructor(numTriangles) { - this.create(numTriangles); - } // constructor - - create(numTriangles) { - this.m_numTriangles = 0; - this.m_numAllocatedTriangles = numTriangles; - this.m_triangles = new Array(numTriangles); - const STRANGE_VALUE = -1; - for (let i = 0; i < numTriangles; i++) { - this.m_triangles[i] = new TriangleIndices(STRANGE_VALUE, STRANGE_VALUE, STRANGE_VALUE); - } - } // create - - /** - * Get number of triangles - * @return {number} - */ - getNumTriangles() { - return this.m_numTriangles; - } - - /** - * Add triangle to set - * @return 1, if success - */ - addTriangle(ia, ib, ic) { - if (this.m_numTriangles >= this.m_numAllocatedTriangles) { - return -1; - } - this.m_triangles[this.m_numTriangles].m_indices[0] = ia; - this.m_triangles[this.m_numTriangles].m_indices[1] = ib; - this.m_triangles[this.m_numTriangles].m_indices[2] = ic; - this.m_numTriangles++; - return 1; - } -} diff --git a/src/demo/engine/actvolume/trianglesingle.js b/src/demo/engine/actvolume/trianglesingle.js deleted file mode 100644 index 2a6456d3..00000000 --- a/src/demo/engine/actvolume/trianglesingle.js +++ /dev/null @@ -1,40 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* Single triagle -* @module lib/scripts/actvolume/trianglesingle -*/ - -// absolute imports -import * as THREE from 'three'; - -// relative imports - -/** -* Class TriangleSingle is one triangle -* @class TriangleSingle -*/ -export default class TriangleSingle { - constructor() { - this.va = new THREE.Vector3(); - this.vb = new THREE.Vector3(); - this.vc = new THREE.Vector3(); - } -} diff --git a/src/demo/engine/actvolume/trianglestack.js b/src/demo/engine/actvolume/trianglestack.js deleted file mode 100644 index 84f386b3..00000000 --- a/src/demo/engine/actvolume/trianglestack.js +++ /dev/null @@ -1,104 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* Triagle stack -* @module lib/scripts/actvolume/trianglestack -*/ - - -// relative imports -import TriangleSingle from './trianglesingle'; - -/** -* Class TriangleStack builds stack for triangles -* @class TriangleStack -*/ -export default class TriangleStack { - constructor() { - this.m_numAllocated = 0; - this.m_numStacked = 0; - this.m_stack = null; - } - - /* - * Create triangle stack - * @param {number} depthLevel number of triangles in stack - */ - create(depthLevel) { - const ESTIM = 20; - const MUL_INCREMENT = 4; - let numTiEstimate = ESTIM; - for (let i = 0; i < depthLevel; i++) { - numTiEstimate *= MUL_INCREMENT; - } - this.m_numAllocated = numTiEstimate; - this.m_stack = new Array(this.m_numAllocated); - for (let i = 0; i < this.m_numAllocated; i++) { - this.m_stack[i] = new TriangleSingle(); - } - this.m_numStacked = 0; - } // create - - /* - * Get stack depth - * @return {number} number of triangles in stack - */ - getStackDepth() { - return this.m_numStacked; - } - - /* - * Chech is stack empty - * @return {boolean} true, if empty - */ - isEmpty() { - return (this.m_numStacked === 0); - } - - /* - * Push triangle onto stack - * @param {object} va triangle a (THREE.Vector3) - * @param {object} vb triangle b (THREE.Vector3) - * @param {object} vc triangle c (THREE.Vector3) - */ - push(va, vb, vc) { - if (this.m_numStacked >= this.m_numAllocated) { - return -1; - } - this.m_stack[this.m_numStacked].va = va; - this.m_stack[this.m_numStacked].vb = vb; - this.m_stack[this.m_numStacked].vc = vc; - this.m_numStacked++; - return 1; - } // push triangle - - /* - * Pop triangle from stack - * @return {object} TriangleSingle object - */ - pop() { - if (this.m_numStacked <= 0) { - return null; - } - this.m_numStacked--; - return this.m_stack[this.m_numStacked]; - } // pop triangle - -} diff --git a/src/demo/engine/actvolume/triindices.js b/src/demo/engine/actvolume/triindices.js deleted file mode 100644 index 8a119b86..00000000 --- a/src/demo/engine/actvolume/triindices.js +++ /dev/null @@ -1,47 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* Triangle indices -* @module lib/scripts/actvolume/triindices -*/ - -// absolute imports -// import TetrahedronGenerator from 'tetra'; - -// relative imports -// import TriangleIndices from './triindices'; - -/** -* Class TriangleIndices define 3 indices of triangle -* @class TriangleIndices -*/ -export default class TriangleIndices { - /** - * Init all internal data - * @constructs TriangleIndices - */ - constructor(ia, ib, ic) { - const NUM_VERTS_IN_TRIANGLE = 3; - this.m_indices = new Int32Array(NUM_VERTS_IN_TRIANGLE); - this.m_indices[0] = ia; - this.m_indices[1] = ib; - this.m_indices[2] = ic; - } -} // TriangleIndices diff --git a/src/demo/engine/gfx/matcolor2d.js b/src/demo/engine/gfx/matcolor2d.js deleted file mode 100644 index 958b6cd3..00000000 --- a/src/demo/engine/gfx/matcolor2d.js +++ /dev/null @@ -1,66 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* Simple 2d mode material wiithout texture and lighting, only ambient color used -* @module lib/scripts/gfx/matcolor2d -*/ - -// ****************************************************************** -// imports -// ****************************************************************** - -// absoulte imports -import * as THREE from 'three'; - -/** Class @class MaterialColor2d for create 2d lines, etc */ -export default class MaterialColor2d { - /** Simple material constructor - * @constructor - * @param (float) r - color component(red) in [0..1] - * @param (float) g - color component(green) in [0..1] - * @param (float) b - color component(blue) in [0..1] - */ - constructor() { - this.m_strShaderVertex = ''; - this.m_strShaderFragment = ''; - } - - create() { - this.m_strShaderVertex = ` - void main() { - gl_Position = vec4(position, 1.0); - } - `; - this.m_strShaderFragment = ` - void main() { - gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); - } - `; - const material = new THREE.ShaderMaterial({ - vertexShader: this.m_strShaderVertex, - fragmentShader: this.m_strShaderFragment, - //side: THREE.FrontSide, - wireframe: true, - //depthTest: false - //clipping: false, - }); - return material; - } -} diff --git a/src/demo/engine/gfx/matfrontface.js b/src/demo/engine/gfx/matfrontface.js deleted file mode 100644 index 3ba5978d..00000000 --- a/src/demo/engine/gfx/matfrontface.js +++ /dev/null @@ -1,94 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* Frontface material, used for cube frontface rendering -* @module lib/scripts/gfx/matfrontface -*/ - -// ****************************************************************** -// imports -// ****************************************************************** - -// absoulte imports -import * as THREE from 'three'; -import FRONT_FACE_VERTEX_SHADER from '../shaders/frontface.vert' -import FRONT_FACE_FRAGMENT_SHADER from '../shaders/frontface.frag' - - -/** Class @class MaterialFF for volume frontface rendering */ -export default class MaterialFF { - /** Frontface material constructor - * @constructor - */ - constructor() { - this.m_strShaderVertex = ''; - this.m_strShaderFragment = ''; - this.m_uniforms = { - texBF: { type: 't', value: null }, - PlaneX: { type: 'v4', value: new THREE.Vector4(-1.0, 0.0, 0.0, 0.5) }, - PlaneY: { type: 'v4', value: new THREE.Vector4(0.0, -1.0, 0.0, 0.5) }, - PlaneZ: { type: 'v4', value: new THREE.Vector4(0.0, 0.0, -1.0, 0.5) }, - }; - } - - /** Frontface material constructor - * @return {object} Three.js material with this shader - */ - create(textureBF, callbackMat) { - // Init uniforms - this.m_uniforms.texBF.value = textureBF; - // create shader loaders - const vertexLoader = new THREE.FileLoader(THREE.DefaultLoadingManager); - vertexLoader.setResponseType('text'); - const fragmentLoader = new THREE.FileLoader(THREE.DefaultLoadingManager); - fragmentLoader.setResponseType('text'); - vertexLoader.load(FRONT_FACE_VERTEX_SHADER, (strVertexSh) => { - this.m_strShaderVertex = strVertexSh; - //console.log(`Load callback success. text = : ${strVertexSh} ...`); - fragmentLoader.load(FRONT_FACE_FRAGMENT_SHADER, (strFragmentSh) => { - this.m_strShaderFragment = strFragmentSh; - - const NEED_LOG = false; - if (NEED_LOG) { - const strLoadedVert = JSON.stringify(this.m_strShaderVertex); - console.log(`Readed vertex shader is: ${strLoadedVert} ...`); - const strLoadedFrag = JSON.stringify(this.m_strShaderFragment); - console.log(`Readed fragment shader is: ${strLoadedFrag} ...`); - } - const material = new THREE.ShaderMaterial({ - uniforms: this.m_uniforms, - vertexShader: this.m_strShaderVertex, - fragmentShader: this.m_strShaderFragment, - side: THREE.FrontSide, - depthTest: true, - depthFunc: THREE.LessEqualDepth, - blending: THREE.NoBlending, - }); - if (callbackMat) { - callbackMat(material); - } - }, - /*(strFragmentSh) => {},*/ - (e) => { - console.log("Shader load failed! because of error " + e.target.status + ", " + e.target.statusText); - }); - }); - } -} diff --git a/src/demo/engine/loaders/FileLoader.js b/src/demo/engine/loaders/FileLoader.js deleted file mode 100644 index 5d2e6fc1..00000000 --- a/src/demo/engine/loaders/FileLoader.js +++ /dev/null @@ -1,107 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* Common binary file loader -* @module src/demo/engine/loaders/FileLoader -*/ - -// ****************************************************************** -// File loader -// ****************************************************************** - -/** Instance habdle for loader */ -let GInstanceFileLoader = null; - -/** Class FileLoader for load binary files */ -export default class FileLoader { - /** Create empty loader - * @param {string} strUrl - URL for loaded file - */ - constructor(strUrl) { - if (!GInstanceFileLoader) { - GInstanceFileLoader = this; - } - /** @property {string} m_url - Urlf ror file being read */ - this.m_url = strUrl; - /** @property {object} m_request - XMLHttpRequest object, used for acees to resource */ - this.m_request = null; - this.readFile = this.readFile.bind(this); - } - - /** Read file - * @param {object} doneCallback - invoked callback - */ - readFile(doneCallback, rejectCallback) { - const METHOD = 'GET'; - this.m_request = new XMLHttpRequest(); - if (!this.m_request) { - console.log('Cant create object request'); - } - if ('withCredentials' in this.m_request) { - // this.m_request.withCredentials = true; - const NEED_ASYNC = true; - this.m_request.open(METHOD, this.m_url, NEED_ASYNC); - // } else if (typeof XDomainRequest !== 'undefined') { - // console.log('HttpRequest: XDomainRequest will be used'); - // this.m_request = new XDomainRequest(); - // this.m_request.open(METHOD, this.m_url); - } else { - this.m_request = null; - console.log('This browser cant support CORS requests'); - return; - } - - this.m_request.responseType = 'arraybuffer'; // "blob" - this.m_request.addEventListener('load', (event) => { - const arrBuf = event.target.response; - if (arrBuf === null) { - console.log('Bad response type. Expect object type in response.'); - } else if (doneCallback) { - // console.log(`FileFromServer response received. url = ${this.m_url}`); - - // check wrong buffer content - const enc = new TextDecoder("utf-8"); - let sz = arrBuf.byteLength; - if (sz > 4000) { - sz = 4000; - } - const bufHead = arrBuf.slice(0, sz); - const strBuf = enc.decode(bufHead); - if (strBuf.substr(0, 9) === "<!DOCTYPE") { - console.log("Error load data from URL. Read result is " + strBuf); - } - doneCallback(arrBuf); - } - }, false); - - this.m_request.addEventListener('error', () => { - // console.log(`Error event happend for XMLHttpRequest: loaded = ${event.loaded}, total = ${event.total}`); - const errMsg = `Error accessing file ${this.m_url}`; - rejectCallback(errMsg); - }, false); - - this.m_request.send(); - const RES_FAIL_404 = 404; - if (this.m_request.status === RES_FAIL_404) { - const errMsg = `Cant access url = ${this.m_url}`; - rejectCallback(errMsg); - } - } -} // end class FileLoader diff --git a/src/demo/engine/loaders/FileTools.js b/src/demo/engine/loaders/FileTools.js deleted file mode 100644 index 6091b368..00000000 --- a/src/demo/engine/loaders/FileTools.js +++ /dev/null @@ -1,106 +0,0 @@ - -// ********************************************** -// Imports -// ********************************************** - -// ********************************************** -// Class -// ********************************************** - -class FileTools { - isValidUrl(strUrl) { - const regA = /^((ftp|http|https):\/\/)?(([\S]+)\.)?([\S]+)\.([A-z]{2,})(:\d{1,6})?\/[\S]+/; - const regB = /(ftp|http|https):\/\/([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)(:([\d]+))?\/([\S]+)/; - const isValidA = strUrl.match(regA); - const isValidB = strUrl.match(regB); - if ((isValidA === null) && (isValidB === null)) { - return false; - } - return true; - } // end isValidUrl - - getFileNameFromUrl(strUrl) { - let idx = strUrl.lastIndexOf('/'); - if (idx < 0) { - idx = strUrl.lastIndexOf('\\'); - } - if (idx < 0) { - console.log('getFileNameFromUrl: wrong URL!'); - return ''; - } - let strFileName = strUrl.substring(idx + 1); - const MAX_LEN = 40; - strFileName = (strFileName.length <= MAX_LEN) ? strFileName : strFileName.substring(0, MAX_LEN); - return strFileName; - } - - getFolderNameFromUrl(strUrl) { - let idx = strUrl.lastIndexOf('/'); - if (idx < 0) { - idx = strUrl.lastIndexOf('\\'); - } - if (idx < 0) { - console.log('getFolderNameFromUrl: wrong URL!'); - return ''; - } - const strFolder = strUrl.substring(0, idx); - return strFolder; - } - - isUrlExists(strUrl) { - let request = null; - if (window.XMLHttpRequest) { - request = new XMLHttpRequest(); - } else { - // request = new ActiveXObject("Microsoft.XMLHTTP"); - } - // request.open('HEAD', strUrl, false); - const NEED_ASYNC = true; - request.open('GET', strUrl, NEED_ASYNC); - request.send(); - const RES_FAIL_404 = 404; - const isValid = (request.status !== RES_FAIL_404); - return isValid; - } // isUrlkExist - - encodeUrl(strIn) { - let strOut = ''; - let dotFound = false; - const len = strIn.length; - for (let i = 0; i < len; i++) { - const sym = strIn[i]; - const isDelim = (sym === '/') || (sym === '.') || (sym === '-') || (sym === '_'); - if (dotFound && (!isDelim)) { - const c = strIn.charCodeAt(i); - const symModi = String.fromCharCode(c + 1); - strOut += symModi; - } else { - strOut += sym; - } - dotFound = (sym === '.') ? true : dotFound; - } // for (i) - return strOut; - } // encodeUrl - - decodeUrl(strIn) { - let strOut = ''; - let dotFound = false; - const len = strIn.length; - for (let i = 0; i < len; i++) { - const sym = strIn[i]; - const isDelim = (sym === '/') || (sym === '.') || (sym === '-') || (sym === '_'); - if (dotFound && (!isDelim)) { - const c = strIn.charCodeAt(i); - const symModi = String.fromCharCode(c - 1); - strOut += symModi; - } else { - strOut += sym; - } - dotFound = (sym === '.') ? true : dotFound; - } // for (i) - console.log(`${strOut}`); - return strOut; - } // encodeUrl - -} // class FileTools -export default FileTools; diff --git a/src/demo/engine/loaders/LoadPromise.js b/src/demo/engine/loaders/LoadPromise.js deleted file mode 100644 index b698a0ad..00000000 --- a/src/demo/engine/loaders/LoadPromise.js +++ /dev/null @@ -1,101 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -'License'); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -/** -* File load from local disk or URL with promise to complete -* @module demo/engine.loaders/loadpromise -*/ - -// ****************************************************************** -// class LoadFilePromise -// ****************************************************************** - -/** Class LoadFilePromise implements local and remote (via URL) file reading functionality via Promises */ -export default class LoadFilePromise { - constructor() { - this.m_file = null; - this.m_reader = null; - this.m_request = null; - } - - /** - * Read local file. If success, invoke resolve callback for created promise - * - * @param {object} file - file to read - * @return {object} Promise, working after file will be read - */ - readLocal(file) { - return new Promise((resolve) => { - this.m_file = file; - this.m_reader = new FileReader(); - this.m_reader.addEventListener('load', (evt) => { - const arrBuf = evt.target.result; - if (resolve) { - resolve(arrBuf); - } - }); - this.m_reader.readAsArrayBuffer(this.m_file); - }); - } - - /** - * Read remote file (via promise). If success, invoke resolve callback for created promise - * - * @param {string} url - file to read - * @return {object} Promise, working after file will be read - */ - readFromUrl(url) { - return new Promise((resolve, reject) => { - this.m_url = url; - this.m_request = null; - const METHOD = 'GET'; - this.m_request = new XMLHttpRequest(); - if ('withCredentials' in this.m_request) { - // this.m_request.withCredentials = true; - const NEED_ASYNC = true; - this.m_request.open(METHOD, this.m_url, NEED_ASYNC); - // } else if (typeof XDomainRequest !== 'undefined') { - // console.log('HttpRequest: XDomainRequest will be used'); - // this.m_request = new XDomainRequest(); - // this.m_request.open(METHOD, this.m_url); - } else { - this.m_request = null; - console.log('This browser cant support CORS requests'); - return; - } - this.m_request.responseType = 'arraybuffer'; // "blob" - this.m_request.addEventListener('load', (event) => { - const arrBuf = event.target.response; - if (arrBuf === null) { - console.log('Bad response type. Expect object type in response.'); - } else { - resolve(arrBuf); - } - }, false); - - this.m_request.addEventListener('error', (event) => { - const strError = `Error event happend for XMLHttpRequest: loaded = ${event.loaded}, total = ${event.total}`; - console.log(strError); - reject(strError); - }, false); - this.m_request.send(); - }); - } -} diff --git a/src/demo/engine/loaders/LoaderUrlDicom.js b/src/demo/engine/loaders/LoaderUrlDicom.js deleted file mode 100644 index 8f379e97..00000000 --- a/src/demo/engine/loaders/LoaderUrlDicom.js +++ /dev/null @@ -1,201 +0,0 @@ -/** - * @fileOverview LoaderUrlDicom - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import FileTools from './FileTools'; -import LoadResult from '../LoadResult'; -import Volume from '../Volume'; -import FileLoader from './FileLoader'; -import LoaderDicom from './LoaderDicom'; - -import Texture3D from '../Texture3D'; -import StoreActionType from '../../store/ActionTypes'; -import ModeView from '../../store/ModeView'; -import Modes3d from '../../store/Modes3d'; - - -// ******************************************************** -// Const -// ******************************************************** - -// const DEBUG_PRINT_INDI_SLICE_INFO = false; -// const DEBUG_PRINT_TAGS_INFO = false; - -const NEED_TEXTURE_SIZE_4X = true; - -// ******************************************************** -// Classs -// ******************************************************** -class LoaderUrlDicom { - constructor(store) { - this.m_store = store; - this.m_arrFileNames = null; - this.m_errors = []; - this.m_loaders = []; - this.m_loaderDicom = null; - - this.callbackReadProgress = this.callbackReadProgress.bind(this); - this.callbackReadComplete = this.callbackReadComplete.bind(this); - this.m_fileName = '???'; - } - - /** - * Progress read callback - * - * @param {number ratio01 - ratio in range [0..1] - */ - callbackReadProgress(ratio01) { - const ratioPrc = Math.floor(ratio01 * 100); - const store = this.m_store; - const uiapp = store.uiApp; - if (ratioPrc === 0) { - uiapp.doShowProgressBar('Loading...'); - } - if (ratioPrc >= 99) { - // console.log(`callbackReadProgress. hide on = ${ratio01}`); - uiapp.doHideProgressBar(); - } else { - uiapp.doSetProgressBarRatio(ratioPrc); - } - } // callback progress - - /** - * Invoked after read finished (or may be with error) - * - * @param {number codeResult - one from LoadResult.XXX - */ - callbackReadComplete(codeResult) { - // console.log(`LoaderUrlDicom.callbackReadComplete: code = ${codeResult}`); - if (codeResult !== LoadResult.SUCCESS) { - console.log(`onCompleteFromUrlKtx. Bad result: ${codeResult}`); - const arrErrors = []; - const strErr = LoadResult.getResultString(codeResult); - arrErrors.push(strErr); - this.finalizeFailedLoadedVolume(this.m_volume, this.m_fileName, arrErrors); - return; - } else { - this.finalizeSuccessLoadedVolume(this.m_volume, this.m_fileName); - } - } - - /** - * End action if loading failed - * - * @param {object} vol - destination readed volume - * @param {string} fileNameIn - file name need to display - * @param {object} arrErrors - array of string with error messages - */ - finalizeFailedLoadedVolume(vol, fileNameIn, arrErrors) { - // invoke notification - const store = this.m_store; - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); - store.dispatch({ type: StoreActionType.SET_VOLUME, volume: null }); - store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: arrErrors }); - store.dispatch({ type: StoreActionType.SET_FILENAME, fileName: fileNameIn }); - const uiapp = store.uiApp; - uiapp.doHideProgressBar(); - } - - /** - * On the end of success loading dicom folder - * - * @param {object} vol - destination volume - * @param {string} fileNameIn - short file name for readed - */ - finalizeSuccessLoadedVolume(vol, fileNameIn) { - if (vol.m_dataArray !== null) - { - if (NEED_TEXTURE_SIZE_4X) { - vol.makeDimensions4x(); - } - // invoke notification - const store = this.m_store; - store.dispatch({ type: StoreActionType.SET_VOLUME, volume: vol }); - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); - store.dispatch({ type: StoreActionType.SET_FILENAME, fileName: fileNameIn }); - store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: [] }); - const tex3d = new Texture3D(); - tex3d.createFromRawVolume(vol); - store.dispatch({ type: StoreActionType.SET_TEXTURE3D, texture3d: tex3d }); - store.dispatch({ type: StoreActionType.SET_MODE_VIEW, modeView: ModeView.VIEW_2D }); - store.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); - } - } - - /** - * - * @param {object} arrFileNames - array of file names (with URL) - * @param {bool} fromGoogle - true if use google headers - * - */ - loadFromUrlArray(arrFileNames, fromGoogle) { - if (arrFileNames === undefined) { - console.log('LoaderUrlDicom: no argument in constr'); - } - const tp = typeof arrFileNames; - if (tp !== 'object') { - console.log(`LoaderUrlDicom: bad argument type: ${tp}, but expected object`); - } - this.m_arrFileNames = arrFileNames; - - const fileTools = new FileTools(); - let i; - const numFiles = this.m_arrFileNames.length; - - console.log(`LoaderUrlDicom.loadFromUrlArray: start loading: ${numFiles} files`); - console.log(`LoaderUrlDicom.loadFromUrlArray: from ${arrFileNames[0]} .. to ${arrFileNames[numFiles - 1]} `); - - this.m_loaderDicom = new LoaderDicom(numFiles, false); - - this.m_volume = new Volume(); - const callbackProgress = this.callbackReadProgress; - const callbackComplete = this.callbackReadComplete; - callbackProgress(0.0); - - this.m_loaderDicom.m_numLoadedFiles = numFiles; - this.m_loaderDicom.m_filesLoadedCounter = 0; - this.m_loaderDicom.m_numFailsLoad = 0; - - // declare loaders array - for (let i = 0; i < numFiles; i++) { - this.m_loaderDicom.m_errors[i] = -1; - this.m_loaderDicom.m_loaders[i] = null; - } - - this.m_loaderDicom.m_zDim = numFiles; - for (i = 0; i < numFiles; i++) { - const fileNameUrl = this.m_arrFileNames[i]; - const isValid = fileTools.isValidUrl(fileNameUrl); - if (!isValid) { - console.log(`LoaderUrlDicom.loadFromUrlArray: url is not valid = ${fileNameUrl}`); - return false; - } - - if (i === 0) { - this.m_fileName = fileTools.getFileNameFromUrl(fileNameUrl); - } - - // create loader for cur file - this.m_loaders[i] = new FileLoader(fileNameUrl); - const loader = this.m_loaders[i]; - const okLoader = this.m_loaderDicom.runLoader(this.m_volume, fileNameUrl, - loader, i, callbackProgress, callbackComplete, fromGoogle); - if (!okLoader) { - return false; - } - } // for (i) - // console.log('LoaderUrlDicom.loadFromUrlArray: func finished success'); - return true; - } // end of load from url array - - -} // end class LoaderUrlDicom - -export default LoaderUrlDicom; diff --git a/src/demo/engine/loaders/dicominfo.js b/src/demo/engine/loaders/dicominfo.js deleted file mode 100644 index c97cad52..00000000 --- a/src/demo/engine/loaders/dicominfo.js +++ /dev/null @@ -1,50 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* Dicom info -* @module lib/scripts/loaders/dicominfo -*/ - -/** -* Class @class DicomInfo for volume some important text data render -*/ -class DicomInfo { - constructor() { - this.m_patientName = ''; - this.m_patientDateOfBirth = ''; - this.m_studyDescr = ''; - this.m_studyDate = ''; - this.m_seriesTime = ''; - this.m_seriesDescr = ''; - this.m_bodyPartExamined = ''; - this.m_institutionName = ''; - this.m_operatorsName = ''; - this.m_physicansName = ''; - - this.m_patientId = ''; - this.m_patientGender = ''; - this.m_acquisionTime = ''; - this.m_manufacturerName = ''; - // tags info for each slice. Each entry is DicomSliceInfo - this.m_sliceInfo = []; - } -} - -export default DicomInfo; diff --git a/src/demo/engine/loaders/dicomserie.js b/src/demo/engine/loaders/dicomserie.js deleted file mode 100644 index de7d0bc7..00000000 --- a/src/demo/engine/loaders/dicomserie.js +++ /dev/null @@ -1,31 +0,0 @@ -// -// -// - -import DicomSlice from "./dicomslice"; - -const FLOAT_TOO_LARGE_VALUE = 555555555555.5; - - -class DicomSerie { - constructor(hash) { - console.assert(hash !== undefined); - console.assert(typeof hash === "number", "hash shold be number"); - - this.m_hash = hash; - this.m_slices = []; - this.m_minSlice = +FLOAT_TOO_LARGE_VALUE; - this.m_maxSlice = -FLOAT_TOO_LARGE_VALUE; - } - - addSlice(slice) { - console.assert(slice !== undefined); - console.assert(slice instanceof DicomSlice, "added slice should be DicomSlice object"); - this.m_slices.push(slice); - this.m_minSlice = (slice.m_sliceNumber < this.m_minSlice) ? slice.m_sliceNumber : this.m_minSlice; - this.m_maxSlice = (slice.m_sliceNumber > this.m_maxSlice) ? slice.m_sliceNumber : this.m_maxSlice; - } - -} // end DicomSerie - -export default DicomSerie; diff --git a/src/demo/engine/loaders/dicomsliceinfo.js b/src/demo/engine/loaders/dicomsliceinfo.js deleted file mode 100644 index ba5d7a1e..00000000 --- a/src/demo/engine/loaders/dicomsliceinfo.js +++ /dev/null @@ -1,37 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* Dicom slice info -* @module lib/scripts/loaders/dicomsliceinfo -*/ - -/** -* Class @class DicomSliceInfo slice information -*/ -class DicomSliceInfo { - constructor() { - this.m_sliceName = ''; - this.m_fileName = ''; - // tags info for each slice. Each entry is DicomTagInfo - this.m_tags = []; - } -} - -export default DicomSliceInfo; diff --git a/src/demo/engine/loaders/dicomtaginfo.js b/src/demo/engine/loaders/dicomtaginfo.js deleted file mode 100644 index 0c018c3b..00000000 --- a/src/demo/engine/loaders/dicomtaginfo.js +++ /dev/null @@ -1,36 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* Dicom tag info -* @module lib/scripts/loaders/dicomtaginfo -*/ - -/** -* Class @class DicomTagInfo tag descr -*/ -class DicomTagInfo { - constructor() { - this.m_tag = ''; - this.m_attrName = ''; - this.m_attrValue = ''; - } -} - -export default DicomTagInfo; diff --git a/src/demo/engine/loaders/roipalette.js b/src/demo/engine/loaders/roipalette.js deleted file mode 100644 index b287532f..00000000 --- a/src/demo/engine/loaders/roipalette.js +++ /dev/null @@ -1,746 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -'License'); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -/** -* Nifti file loader -* @module lib/scripts/loaders/roipalette -*/ - -// ****************************************************************** -// imports -// ****************************************************************** - -// ****************************************************************** -// Class -// ****************************************************************** - -export default class RoiPalette { - /** - * Create loader - */ - constructor() { - this.m_palette = [ - { - 'name': 'amygdala', - 'roiColor': '0.247059 0.584314 0.270588 1', - 'roiId': 139, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'amygdala', - 'roiColor': '0.309804 0.929412 0.054902 1', - 'roiId': 118, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'angular gyrus', - 'roiColor': '0.686275 0.231373 0.152941 1', - 'roiId': 19, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'angular gyrus', - 'roiColor': '0.811765 0.486275 0.117647 1', - 'roiId': 159, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'anterior limb of internal capsule', - 'roiColor': '0.309804 0.203922 0.462745 1', - 'roiId': 128, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'anterior limb of internal capsule', - 'roiColor': '0.435294 0.733333 0.027451 1', - 'roiId': 43, - 'position': 'left', - 'isBrain': true, - }, - { - 'roiColor': '0.937255 0.94902 0.513725 1', - 'roiId': 20, - 'name': 'brain stem', - 'isBrain': true, - }, - { - 'name': 'caudate nucleus', - 'roiColor': '0.74902 0.278431 0.141176 1', - 'roiId': 53, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'caudate nucleus', - 'roiColor': '0.184314 0.0745098 0.356863 1', - 'roiId': 39, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'cerebellum', - 'roiColor': '0.811765 0.458824 0.952941 1', - 'roiId': 76, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'cerebellum', - 'roiColor': '0.247059 0.113725 0.843137 1', - 'roiId': 67, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'cingulate region', - 'roiColor': '0.623529 0.45098 0.666667 1', - 'roiId': 7, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'cingulate region', - 'roiColor': '0.937255 0.631373 0.505882 1', - 'roiId': 27, - 'position': 'left', - 'isBrain': true, - }, - { - 'roiColor': '0.937255 0.301961 0.470588 1', - 'roiId': 133, - 'name': 'corpus callosum', - 'isBrain': true, - }, - { - 'name': 'cuneus', - 'roiColor': '0.435294 0.513725 0.768627 1', - 'roiId': 175, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'cuneus', - 'roiColor': '0.937255 0.729412 0.192157 1', - 'roiId': 54, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'fornix', - 'roiColor': '0.937255 0.415686 0.847059 1', - 'roiId': 254, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'fornix', - 'roiColor': '0.811765 0.67451 0.980392 1', - 'roiId': 29, - 'position': 'left', - 'isBrain': true, - }, - { - 'roiColor': '0.247059 0.466667 0.105882 1', - 'roiId': 233, - 'name': 'fourth ventricle', - 'isBrain': true, - }, - { - 'name': 'frontal lobe WM', - 'roiColor': '0.560784 0.290196 0.215686 1', - 'roiId': 17, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'frontal lobe WM', - 'roiColor': '0.498039 0.662745 0.101961 1', - 'roiId': 30, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'globus palladus', - 'roiColor': '0.0588235 0.843137 0.168627 1', - 'roiId': 11, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'globus palladus', - 'roiColor': '0.247059 0.74902 0.447059 1', - 'roiId': 12, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'hippocampal formation', - 'roiColor': '0.498039 0.709804 0.619608 1', - 'roiId': 36, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'hippocampal formation', - 'roiColor': '0.121569 0.4 0.972549 1', - 'roiId': 101, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'inferior frontal gyrus', - 'roiColor': '0.247059 0.85098 0.0666667 1', - 'roiId': 75, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'inferior frontal gyrus', - 'roiColor': '0.937255 0.662745 0.329412 1', - 'roiId': 15, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'inferior occipital gyrus', - 'roiColor': '0.0588235 0.643137 0.643137 1', - 'roiId': 97, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'inferior occipital gyrus', - 'roiColor': '0.247059 0.411765 0.568627 1', - 'roiId': 37, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'inferior temporal gyrus', - 'roiColor': '0.247059 0.00392157 0.796078 1', - 'roiId': 140, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'inferior temporal gyrus', - 'roiColor': '0.87451 0.819608 0.541176 1', - 'roiId': 164, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'insula', - 'roiColor': '0.623529 0.886275 0.356863 1', - 'roiId': 4, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'insula', - 'roiColor': '0.560784 0.698039 0.12549 1', - 'roiId': 108, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'lateral front-orbital gyrus', - 'roiColor': '0.435294 0.501961 0.203922 1', - 'roiId': 6, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'lateral front-orbital gyrus', - 'roiColor': '1 0.8 0.00784314 1', - 'roiId': 90, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'lateral occipitotemporal gyrus', - 'roiColor': '0.0588235 0.027451 0.470588 1', - 'roiId': 99, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'lateral occipitotemporal gyrus', - 'roiColor': '0.937255 0.101961 0.913725 1', - 'roiId': 196, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'lateral ventricle', - 'roiColor': '0.435294 0.176471 0.568627 1', - 'roiId': 8, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'lateral ventricle', - 'roiColor': '0.74902 0.764706 0.247059 1', - 'roiId': 3, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'lingual gyrus', - 'roiColor': '0.435294 0.458824 0.47451 1', - 'roiId': 112, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'lingual gyrus', - 'roiColor': '0.811765 0.0941176 0.301961 1', - 'roiId': 69, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'medial front-orbital gyrus', - 'roiColor': '0.87451 0.364706 0.384314 1', - 'roiId': 1, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'medial front-orbital gyrus', - 'roiColor': '0.811765 0.160784 0.247059 1', - 'roiId': 85, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'medial frontal gyrus', - 'roiColor': '0.435294 0.615686 0.0705882 1', - 'roiId': 114, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'medial frontal gyrus', - 'roiColor': '0.184314 0.372549 0.423529 1', - 'roiId': 9, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'medial occipitotemporal gyrus', - 'roiColor': '0.247059 0.368627 0.211765 1', - 'roiId': 165, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'medial occipitotemporal gyrus', - 'roiColor': '1 0.843137 0.254902 1', - 'roiId': 119, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'middle frontal gyrus', - 'roiColor': '0.623529 0.905882 0.113725 1', - 'roiId': 2, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'middle frontal gyrus', - 'roiColor': '0.686275 0.0901961 0.811765 1', - 'roiId': 50, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'middle occipital gyrus', - 'roiColor': '0.686275 0.933333 0.698039 1', - 'roiId': 63, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'middle occipital gyrus', - 'roiColor': '0.435294 0.0588235 0.964706 1', - 'roiId': 154, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'middle temporal gyrus', - 'roiColor': '0.937255 0.498039 0.67451 1', - 'roiId': 130, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'middle temporal gyrus', - 'roiColor': '0.498039 0.768627 0.439216 1', - 'roiId': 64, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'nucleus accumbens', - 'roiColor': '1 0.807843 0.529412 1', - 'roiId': 25, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'nucleus accumbens', - 'roiColor': '0.0588235 0.65098 0.0509804 1', - 'roiId': 72, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'occipital lobe WM', - 'roiColor': '0.0588235 0.368627 0.552941 1', - 'roiId': 45, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'occipital lobe WM', - 'roiColor': '0.0588235 0.639216 0.839216 1', - 'roiId': 73, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'occipital pole', - 'roiColor': '0.74902 0.494118 0.419608 1', - 'roiId': 132, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'occipital pole', - 'roiColor': '0.247059 0.807843 0.74902 1', - 'roiId': 251, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'parahippocampal gyrus', - 'roiColor': '0.121569 0.847059 0.00392157 1', - 'roiId': 125, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'parahippocampal gyrus', - 'roiColor': '0.247059 0.0705882 0.321569 1', - 'roiId': 18, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'parietal lobe WM', - 'roiColor': '1 0.4 0.223529 1', - 'roiId': 105, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'parietal lobe WM', - 'roiColor': '0.309804 0.678431 0.639216 1', - 'roiId': 57, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'postcentral gyrus', - 'roiColor': '0.560784 0.478431 0.2 1', - 'roiId': 110, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'postcentral gyrus', - 'roiColor': '0.498039 0.576471 0.027451 1', - 'roiId': 74, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'posterior limb of internal capsule inc. cerebral peduncle', - 'roiColor': '1 0.917647 0.576471 1', - 'roiId': 35, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'posterior limb of internal capsule inc. cerebral peduncle', - 'roiColor': '0.435294 0.490196 0.0784314 1', - 'roiId': 34, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'precentral gyrus', - 'roiColor': '0.184314 0.709804 0.615686 1', - 'roiId': 5, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'precentral gyrus', - 'roiColor': '0.87451 0.560784 1 1', - 'roiId': 80, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'precuneus', - 'roiColor': '1 0.654902 0.223529 1', - 'roiId': 32, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'precuneus', - 'roiColor': '1 0 0.211765 1', - 'roiId': 56, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'putamen', - 'roiColor': '1 0.831373 0.227451 1', - 'roiId': 16, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'putamen', - 'roiColor': '0.372549 0.678431 0.32549 1', - 'roiId': 14, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'subthalamic nucleus', - 'roiColor': '0.184314 0.545098 0.619608 1', - 'roiId': 23, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'subthalamic nucleus', - 'roiColor': '0.309804 0.686275 0.243137 1', - 'roiId': 33, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'superior frontal gyrus', - 'roiColor': '0.87451 0.380392 0.768627 1', - 'roiId': 10, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'superior frontal gyrus', - 'roiColor': '1 0.113725 0.396078 1', - 'roiId': 70, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'superior occipital gyrus', - 'roiColor': '0.372549 0.0431373 0.537255 1', - 'roiId': 38, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'superior occipital gyrus', - 'roiColor': '0.623529 0.301961 0.2 1', - 'roiId': 98, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'superior parietal lobule', - 'roiColor': '0.247059 0.843137 0.407843 1', - 'roiId': 88, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'superior parietal lobule', - 'roiColor': '0.87451 0.533333 0.254902 1', - 'roiId': 52, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'superior temporal gyrus', - 'roiColor': '0.498039 0.721569 0.996078 1', - 'roiId': 145, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'superior temporal gyrus', - 'roiColor': '1 0.67451 0.45098 1', - 'roiId': 61, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'supramarginal gyrus', - 'roiColor': '0.87451 0.45098 0.270588 1', - 'roiId': 60, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'supramarginal gyrus', - 'roiColor': '0.623529 0.0235294 0.654902 1', - 'roiId': 41, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'temporal lobe WM', - 'roiColor': '0.498039 0.603922 0.768627 1', - 'roiId': 59, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'temporal lobe WM', - 'roiColor': '0.87451 0.411765 0.368627 1', - 'roiId': 83, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'thalamus', - 'roiColor': '0.0588235 0.796078 0.866667 1', - 'roiId': 203, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'thalamus', - 'roiColor': '0.74902 0.984314 0.341176 1', - 'roiId': 102, - 'position': 'left', - 'isBrain': true, - }, - { - 'roiColor': '0.811765 0.258824 0.823529 1', - 'roiId': 232, - 'name': 'third ventricle', - 'isBrain': true, - }, - { - 'name': 'uncus', - 'roiColor': '0.121569 0.352941 0.196078 1', - 'roiId': 26, - 'position': 'right', - 'isBrain': true, - }, - { - 'name': 'uncus', - 'roiColor': '0.623529 0.117647 0.14902 1', - 'roiId': 62, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'xxx_brain_internal', - 'roiColor': '0.8 0.8 0.1 1', - 'roiId': 150, - 'position': 'left', - 'isBrain': true, - }, - { - 'name': 'xxx_brain_core', - 'roiColor': '0.2 0.8 0.2 1', - 'roiId': 250, - 'position': 'left', - 'isBrain': true, - }, - ]; - this.createBytePalette256(); - } - - /** - * Transform array of objects into uint32 color array with 256 entries - */ - createBytePalette256() { - const PAL_SIZE = 256; - const MAX_PAL_COLOR = 255.0; - const BYTES_PER_COLOR = 4; - const OFFS_0 = 0; - const OFFS_1 = 1; - const OFFS_2 = 2; - const OFFS_3 = 3; - this.m_palette256 = new Uint8Array(PAL_SIZE * BYTES_PER_COLOR); - let i; - // init palette with black colors - for (i = 0; i < PAL_SIZE * BYTES_PER_COLOR; i++) { - this.m_palette256[i] = 0; - } - // load colors - const numPalColors = this.m_palette.length; - for (i = 0; i < numPalColors; i++) { - const strIndexPalette = this.m_palette[i].roiId; - const strColor = this.m_palette[i].roiColor; - const arrColor = strColor.split(' '); - const rCol = Math.floor(parseFloat(arrColor[OFFS_0]) * MAX_PAL_COLOR); - const gCol = Math.floor(parseFloat(arrColor[OFFS_1]) * MAX_PAL_COLOR); - const bCol = Math.floor(parseFloat(arrColor[OFFS_2]) * MAX_PAL_COLOR); - const aCol = 255; - const ind = parseInt(strIndexPalette, 10) * BYTES_PER_COLOR; - this.m_palette256[ind + OFFS_0] = rCol; - this.m_palette256[ind + OFFS_1] = gCol; - this.m_palette256[ind + OFFS_2] = bCol; - this.m_palette256[ind + OFFS_3] = aCol; - } - } - - /** - * Return palette array of objects - */ - getPalette() { - return this.m_palette; - } - - /** - * Return array of uints8 with 256 entries * 4 - */ - getPalette256() { - return this.m_palette256; - } -} diff --git a/src/demo/engine/tools23d/graphics23d.js b/src/demo/engine/tools23d/graphics23d.js deleted file mode 100644 index 6ea86528..00000000 --- a/src/demo/engine/tools23d/graphics23d.js +++ /dev/null @@ -1,494 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* 2d simplest graphics engine -* @module app/scripts/graphics2d/graphics23d -*/ - -import * as THREE from 'three'; - -// import MaterialTex2d from '../gfx/mattex2d'; -// import MaterialColor2d from '../gfx/matcolor2d'; -// import MeshText2D from './meshtext2d'; -// import Line2D from './line2d'; -// import Circle2D from './circle2d'; -import DistanceTool from './distancetool'; -// import AngleTool from './angletool'; -// import AreaTool from './areatool'; -// import ZoomTool from './zoomtool'; -// import RectTool from './recttool'; -// import MoveTool from './movetool'; -// import DeleteTool from './deletetool'; -// import EditTool from './edittool'; -// import TextTool from './texttool'; - -/** @constant {number} SCENE_3D_BACKGROUND_COLOR - backgroudn color for 3d window */ -// const SCENE_2D_BACKGROUND_COLOR = 0xbbbbff; // 0x00 - -/** Possible 2d tools */ -const tools2d = { - INTENSITY: 'intensity', - DISTANCE: 'distance', - ANGLE: 'angle', - AREA: 'area', - RECT: 'rect', - TEXT: 'text', - GRAD: 'grad', - COBR: 'cobr', - BIFI: 'bifi', - ZOOM: 'zoom', - DELETE: 'delete', - EDIT: 'edit', -}; - -/** Class Graphics2d is used for simple debug style 2d render */ -export default class Graphics23d { - - /** - * Initialize render - * @param (object) container - object container for 3d rendering - * @param (int) width - 2d canvas width - * @param (int) height - 2d canvas height - * @return {Object} Intsance of this class (singleton) - */ - constructor(scene, width, height) { - this.m_width = width; - this.m_height = height; - this.m_material = null; - this.m_mesh = null; - console.log(`Graphics2d create size = ${width} * ${height}`); - this.m_scene = scene; - - this.m_materialsTex2d = null; - this.m_material = null; - - //construct edit and move tools - this.m_zoom = 1; - this.m_savePosX = 0; - this.m_savePosY = 0; - this.m_posX = 0; - this.m_posY = 0; - this.m_move = false; - this.m_wProjScreen = width; - this.m_hProjScreen = height; - - this.m_showTileTexture = false; - - // prepare for render 2d lines on screen - const xw = 1.0 / width; - const yw = 1.0 / height; - const TWICE = 2.0; - this.m_lineWidth = TWICE * ((xw > yw) ? xw : yw); - this.m_lineWidth = 0.002; - - this.m_textTime = -1000; - this.m_text = null; - this.m_toolType = tools2d.DISTANCE; - //this.m_toolType = tools2d.INTENSITY; - this.m_distanceTool = new DistanceTool(this.m_scene, this.m_lineWidth); - /*this.m_angleTool = new AngleTool(this.m_scene, this.m_lineWidth); - this.m_areaTool = new AreaTool(this.m_scene, this.m_lineWidth); - this.m_rectTool = new RectTool(this.m_scene, this.m_lineWidth); - this.m_textTool = new TextTool(this.m_scene); - this.m_zoomTool = new ZoomTool(this.m_zoom); - this.m_moveTool = new MoveTool(this.m_zoom, this.m_posX, this.m_posY); - this.m_deleteTool = new DeleteTool(this.m_scene, this.m_lineWidth); - this.m_editTool = new EditTool(this.m_scene, this.m_lineWidth); - */ - //this.m_distanceTool.test(); - } // end of constructor - - set2dToolType(toolType) { - this.m_toolType = toolType; - } - - /** - * Callback on file loaded - */ - onFileLoaded() { - this.m_distanceTool.clearLines(); - this.m_angleTool.clearLines(); - this.m_areaTool.clearLines(); - this.m_rectTool.clearLines(); - this.m_textTool.clear(); - this.m_deleteTool.clearLines(); - this.m_editTool.clearLines(); - } - - clear2DTools() { - this.m_distanceTool.clearLines(); - this.m_angleTool.clearLines(); - this.m_areaTool.clearLines(); - this.m_rectTool.clearLines(); - this.m_textTool.clear(); - this.m_deleteTool.clearLines(); - this.m_editTool.clearLines(); - } - - default2DTools() { - this.m_zoom = 1; - this.m_posX = 0; - this.m_posY = 0; - this.m_savePosX = 0; - this.m_savePosY = 0; - this.m_materialsTex2d.m_uniforms.posX.value = this.m_posX; - this.m_materialsTex2d.m_uniforms.posY.value = this.m_posY; - this.m_materialsTex2d.m_uniforms.zoom.value = this.m_zoom; - this.updateLines(); - } - - fov2Tan(fov) { - const HALF = 0.5; - return Math.tan(THREE.Math.degToRad(HALF * fov)); - } - - tan2Fov(tan) { - const TWICE = 2.0; - return THREE.Math.radToDeg(Math.atan(tan)) * TWICE; - } - - /** - * Keyboard event handler - * @param (number) keyCode - keyboard code - * @param (Boolean) debug - true if debug false otherwise - */ - onKeyDown(keyCode, debug) { - // console.log(`onKeyDown: ${keyCode}`); - // const KEY_CODE_G = 71; - if (debug) { - // if (keyCode === KEY_CODE_G) { - // this.debugShowSliceFrom2dTiles(); - // } - } - } - - /** - * Mouse events handler - * xScr, yScr in [0..1] is normalized mouse coordinate in screen - */ - onMouseDown(xScr, yScr) { - if ((this.m_volumeData === null) || (this.m_volumeHeader === null)) { - return; - } - if ((xScr > this.m_wProjScreen) || (yScr > this.m_hProjScreen)) { - // out of image - return; - } - if (this.m_levelSetMode) { - return; - } - - const TWICE = 2.0; - const xt = xScr * TWICE - 1.0; - const yt = yScr * TWICE - 1.0; - //const yt = (1.0 - yScr) * TWICE - 1.0; - - switch (this.m_toolType) { - case tools2d.DISTANCE: - this.m_distanceTool.onMouseDown(xt, yt, this.m_zoom, this.m_posX * (this.m_wProjScreen), - this.m_posY * (this.m_hProjScreen)); - break; - case tools2d.ANGLE: - this.m_angleTool.onMouseDown(xt, yt, this.m_zoom, this.m_posX * (this.m_wProjScreen), - this.m_posY * (this.m_hProjScreen)); - break; - case tools2d.TEXT: - this.m_textTool.onMouseDown(xt, yt, this.m_zoom, this.m_posX * (this.m_wProjScreen), - this.m_posY * (this.m_hProjScreen)); - break; - case tools2d.AREA: - this.m_areaTool.onMouseDown(xt, yt, this.m_zoom, this.m_posX * (this.m_wProjScreen), - this.m_posY * (this.m_hProjScreen)); - break; - case tools2d.RECT: - this.m_rectTool.onMouseDown(xt, yt, this.m_zoom, this.m_posX * (this.m_wProjScreen), - this.m_posY * (this.m_hProjScreen)); - break; - case tools2d.GRAD: - break; - case tools2d.COBR: - /*this.m_contrastBrightTool.onMouseDown(xt, yt); - this.m_materialsTex2d.m_uniforms.contrast.value = this.m_contrastBrightTool.m_contrast; - this.m_materialsTex2d.m_uniforms.brightness.value = this.m_contrastBrightTool.m_brightness; - this.m_materialsTex2d.m_uniforms.COBRflag.value = this.m_contrastBrightTool.m_COBRflag;*/ - break; - case tools2d.BIFI: - /*this.m_filterTool.onMouseDown(xt, yt); - this.m_materialsTex2d.m_uniforms.sigma.value = this.m_filterTool.m_sigma; - this.m_materialsTex2d.m_uniforms.sigmaB.value = this.m_filterTool.m_sigmaB; - this.m_materialsTex2d.m_uniforms.BIFIflag.value = this.m_filterTool.m_BIFIflag;*/ - break; - case tools2d.ZOOM: - this.m_move = true; - this.m_moveTool.onMouseDown(xt, yt); - break; - case tools2d.DELETE: - this.m_deleteTool.onMouseDown(xt, yt, this.m_distanceTool.m_distances, this.m_angleTool.m_angles, - this.m_rectTool.m_areas, this.m_areaTool.m_distances, this.m_textTool.m_textArr, - this.m_distanceTool.m_vertexes, this.m_angleTool.m_vertexes, this.m_rectTool.m_vertexes, - this.m_areaTool.m_vertexes2, this.m_areaTool.m_last_lengths, this.m_areaTool.m_vertexes, this.m_areaTool, - this.m_textTool.m_vertexes); - console.log(`${this.m_areaTool.last_length}`); - break; - case tools2d.EDIT: - this.m_editTool.onMouseDown(); - break; - default: - console.log('Unexpected 2d tool'); - break; - } - } - - /** - * Mouse events handler - * xScr, yScr in [0..1] is normalized mouse coordinate in screen - */ - onMouseUp(xScr, yScr) { - if ((this.m_volumeData === null) || (this.m_volumeHeader === null)) { - return; - } - if ((xScr > this.m_wProjScreen) || (yScr > this.m_hProjScreen)) { - // out of image - return; - } - const TWICE = 2.0; - const xt = xScr * TWICE - 1.0; - const yt = yScr * TWICE - 1.0; - //const yt = (1.0 - yScr) * TWICE - 1.0; - - if (this.m_levelSetMode) { - // only for first step of level set - if (this.m_levelSetCircle !== null) { - this.clearLevelSetCenter(); - } - this.drawLevelSetCenter(xt, yt); - return; - } - switch (this.m_toolType) { - case tools2d.DISTANCE: - break; - case tools2d.ANGLE: - break; - case tools2d.AREA: - break; - case tools2d.RECT: - break; - case tools2d.TEXT: - break; - case tools2d.COBR: - break; - case tools2d.BIFI: - break; - case tools2d.ZOOM: - this.m_move = false; - this.m_moveTool.onMouseUp(); - this.m_savePosX = this.m_posX; - this.m_savePosY = this.m_posY; - break; - case tools2d.DELETE: - break; - case tools2d.EDIT: - this.m_editTool.onMouseUp(); - break; - default: - console.log('Unexpected 2d tool'); - break; - } - } - - /** - * Mouse move event handler - * @param (float) xScr - normalized mouse x coordinate in screen - * @param (float) yScr - normalized mouse y coordinate in screen - */ - onMouseMove(xScr, yScr) { - if ((this.m_volumeData === null) || (this.m_volumeHeader === null)) { - return; - } - if ((xScr > this.m_wProjScreen) || (yScr > this.m_hProjScreen)) { - // out of image - return; - } - const TWICE = 2.0; - const xt = xScr * TWICE - 1.0; - const yt = yScr * TWICE - 1.0; - //const yt = (1.0 - yScr) * TWICE - 1.0; - - switch (this.m_toolType) { - case tools2d.DISTANCE: - this.m_distanceTool.onMouseMove(xt, yt, this.m_zoom); - break; - case tools2d.ANGLE: - this.m_angleTool.onMouseMove(xt, yt); - break; - case tools2d.AREA: - this.m_areaTool.onMouseMove(xt, yt); - break; - case tools2d.RECT: - this.m_rectTool.onMouseMove(xt, yt, this.m_zoom); - break; - case tools2d.TEXT: - break; - case tools2d.GRAD: - break; - case tools2d.COBR: - /*this.m_contrastBrightTool.onMouseMove(xt, yt); - this.m_materialsTex2d.m_uniforms.contrast.value = this.m_contrastBrightTool.m_contrast; - this.m_materialsTex2d.m_uniforms.brightness.value = this.m_contrastBrightTool.m_brightness; - this.m_materialsTex2d.m_uniforms.COBRflag.value = this.m_contrastBrightTool.m_COBRflag;*/ - break; - case tools2d.BIFI: - /*this.m_filterTool.onMouseMove(xt, yt); - this.m_materialsTex2d.m_uniforms.sigma.value = this.m_filterTool.m_sigma; - this.m_materialsTex2d.m_uniforms.sigmaB.value = this.m_filterTool.m_sigmaB; - this.m_materialsTex2d.m_uniforms.BIFIflag.value = this.m_filterTool.m_BIFIflag;*/ - break; - case tools2d.ZOOM: - if (this.m_move) { - this.updateMove(xt, yt); - } - break; - case tools2d.DELETE: - this.m_deleteTool.onMouseMove(xt, yt, this.m_zoom, this.m_distanceTool.m_distances, this.m_angleTool.m_angles, - this.m_rectTool.m_areas, this.m_areaTool.m_distances, this.m_textTool.m_textArr); - break; - case tools2d.EDIT: // TO DO: add text tool - this.m_editTool.onMouseMove(xt, yt, this.m_zoom, this.m_distanceTool.m_distances, this.m_angleTool.m_angles, - this.m_rectTool.m_areas, this.m_areaTool.m_distances, this.m_areaTool, this.m_textTool, - this.m_posX * (this.m_wProjScreen), this.m_posY * (this.m_hProjScreen)); - //this.m_areaTool.updateVertexes(this.m_zoom, this.m_posX * (this.m_wProjScreen), this.m_posY * - // (this.m_hProjScreen)); - this.m_distanceTool.updateVertexes(this.m_zoom, this.m_posX * (this.m_wProjScreen), - this.m_posY * (this.m_hProjScreen)); - this.m_angleTool.updateVertexes(this.m_zoom, this.m_posX * (this.m_wProjScreen), - this.m_posY * (this.m_hProjScreen)); - break; - default: - console.log('Unexpected 2d tool'); - break; - } - } - - /** - * Mouse events handler - * xScr, yScr in [0..1] is normalized mouse coordinate in screen - */ - onMouseWheel(wheelDeltaY) { - switch (this.m_toolType) { - case tools2d.DISTANCE: - break; - case tools2d.ANGLE: - break; - case tools2d.AREA: - break; - case tools2d.RECT: - break; - case tools2d.TEXT: - break; - case tools2d.COBR: - break; - case tools2d.BIFI: - break; - case tools2d.ZOOM: - this.m_zoomTool.onMouseWheel(wheelDeltaY); - this.updateZoom(); - this.createMarkLinesAndText(); - break; - case tools2d.DELETE: - break; - case tools2d.EDIT: - break; - default: - console.log('Unexpected 2d tool'); - break; - } - } - - updateLines() { - this.m_distanceTool.updateLines(this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); - this.m_angleTool.updateLines(this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); - this.m_rectTool.updateLines(this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); - this.m_textTool.updateAll(this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); - this.m_areaTool.updateLines(this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); - this.m_deleteTool.updateLines(this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); - this.m_editTool.updateLines(this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); - } - - updateMove(xt, yt) { - const TWICE = 2; - const delta = (TWICE - TWICE * this.m_zoom); - const coord = this.m_moveTool.onMouseMove(xt, yt); - if (((this.m_savePosX + coord.x) <= Math.abs(delta)) && ((this.m_savePosX + coord.x) > 0)) { - this.m_posX = this.m_savePosX + coord.x; - this.m_materialsTex2d.m_uniforms.posX.value = this.m_posX; - } else if (this.m_savePosX + coord.x > Math.abs(delta)) { - this.m_posX = Math.abs(delta); - this.m_materialsTex2d.m_uniforms.posX.value = this.m_posX; - } else { - this.m_posX = 0; - this.m_materialsTex2d.m_uniforms.posX.value = this.m_posX; - } - - if (((this.m_savePosY + coord.y) >= (-1) * Math.abs(delta)) && ((this.m_savePosY + coord.y) < 0)) { - this.m_posY = this.m_savePosY + coord.y; - this.m_materialsTex2d.m_uniforms.posY.value = this.m_posY; - } else if (this.m_savePosY + coord.y < (-1) * Math.abs(delta)) { - this.m_posY = (-1) * Math.abs(delta); - this.m_materialsTex2d.m_uniforms.posY.value = this.m_posY; - } else { - this.m_posY = 0; - this.m_materialsTex2d.m_uniforms.posY.value = this.m_posY; - } - this.updateLines(); - } - - updateZoom() { - const TWICE = 2; - this.m_materialsTex2d.m_uniforms.zoom.value = this.m_zoomTool.m_zoom; - this.m_zoom = this.m_zoomTool.m_zoom; - const delta = (TWICE - TWICE * this.m_zoom); - if (this.m_posX > delta) { - this.m_posX = delta; - this.m_materialsTex2d.m_uniforms.posX.value = this.m_posX; - } - if ((this.m_posY < (-1) * delta) && (this.m_posY < 0)) { - this.m_posY = (-1) * delta; - this.m_materialsTex2d.m_uniforms.posY.value = this.m_posY; - } - this.updateLines(); - } - - updateText() { - //this.m_pickTool.update(); - } - - static shortenString(str) { - const MAX_ITEM_LEN = 20; - const SHORT_ITEM_PART = 5; - let strRet = str; - const pnl = str.length; - if (pnl > MAX_ITEM_LEN) { - const strBegin = str.substring(0, SHORT_ITEM_PART + 1); - const strEnd = str.substring(pnl - SHORT_ITEM_PART, pnl); - strRet = `${strBegin}...${strEnd}`; - } - return strRet; - } -} diff --git a/src/demo/engine/tools2d/ToolZoom.js b/src/demo/engine/tools2d/ToolZoom.js deleted file mode 100644 index 14ea290f..00000000 --- a/src/demo/engine/tools2d/ToolZoom.js +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @fileOverview ToolZoom - * @author Epam - * @version 1.0.0 - */ - - -// ********************************************** -// Imports -// ********************************************** - -// import React from 'react'; -// import { connect } from 'react-redux'; - -import StoreActionType from '../../store/ActionTypes'; - -// ********************************************** -// Class -// ********************************************** - -class ToolZoom { - constructor(objGra) { - this.m_objGraphics2d = objGra; - this.m_wScreen = 0; - this.m_hScreen = 0; - - this.setScreenDim = this.setScreenDim.bind(this); - this.onMouseWheel = this.onMouseWheel.bind(this); - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseUp = this.onMouseUp.bind(this); - this.onMouseMove = this.onMouseMove.bind(this); - - this.state = { - mouseDown: false, - xMouse: 0, - yMouse: 0, - }; - } - - setScreenDim(wScr, hScr) { - this.m_wScreen = wScr; - this.m_hScreen = hScr; - } - - onMouseDown(xScr, yScr) { - this.state.mouseDown = true; - this.state.xMouse = xScr; - this.state.yMouse = yScr; - } - - onMouseUp() { - this.state.mouseDown = false; - } - - onMouseMove(store, xScr, yScr) { - if (this.state.mouseDown) { - const dx = xScr - this.state.xMouse; - const dy = yScr - this.state.yMouse; - - this.state.xMouse = xScr; - this.state.yMouse = yScr; - - - const zoom = store.render2dZoom; - const dxMove = (dx / this.m_wScreen) * zoom; - const dyMove = (dy / this.m_hScreen) * zoom; - // console.log(`dxyMove = ${dxMove}, ${dyMove}`); - const xPos = store.render2dxPos - dxMove; - const yPos = store.render2dyPos - dyMove; - - // check new 2d transform is valid (not clipped) - if ((xPos >= 0.0) && (xPos + zoom <= 1.0) && - (yPos >= 0.0) && (yPos + zoom <= 1.0)) { - store.dispatch({ type: StoreActionType.SET_2D_X_POS, render2dxPos: xPos }); - store.dispatch({ type: StoreActionType.SET_2D_Y_POS, render2dyPos: yPos }); - const gra = store.graphics2d; - gra.forceUpdate(); - } - } - } - - onMouseWheel(store, evt) { - const delta = Math.max(-1, Math.min(1, (evt.deltaY || -evt.detail))); - const MULT_STEP = 0.04; - const step = -delta * MULT_STEP; - // console.log(`onMouseWheel. step = ${step}`); - - const zoom = store.render2dZoom; - let zoomNew = zoom + step; - if (zoomNew > 1.0) { - zoomNew -= step; - } - if (zoomNew <= 0.0) { - zoomNew += step; - } - if (zoomNew !== zoom) { - const xPos = store.render2dxPos; - const yPos = store.render2dyPos; - const xPosNew = xPos - step * 0.5; - const yPosNew = yPos - step * 0.5; - // console.log(`onMouseWheel. zoomNew = ${zoomNew}, xyPos = ${xPosNew},${yPosNew}`); - store.dispatch({ type: StoreActionType.SET_2D_ZOOM, render2dZoom: zoomNew }); - store.dispatch({ type: StoreActionType.SET_2D_X_POS, render2dxPos: xPosNew }); - store.dispatch({ type: StoreActionType.SET_2D_Y_POS, render2dyPos: yPosNew }); - - const gra = store.graphics2d; - gra.forceUpdate(); - } - } // end on mouse wheel - -} -// export default connect(store => store)(ToolZoom); -export default ToolZoom; diff --git a/src/demo/engine/utils/Hash.js b/src/demo/engine/utils/Hash.js deleted file mode 100644 index 974cd8dd..00000000 --- a/src/demo/engine/utils/Hash.js +++ /dev/null @@ -1,46 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ -/** -* Get string hash -* @module demo/engine/utils/hash -*/ -// absolute imports -/** -* Class Hash to calc string hash -* @class Hash -*/ -class Hash { - - static getHash(strInp) { - const ROT = 27; - const len = strInp.length; - let hash = len * 53; - for (let i = 0; i < len; i++) { - const val = strInp.charCodeAt(i); - hash = hash * (val ^ 137211941); - // bit rotate - hash = (hash << ROT) | (hash >> (32 - ROT)); - // mask - hash &= 0x3fffffff; - } - return hash; - } -} - -export default Hash; diff --git a/src/demo/store/ModeView.js b/src/demo/store/ModeView.js deleted file mode 100644 index 8f527bcb..00000000 --- a/src/demo/store/ModeView.js +++ /dev/null @@ -1,10 +0,0 @@ -const ModeView = { - VIEW_NA: -1, - VIEW_MPR: 0, - VIEW_2D: 1, - VIEW_3D_LIGHT: 2, - VIEW_3D: 3, - VIEW_COUNT: 4 -}; - -export default ModeView; diff --git a/src/demo/store/Modes2d.js b/src/demo/store/Modes2d.js deleted file mode 100644 index 44e2ae5b..00000000 --- a/src/demo/store/Modes2d.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @fileOverview Modes2d - * @author Epam - * @version 1.0.0 - */ - -const Modes2d = { - NA: -1, - SAGGITAL: 0, - CORONAL: 1, - TRANSVERSE: 2 -}; - -export default Modes2d; \ No newline at end of file diff --git a/src/demo/store/Modes3d.js b/src/demo/store/Modes3d.js deleted file mode 100644 index ea618f7c..00000000 --- a/src/demo/store/Modes3d.js +++ /dev/null @@ -1,10 +0,0 @@ - -const Modes3d = { - NA: -1, - ISO: 0, - RAYCAST: 1, - RAYFAST: 2, - EREASER: 3 -}; - -export default Modes3d; diff --git a/src/demo/store/Modes3droi.js b/src/demo/store/Modes3droi.js deleted file mode 100644 index 32c57d82..00000000 --- a/src/demo/store/Modes3droi.js +++ /dev/null @@ -1,8 +0,0 @@ - -const Modes3droi = { - NA: -1, - ISO: 0, - RAYCAST: 1, -}; - -export default Modes3droi; diff --git a/src/demo/store/Store.js b/src/demo/store/Store.js deleted file mode 100644 index 5605192e..00000000 --- a/src/demo/store/Store.js +++ /dev/null @@ -1,123 +0,0 @@ -// - -import StoreActionType from './ActionTypes'; -import ModeView from './ModeView'; -import Modes2d from './Modes2d'; -import Modes3d from './Modes3d'; -import Modes3droi from './Modes3droi'; - -// -// Global app settings with initial configuration -// -export const initialState = { - isLoaded: false, - fileName: 'brain.ktx', - volumeSet: null, - volumeIndex: 0, - texture3d: null, - modeView: ModeView.VIEW_2D, - mode2d: Modes2d.TRANSVERSE, - slider2d: 0.5, - slider3d_r: 0.09, - slider3d_g: 0.3, - slider3d_b: 0.46, - mode3d: Modes3d.RAYCAST, - mode3droi: Modes3droi.RAYCAST, - sliderOpacity: 0.53, - sliderIsosurface: 0.46, - sliderBrightness: 0.56, - sliderCut: 1.0, - sliderQuality: 0.35, - sliderErRadius: 50.0, - sliderErDepth: 50.0, - volumeRenderer: null, - indexTools2d: 0, - render2dZoom: 1.0, - render2dxPos: 0.0, - render2dyPos: 0.0, - graphics2d: null, - uiApp: null, - dicomInfo: null, - isTool3D: false, - sliderContrast3D: 0.0, - arrErrors: [], - dicomSeries: [], - loaderDicom: null, -}; -// -// App reducer -// -const medReducer = (state = initialState, action) => { - switch (action.type) { - case StoreActionType.SET_IS_LOADED: - return Object.assign({}, state, { isLoaded: action.isLoaded }); - case StoreActionType.SET_FILENAME: - return Object.assign({}, state, { fileName: action.fileName }); - case StoreActionType.SET_VOLUME_SET: - return Object.assign({}, state, { volumeSet: action.volumeSet }); - case StoreActionType.SET_VOLUME_INDEX: - return Object.assign({}, state, { volumeIndex: action.volumeIndex }); - case StoreActionType.SET_TEXTURE3D: - return Object.assign({}, state, { texture3d: action.texture3d }); - case StoreActionType.SET_MODE_VIEW: - return Object.assign({}, state, { modeView: action.modeView }); - case StoreActionType.SET_MODE_2D: - return Object.assign({}, state, { mode2d: action.mode2d }); - case StoreActionType.SET_SLIDER_2D: - return Object.assign({}, state, { slider2d: action.slider2d }); - case StoreActionType.SET_MODE_3D: - return Object.assign({}, state, { mode3d: action.mode3d }); - case StoreActionType.SET_MODE_3Droi: - return Object.assign({}, state, { mode3droi: action.mode3droi }); - case StoreActionType.SET_SLIDER_3DR: - return Object.assign({}, state, { slider3d_r: action.slider3d_r }); - case StoreActionType.SET_SLIDER_3DG: - return Object.assign({}, state, { slider3d_g: action.slider3d_g }); - case StoreActionType.SET_SLIDER_3DB: - return Object.assign({}, state, { slider3d_b: action.slider3d_b }); - case StoreActionType.SET_SLIDER_Opacity: - return Object.assign({}, state, { sliderOpacity: action.sliderOpacity }); - case StoreActionType.SET_SLIDER_Isosurface: - return Object.assign({}, state, { sliderIsosurface: action.sliderIsosurface }); - case StoreActionType.SET_SLIDER_ErRadius: - return Object.assign({}, state, { sliderErRadius: action.sliderErRadius }); - case StoreActionType.SET_SLIDER_ErDepth: - return Object.assign({}, state, { sliderErDepth: action.sliderErDepth }); - case StoreActionType.SET_VOLUME_Renderer: - return Object.assign({}, state, { volumeRenderer: action.volumeRenderer }); - case StoreActionType.SET_SLIDER_Brightness: - return Object.assign({}, state, { sliderBrightness: action.sliderBrightness }); - case StoreActionType.SET_SLIDER_Cut: - return Object.assign({}, state, { sliderCut: action.sliderCut }); - case StoreActionType.SET_SLIDER_Quality: - return Object.assign({}, state, { sliderQuality: action.sliderQuality }); - case StoreActionType.SET_2D_TOOLS_INDEX: - return Object.assign({}, state, { indexTools2d: action.indexTools2d }); - case StoreActionType.SET_2D_ZOOM: - return Object.assign({}, state, { render2dZoom: action.render2dZoom }); - case StoreActionType.SET_2D_X_POS: - return Object.assign({}, state, { render2dxPos: action.render2dxPos }); - case StoreActionType.SET_2D_Y_POS: - return Object.assign({}, state, { render2dyPos: action.render2dyPos }); - case StoreActionType.SET_GRAPHICS_2D: - return Object.assign({}, state, { graphics2d: action.graphics2d }); - case StoreActionType.SET_UI_APP: - return Object.assign({}, state, { uiApp: action.uiApp }); - case StoreActionType.SET_DICOM_INFO: - return Object.assign({}, state, { dicomInfo: action.dicomInfo }); - case StoreActionType.SET_IS_TOOL3D: - return Object.assign({}, state, { isTool3D: action.isTool3D }); - case StoreActionType.SET_SLIDER_Contrast3D: - return Object.assign({}, state, { sliderContrast3D: action.sliderContrast3D }); - case StoreActionType.SET_ERR_ARRAY: - return Object.assign({}, state, { arrErrors: action.arrErrors }); - case StoreActionType.SET_DICOM_SERIES: - return Object.assign({}, state, { dicomSeries: action.dicomSeries }); - case StoreActionType.SET_LOADER_DICOM: - return Object.assign({}, state, { loaderDicom: action.loaderDicom }); - default: - return state; - } -} - -export default medReducer; diff --git a/src/demo/ui/UiAbout.js b/src/demo/ui/UiAbout.js deleted file mode 100644 index c1c0e137..00000000 --- a/src/demo/ui/UiAbout.js +++ /dev/null @@ -1,114 +0,0 @@ -/** - * @fileOverview UiAbout - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { Button } from 'react-bootstrap'; -import { OverlayTrigger, Tooltip } from 'react-bootstrap'; -import { Nav, Modal } from 'react-bootstrap' - -import packageJson from '../../../package.json'; -import UiSkelAni from './UiSkelAni'; - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiAbout dialog - */ -export default class UiAbout extends React.Component { - constructor(props) { - super(props); - this.state = { - modalShow: false - }; - this.onShow = this.onShow.bind(this); - this.onHide = this.onHide.bind(this); - } - - onShow() { - this.setState({ modalShow: true }); - } - - onHide() { - this.setState({ modalShow: false }); - } - - render() { - - const strVer = packageJson.version; - const strName = packageJson.name; - const strDescription = packageJson.description; - const strAuthor = packageJson.author; - const strYear = packageJson.year; - - const strButtonOnly = - <Button onClick={this.onShow} variant="secondary"> - <i className="fa fa-question-circle"></i> - About - </Button>; - const strButtonWithTrigger = - <OverlayTrigger - key="about" - placement="bottom" - overlay = { - <Tooltip> - See detailed information about this app - </Tooltip> - } - > - <Button onClick={this.onShow} variant="secondary"> - <i className="fa fa-question-circle"></i> - About - </Button> - </OverlayTrigger>; - - const strBtnDynamic = (this.state.modalShow) ? strButtonOnly : strButtonWithTrigger; - - - const strAbout = - <Nav.Item> - - {strBtnDynamic} - - <Modal show={this.state.modalShow} onHide={this.onHide} > - <Modal.Title> - {strName} - </Modal.Title> - <Modal.Header> - <Modal.Body className="text-center"> - <UiSkelAni /> - <p> - {strDescription} - </p> - <p> - <b>Version: </b> {strVer} - </p> - <p> - <b>Copyright: </b> {strYear} {strAuthor} - </p> - - </Modal.Body> - </Modal.Header> - - <Modal.Footer> - <Button onClick={this.onHide} variant="secondary"> - Close - </Button> - </Modal.Footer> - - </Modal> - </Nav.Item> - return strAbout; - - } -} - diff --git a/src/demo/ui/UiApp.js b/src/demo/ui/UiApp.js deleted file mode 100644 index 9e723bb9..00000000 --- a/src/demo/ui/UiApp.js +++ /dev/null @@ -1,205 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import { Nav, Navbar, Container, ProgressBar, Row, Col } from 'react-bootstrap'; -import StoreActionType from '../store/ActionTypes'; - -import UiMain from './UiMain'; -import UiOpenMenu from './UiOpenMenu'; -import UiViewMode from './UiViewMode'; -import UiAbout from './UiAbout'; -import UiSaveMenu from './UiSaveMenu'; -import UiReportMenu from './UiReportMenu'; -import UiFilterMenu from './UiFilterMenu'; -import UiModalText from './UiModalText'; -import UiModalAlert from './UiModalAlert'; -import UiErrConsole from './UiErrConsole'; -import ModeView from '../store/ModeView'; - -import BrowserDetector from '../engine/utils/BrowserDetector'; - -class UiApp extends React.Component { - constructor(props) { - super(props); - - this.onShowModalText = this.onShowModalText.bind(this); - this.onHideModalText = this.onHideModalText.bind(this); - - this.onShowModalAlert = this.onShowModalAlert.bind(this); - this.onHideModalAlert = this.onHideModalAlert.bind(this); - - this.doShowProgressBar = this.doShowProgressBar.bind(this); - this.doHideProgressBar = this.doHideProgressBar.bind(this); - this.doSetProgressBarRatio = this.doSetProgressBarRatio.bind(this); - - this.m_modalText = null; - this.m_store = null; - this.m_fileNameOnLoad = ''; - - this.state = { - showModalText: false, - showProgressBar: false, - progressBarRatio: 55, - showModalAlert: false, - strAlertTitle: '???', - strAlertText: '???', - strProgressMessage: 'Loading...', - }; - } - - UNSAFE_componentWillMount() { - let fileNameOnLoad = ''; - const strSearch = window.location.search; - if (strSearch.length > 0) { - const strReg = /\\?url=(\S+)/; - const arr = strSearch.match(strReg); - if (arr === null) { - console.log('arguments should be in form: ?url=www.xxx.yy/zz/ww'); - return; - } - fileNameOnLoad = arr[1]; - const regA = /^((ftp|http|https):\/\/)?(([\S]+)\.)?([\S]+)\.([A-z]{2,})(:\d{1,6})?\/[\S]+/; - const regB = /(ftp|http|https):\/\/([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)(:([\d]+))?\/([\S]+)/; - const isValidA = fileNameOnLoad.match(regA); - const isValidB = fileNameOnLoad.match(regB); - if ((isValidA === null) && (isValidB === null)) { - console.log(`Not valid URL = ${fileNameOnLoad}`); - return; - } - this.m_fileNameOnLoad = fileNameOnLoad; - } - } - - componentDidMount() { - const store = this.m_store; - if (store === null) { - console.log('UiApp. componentDidMount. store is NULL'); - } - store.dispatch({ type: StoreActionType.SET_UI_APP, uiApp: this }); - - // browser detector - const browserDetector = new BrowserDetector(); - this.isWebGl20supported = browserDetector.checkWebGlSupported(); - if (!this.isWebGl20supported) { - this.setState({ strAlertTitle: 'Browser compatibility problem detected' }); - this.setState({ strAlertText: 'This browser not supported WebGL 2.0. Application functinality is decreased and app can be unstable' }); - this.onShowModalAlert(); - } else { - const isValidBro = browserDetector.checkValidBrowser(); - if (!isValidBro) { - this.setState({ strAlertTitle: 'Browser compatibility problem detected' }); - this.setState({ strAlertText: 'App is specially designed for Chrome/Firefox/Opera/Safari browsers' }); - this.onShowModalAlert(); - } - } - } - - onShowModalText() { - this.setState({ showModalText: true }); - } - - onHideModalText() { - this.setState({ showModalText: false }); - } - - onShowModalAlert() { - this.setState({ showModalAlert: true }); - } - - onHideModalAlert() { - this.setState({ showModalAlert: false }); - } - - doShowProgressBar(strProgressMsg) { - if ((strProgressMsg === undefined) || (strProgressMsg === null)) { - console.log('doShowProgressBar: need argument - strProgressMsg'); - return; - } - this.setState({ strProgressMessage: strProgressMsg }); - this.setState({ showProgressBar: true }); - } - - doHideProgressBar() { - // console.log('doHideProgressBar'); - this.setState({ showProgressBar: false }); - } - - /** - * - * @param {number} ratio - in [0..99] range - */ - doSetProgressBarRatio(ratio) { - // console.log(`doSetProgressBarRatio: ${ratio}`); - - // show progress bar if it was hidden but need to show some non-0, non-100 progress - if ((ratio >= 0) && (ratio <= 99)) { - if (this.state.showProgressBar === false) { - this.setState({ showProgressBar: true }); - } - } - this.setState({ progressBarRatio: ratio }); - } - - /** - * Main component render func callback - */ - render() { - const store = this.props; - this.m_store = store; - const isLoaded = store.isLoaded; - const fileName = store.fileName; - const arrErrorsLoadedd = store.arrErrors; - - const strMessageOnMenu = (isLoaded) ? 'File: ' + fileName : 'Press Open button to load scene'; - - const strProgressMsg = this.state.strProgressMessage; - - const objPrgBarVis = - <Row> - <Col xs xl sm md lg="12" style={{ width: '100%' } }> - {strProgressMsg} - <ProgressBar animated variant="success" - now={this.state.progressBarRatio} label={`${this.state.progressBarRatio}%`} /> - </Col> - </Row> - const objProgressBar = (this.state.showProgressBar) ? objPrgBarVis : <p></p>; - - const jsxNavBarReact = - <Container fluid="true" style={{ height:'100%', minHeight:'100%' }} > - <Navbar bg="light" variant="light" expand="lg" > - <Navbar.Brand> - <UiAbout /> - </Navbar.Brand> - <Navbar.Toggle aria-controls="basic-navbar-nav" /> - <Navbar.Collapse id="basic-navbar-nav"> - <Nav className="mr-auto"> - - <Navbar.Text className="d-none d-sm-block"> - {strMessageOnMenu} - </Navbar.Text> - - <UiOpenMenu fileNameOnLoad={this.m_fileNameOnLoad} /> - - <UiSaveMenu /> - <UiReportMenu /> - {(store.modeView === ModeView.VIEW_2D) ? <UiFilterMenu /> : <p></p>} - {(isLoaded && this.isWebGl20supported) ? <UiViewMode /> : <p></p>} - </Nav> - </Navbar.Collapse> - - </Navbar> - {objProgressBar} - {(isLoaded) ? <UiMain /> : <p></p>} - {(arrErrorsLoadedd.length > 0) ? <UiErrConsole /> : <p></p>} - <UiModalText stateVis={this.state.showModalText} - onHide={this.onHideModalText} onShow={this.onShowModalText} /> - <UiModalAlert stateVis={this.state.showModalAlert} - onHide={this.onHideModalAlert} onShow={this.onShowModalAlert} - title={this.state.strAlertTitle} text={this.state.strAlertText} /> - </Container>; - - return jsxNavBarReact; - } -} - -export default connect(store => store)(UiApp); diff --git a/src/demo/ui/UiCtrl2d.js b/src/demo/ui/UiCtrl2d.js deleted file mode 100644 index 773d80fe..00000000 --- a/src/demo/ui/UiCtrl2d.js +++ /dev/null @@ -1,246 +0,0 @@ -/** - * @fileOverview UiCtrl2d - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -// special css for NoUiSlioder -import 'nouislider/distribute/nouislider.css'; - -import React from 'react'; -import { connect } from 'react-redux'; -import { Card, ButtonGroup, Button } from 'react-bootstrap'; -import { OverlayTrigger, Tooltip } from 'react-bootstrap'; - -import Nouislider from 'react-nouislider'; - -import Modes2d from '../store/Modes2d'; -import StoreActionType from '../store/ActionTypes'; - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiCtrl2d some text later... - */ -class UiCtrl2d extends React.Component { - /** - * @param {object} props - props from up level object - */ - constructor(props) { - super(props); - this.onModeSaggital = this.onModeSaggital.bind(this); - this.onModeCoronal = this.onModeCoronal.bind(this); - this.onModeTransverse = this.onModeTransverse.bind(this); - this.onMode = this.onMode.bind(this); - this.m_updateEnable = true; - } - - onMode(indexMode) { - const store = this.props; - const gra2d = store.graphics2d; - - this.m_updateEnable = true; - store.dispatch({ type: StoreActionType.SET_MODE_2D, mode2d: indexMode }); - gra2d.m_mode2d = indexMode; - gra2d.clear(); - - store.dispatch({ type: StoreActionType.SET_2D_ZOOM, render2dZoom: 1.0 }); - store.dispatch({ type: StoreActionType.SET_2D_X_POS, render2dxPos: 0.0 }); - store.dispatch({ type: StoreActionType.SET_2D_Y_POS, render2dyPos: 0.0 }); - - // build render image - gra2d.forceUpdate(); - // render just builded image - gra2d.forceRender(); - } - - onModeSaggital() { - this.onMode(Modes2d.SAGGITAL); - } - - onModeCoronal() { - this.onMode(Modes2d.CORONAL); - } - - onModeTransverse() { - this.onMode(Modes2d.TRANSVERSE); - } - - onChangeSliderSlice() { - if (this.refs === undefined) { - return; - } - this.m_updateEnable = false; - let val = 0.0; - const aval = this.refs.slider1.slider.get(); - if (typeof (aval) === 'string') { - val = Number.parseFloat(aval); - // console.log(`onSlider. val = ${val}`); - // convert slider value from [0.. ?dim] to [0..1] - const store = this.props; - const mode2d = store.mode2d; - const volSet = store.volumeSet; - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - let xDim = 0, yDim = 0, zDim = 0; - if (vol !== null) { - xDim = vol.m_xDim; - yDim = vol.m_yDim; - zDim = vol.m_zDim; - } - - let slideRangeMax = 0; - if (mode2d === Modes2d.SAGGITAL) { - slideRangeMax = xDim; - } else if (mode2d === Modes2d.CORONAL) { - slideRangeMax = yDim; - } else if (mode2d === Modes2d.TRANSVERSE) { - slideRangeMax = zDim; - } - const valNormalizedTo01 = val / slideRangeMax; - store.dispatch({ type: StoreActionType.SET_SLIDER_2D, slider2d: valNormalizedTo01 }); - // clear all 2d tools - const gra2d = store.graphics2d; - gra2d.clear(); - - // re-render (and rebuild segm if present) - gra2d.forceUpdate(); - - // render just builded image - gra2d.forceRender(); - } - } - - shouldComponentUpdate() { - // return false; - // return true; - return this.m_updateEnable; - } - - /** - * Main component render func callback - */ - render() { - const store = this.props; - const valSlider = store.slider2d; - const mode2d = store.mode2d; - - const strSlider1 = 'slider1'; - - const varSag = (mode2d === Modes2d.SAGGITAL) ? 'primary' : 'secondary'; - const varCor = (mode2d === Modes2d.CORONAL) ? 'primary' : 'secondary'; - const varTra = (mode2d === Modes2d.TRANSVERSE) ? 'primary' : 'secondary'; - - let xDim = 0, yDim = 0, zDim = 0; - const volSet = store.volumeSet; - if (volSet.getNumVolumes() > 0) { - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - if (vol !== null) { - xDim = vol.m_xDim; - yDim = vol.m_yDim; - zDim = vol.m_zDim; - } - } // if more 0 volumes - // slider maximum value is depend on current x or y or z 2d mode selection - let slideRangeMax = 0; - if (mode2d === Modes2d.SAGGITAL) { - slideRangeMax = xDim - 1; - } else if (mode2d === Modes2d.CORONAL) { - slideRangeMax = yDim - 1; - } else if (mode2d === Modes2d.TRANSVERSE) { - slideRangeMax = zDim - 1; - } - const rangeDescr = { - 'min': 0, - 'max': slideRangeMax - }; - - const wArr = [Math.floor(valSlider * slideRangeMax)]; - const valToolTps = true; - // special formatter interface for show only intefer numbers - // in slider: - // provide two conversion functions: - // to (int -> string) - // from (string -> int) - const formatterInt = { - to(valNum) { - const i = Math.floor(valNum); - return i.toString(); - }, - from(valStr) { - return parseInt(valStr); - } - }; - - const jsxSlider = (slideRangeMax > 0) ? - <ul className="list-group list-group-flush"> - <li className="list-group-item"> - <p> Select </p> - < Nouislider onSlide={this.onChangeSliderSlice.bind(this)} ref={strSlider1} - range={rangeDescr} - start={wArr} step={1} - format={formatterInt} - tooltips={valToolTps} /> - </li> - </ul> : <p></p>; - - const jsxSliceSelector = (slideRangeMax > 0) ? - <Card.Body> - <ButtonGroup className="mr-2" aria-label="Ctrl2d group"> - <OverlayTrigger key="zx" placement="bottom" overlay={ - <Tooltip> - Show slices along x axis - </Tooltip> - }> - <Button variant={varSag} onClick={this.onModeSaggital} > - Saggital - </Button> - </OverlayTrigger> - - <OverlayTrigger key="zy" placement="bottom" overlay={ - <Tooltip> - Show slices along y axis - </Tooltip> - }> - <Button variant={varCor} onClick={this.onModeCoronal} > - Coronal - </Button> - </OverlayTrigger> - - <OverlayTrigger key="za" placement="bottom" overlay={ - <Tooltip> - Show slices along z axis - </Tooltip> - }> - <Button variant={varTra} onClick={this.onModeTransverse} > - Transverse - </Button> - </OverlayTrigger> - </ButtonGroup> - </Card.Body> : <p></p> - - const jsxRenderControls = - <Card> - <Card.Header> - Plane (slice) view - </Card.Header> - {jsxSliceSelector} - {jsxSlider} - </Card> - return jsxRenderControls; - } -} - -export default connect(store => store)(UiCtrl2d); diff --git a/src/demo/ui/UiCtrl3d.js b/src/demo/ui/UiCtrl3d.js deleted file mode 100644 index 58b94237..00000000 --- a/src/demo/ui/UiCtrl3d.js +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @fileOverview UiCtrl3dLight - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -// special css for NoUiSlioder -import 'nouislider/distribute/nouislider.css'; - -import React from 'react'; -import { connect } from 'react-redux'; -import Nouislider from 'react-nouislider'; -import StoreActionType from '../store/ActionTypes'; -import UiHistogram from './UiHistogram'; - -/** - * Class UiCtrl3dLight some text later... - */ -class UiCtrl3d extends React.Component { - /** - * @param {object} props - props from up level object - */ - constructor(props) { - super(props); - this.transferFuncCallback = this.transferFuncCallback.bind(this); - this.m_updateEnable = true; - } - - onChangeSliderOpacity() { - this.m_updateEnable = false; - const aval = this.refs.sliderOpacity.slider.get(); - const store = this.props; - store.dispatch({ type: StoreActionType.SET_SLIDER_Opacity, sliderOpacity: Number.parseFloat(aval) }); - } - - shouldComponentUpdate() { - return this.m_updateEnable; - //return true; - } - - transferFuncCallback(transfFuncObj) { - const i = transfFuncObj.m_indexMoved; - const x = transfFuncObj.m_handleX[i]; - const y = transfFuncObj.m_handleY[i]; - console.log(`moved point[${i}] = ${x}, ${y} `); - const vr = this.props.volumeRenderer; - vr.updateTransferFuncTexture(transfFuncObj.m_handleX, transfFuncObj.m_handleY); - } - - /** - * Main component render func callback - */ - render() { - const store = this.props; - const sliderOpacity = store.sliderOpacity; - const wArrOpacity = [sliderOpacity]; - - const volSet = store.volumeSet; - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - - const NEED_TANSF_FUNC = true; - const funcTra = (NEED_TANSF_FUNC) ? this.transferFuncCallback : undefined; - const funcTrTex = (store.volumeRenderer === null) ? null : store.volumeRenderer; - //const store = this.props; - //const mode3d = store.mode3d; - - - // console.log(`UiCtr3dLight. render. flags = ${bCheckedSag}+${bCheckedCor}+${bCheckedTra}`); - - // btn-default active - - const jsxRenderControls = - <ul className="list-group" > - <li className="list-group-item"> - <UiHistogram volume={vol} transfFunc={funcTra} transfFuncUpdate={funcTrTex}/> - </li> - <li className="list-group-item"> - <p> Opacity </p> - <Nouislider onSlide={this.onChangeSliderOpacity.bind(this)} ref={'sliderOpacity'} - range={{ min: 0.0, max: 1.0 }} - start={wArrOpacity} connect={[true, false]} step={0.02} tooltips={true} /> - </li> - </ul> - return jsxRenderControls; - - } -} - -export default connect(store => store)(UiCtrl3d); diff --git a/src/demo/ui/UiCtrl3dLight.js b/src/demo/ui/UiCtrl3dLight.js deleted file mode 100644 index 2b63f759..00000000 --- a/src/demo/ui/UiCtrl3dLight.js +++ /dev/null @@ -1,226 +0,0 @@ -/** - * @fileOverview UiCtrl3dLight - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -// special css for NoUiSlioder -import 'nouislider/distribute/nouislider.css'; - -import React from 'react'; -import { connect } from 'react-redux'; -import { Card, ListGroup, Button, ButtonGroup } from 'react-bootstrap'; -import { OverlayTrigger, Tooltip } from 'react-bootstrap'; - -//import Nouislider from 'react-nouislider'; - -import Modes3d from '../store/Modes3d'; -import Modes3droi from '../store/Modes3droi'; -import StoreActionType from '../store/ActionTypes'; -import UiTF from './UiTF'; -import UiTFroi from './UiTFroi'; -import UiRoiSelect from './UiRoiSelect'; - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiCtrl3dLight some text later... - */ -class UiCtrl3dLight extends React.Component { - /** - * @param {object} props - props from up level object - */ - constructor(props) { - super(props); - this.onModeA = this.onModeA.bind(this); - this.onModeB = this.onModeB.bind(this); - this.onModeC = this.onModeC.bind(this); - this.onModeD = this.onModeD.bind(this); - this.onMode = this.onMode.bind(this); - this.onModeroi = this.onModeroi.bind(this); - this.m_updateEnable = true; - } - - onMode(indexMode) { - this.m_updateEnable = true; - this.props.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: indexMode }); - const store = this.props; - store.volumeRenderer.offAmbientTextureMode(); - } - - onModeA() { - this.onMode(Modes3d.ISO); - this.props.volumeRenderer.setEraserMode(false); - } - - onModeB() { - this.onMode(Modes3d.RAYCAST); - this.props.volumeRenderer.setEraserMode(false); - } - - onModeC() { - this.onMode(Modes3d.RAYFAST); - this.props.volumeRenderer.setEraserMode(false); - } - - onModeD() { - this.onMode(Modes3d.EREASER); - this.props.volumeRenderer.setEraserMode(true); - } - - onModeroi(indexMode) { - this.m_updateEnable = true; - this.props.dispatch({ type: StoreActionType.SET_MODE_3Droi, mode3droi: indexMode }); - } - - onModeAroi() { - this.onModeroi(Modes3droi.ISO); - } - - onModeBroi() { - this.onModeroi(Modes3droi.RAYCAST); - } - - shouldComponentUpdate() { - return this.m_updateEnable; - //return true; - } - - /** - * Callback, invoked after any ROI setup array change - * - * @param {object} arrayRoi - array of objects with props: id, name, selected, see (UiRoiSelect) - */ - setRoi(arrayRoi) { - // This is demo code: - // just print all states of all roi elements, according to the UI - const numElems = arrayRoi.length; - const store = this.props; - const MAXELEM = 256; - const selectedROI = new Uint8Array(MAXELEM); - //const BYTES_IN_COLOR = 4; - for (let i = 0; i < MAXELEM; i++) { - selectedROI[i] = false; - } - for (let i = 0; i < numElems; i++) { - const id = arrayRoi[i].id; - const name = arrayRoi[i].name; - const isSel = arrayRoi[i].selected; - selectedROI[id] = isSel; - console.log(`setRoi: [${i}]: name=${name} id= ${id} isSel=${isSel} `); - } - store.volumeRenderer.updateSelectedRoiMap(selectedROI); - } - - /** - * Main component render func callback - */ - render() { - const store = this.props; - const mode3d = store.mode3d; - // const mode3droi = store.mode3droi; - - const strA = (mode3d === Modes3d.ISO) ? 'primary' : 'secondary'; - const strB = (mode3d === Modes3d.RAYCAST) ? 'primary' : 'secondary'; - const strC = (mode3d === Modes3d.RAYFAST) ? 'primary' : 'secondary'; - const strD = (mode3d === Modes3d.ERASER) ? 'primary' : 'secondary'; - // const strAroi = (mode3droi === Modes3droi.ISO) ? 'primary' : 'secondary'; - // const strBroi = (mode3droi === Modes3droi.RAYCAST) ? 'primary' : 'secondary'; - - const jsxRenderControls = - <div> - <Card> - <Card.Title> - 3d mode selection - </Card.Title> - <Card.Body> - - <ButtonGroup> - <OverlayTrigger key="iso" placement="bottom" overlay={ - <Tooltip> - Show just barrier value surface, 1st ray intersection - </Tooltip> - }> - <Button variant={strA} onClick={this.onModeA} > - Iso - </Button> - </OverlayTrigger> - - <OverlayTrigger key="vre" placement="bottom" overlay={ - <Tooltip> - Show complete 3d volumetric rendering - </Tooltip> - }> - <Button variant={strB} onClick={this.onModeB} > - Vol - </Button> - </OverlayTrigger> - - <OverlayTrigger key="maxproj" placement="bottom" overlay={ - <Tooltip> - Show maximum projection rendering - </Tooltip> - }> - <Button variant={strC} onClick={this.onModeC} > - MaxPrj - </Button> - </OverlayTrigger> - - <OverlayTrigger key="volera" placement="bottom" overlay={ - <Tooltip> - Special volume eraser tool - </Tooltip> - }> - <Button variant={strD} onClick={this.onModeD} > - Eraser - </Button> - </OverlayTrigger> - - </ButtonGroup> - - </Card.Body> - </Card> - <UiTF /> - </div> - - const jsxROI = - <ListGroup as="ul" variant="flush"> - - <ListGroup.Item as="li"> - <UiRoiSelect setRoiFunc={this.setRoi}/> - </ListGroup.Item> - - <UiTFroi/> - </ListGroup> - let indx = 0; - - const volSet = store.volumeSet; - if (volSet.getNumVolumes() > 0) { - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - - const FOUR = 4; - if (vol.m_bytesPerVoxel === FOUR) { - indx = 1; - } - } // end if more 0 volumes - const jsxArray = [jsxRenderControls, jsxROI]; - const jsxRet = jsxArray[indx]; - return jsxRet; - - } -} - -export default connect(store => store)(UiCtrl3dLight); - diff --git a/src/demo/ui/UiErrConsole.js b/src/demo/ui/UiErrConsole.js deleted file mode 100644 index efadc60b..00000000 --- a/src/demo/ui/UiErrConsole.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @fileOverview UiErrConsole - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; - -import { Container, ListGroup } from 'react-bootstrap'; - - - -// ******************************************************** -// Const -// ******************************************************** - - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiErrConsole some text later... - */ -class UiErrConsole extends React.Component { - /** - * Main component render func callback - */ - render() { - const store = this.props; - const arrErr = store.arrErrors; - const jsx = <Container> - Errors during read - <ListGroup> - {arrErr.map((d, i) => { - const strErr = d; - const strKey = `key_${i}`; - return <ListGroup.Item key={strKey} > {strErr} </ListGroup.Item>; - })} - </ListGroup> - </Container>; - return jsx; - } -} -export default connect(store => store)(UiErrConsole); diff --git a/src/demo/ui/UiFilterMenu.js b/src/demo/ui/UiFilterMenu.js deleted file mode 100644 index 7b8ae9e4..00000000 --- a/src/demo/ui/UiFilterMenu.js +++ /dev/null @@ -1,451 +0,0 @@ -/** - * @fileOverview UiFilterMenu - * @author Epam - * @version 1.0.0 - */ - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; -import { NavDropdown } from 'react-bootstrap'; -import LungsFillTool from '../engine/actvolume/lungsfill/lft'; - -import ActiveVolume from '../engine/actvolume/actvol'; -import StoreActionType from '../store/ActionTypes'; -import Texture3D from '../engine/Texture3D'; -import ModeView from '../store/ModeView'; -import Modes3d from '../store/Modes3d'; - -import SobelEdgeDetector from '../engine/imgproc/Sobel'; -import UiModalBilateral from './UiModalBilateral'; - - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiFilterMenu some text later... - */ -class UiFilterMenu extends React.Component { - // invoked after render - constructor(props) { - super(props); - this.onButtonLungsSeg = this.onButtonLungsSeg.bind(this); - this.onLungsFillerCallback = this.onLungsFillerCallback.bind(this); - this.onButtonDetectBrain = this.onButtonDetectBrain.bind(this); - this.onSkullRemoveCallback = this.onSkullRemoveCallback.bind(this); - this.onButtonSobel = this.onButtonSobel.bind(this); - this.onSobelCallback = this.onSobelCallback.bind(this); - this.onButtonBilateral = this.onButtonBilateral.bind(this); - - this.showModalBilateral = this.showModalBilateral.bind(this); - this.hideModalBilateral = this.hideModalBilateral.bind(this); - this.state = { - showModalBilateral: false, - }; - - - //this.callbackProgressFun = this.callbackProgressFun.bind(this); - } - - /* - callbackProgressFun(ratio01) { - // console.log(`callbackReadProgress = ${ratio01}`); - const store = this.props; - const uiapp = store.uiApp; - const ratioPrc = Math.floor(ratio01 * 100); - if (ratioPrc === 0) { - uiapp.doShowProgressBar('reading...'); - } - if (ratioPrc >= 99) { - // console.log(`callbackReadProgress. hide on = ${ratio01}`); - uiapp.doHideProgressBar(); - } else { - uiapp.doSetProgressBarRatio(ratioPrc); - } - } // callback progress - */ - onButtonLungsSeg() { - //evt.preventDefault(); - const store = this.props; - const volSet = store.volumeSet; - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - - if ((vol === undefined) || (vol === null)) { - console.log('onButtonDetectBrain: no volume!'); - return; - } - const xDim = vol.m_xDim; - const yDim = vol.m_yDim; - const zDim = vol.m_zDim; - if (xDim * yDim * zDim < 1) { - console.log(`onButtonDetectBrain: bad volume! dims = ${xDim}*${yDim}*${zDim}`); - return; - } - const ONE = 1; - if (vol.m_bytesPerVoxel !== ONE) { - console.log('onButtonDetectBrain: supported only 1bpp volumes'); - return; - } - - this.lungsFiller = new LungsFillTool(vol); - //const callbackProgress = this.callbackProgressFun; - //lungsFiller.run(callbackProgress); - const uiApp = store.uiApp; - uiApp.doShowProgressBar('lungsFiller...'); - uiApp.doSetProgressBarRatio(0.0); - const SK_REM_DELAY_MSEC = 200; - this.m_timerId = setTimeout(this.onLungsFillerCallback, SK_REM_DELAY_MSEC); - //store.volumeRenderer.volumeUpdater.createUpdatableVolumeTex(store.volume, false, null); - } - - onLungsFillerCallback() { - const store = this.props; - const ratioUpdate = this.lungsFiller.m_ratioUpdate; - console.log(`onLungsFillerCallback: iter counter = ${ratioUpdate}`); - const uiApp = store.uiApp; - uiApp.doSetProgressBarRatio(ratioUpdate); - - const isFinished = this.lungsFiller.run(); - - if (isFinished) { - console.log('`onSkullRemoveCallback: iters finished!'); - uiApp.doHideProgressBar(); - clearInterval(this.m_timerId); - this.m_timerId = 0; - // store.graphics2d.renderScene(); - } - // update render - store.graphics2d.forceUpdate(); - // next update timer - if (!isFinished) { - const SK_REM_DELAY_MSEC = 200; - this.m_timerId = setTimeout(this.onLungsFillerCallback, SK_REM_DELAY_MSEC); - } - } - - // on sobel - onButtonSobel() { - // get globals - const store = this.props; - - const volSet = store.volumeSet; - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - - if ((vol === undefined) || (vol === null)) { - console.log('onButtonSobel: no volume!'); - return; - } - this.m_vol = vol; - const xDim = vol.m_xDim; - const yDim = vol.m_yDim; - const zDim = vol.m_zDim; - if (xDim * yDim * zDim < 1) { - console.log(`onButtonSobel: bad volume! dims = ${xDim}*${yDim}*${zDim}`); - return; - } - // let volTextureSrc = vol.m_dataArray; - const ONE = 1; - if (vol.m_bytesPerVoxel !== ONE) { - console.log('onButtonSobel: supported only 1bpp volumes'); - return; - } - - console.log('onButtonSobel: start sobel...'); - //const xyzDim = xDim * yDim * zDim; - //const volTextureDst = new Uint8Array(xyzDim); - - const sobel = new SobelEdgeDetector(); - sobel.start(vol); - this.m_sobel = sobel; - - const uiApp = store.uiApp; - uiApp.doShowProgressBar('Apply sobel edge detector...'); - uiApp.doSetProgressBarRatio(0.0); - - const SOBEL_UPDATE_DELAY_MSEC = 150; - this.m_timerId = setTimeout(this.onSobelCallback, SOBEL_UPDATE_DELAY_MSEC); - - } // end onButtonSobel - - // callback for periodicallt invoke sobel 3d volume filtering - onSobelCallback() { - this.m_sobel.update(); - - const store = this.props; - - let ratioUpdate = this.m_sobel.getRatio(); - ratioUpdate = (ratioUpdate < 1.0) ? ratioUpdate : 1.0; - ratioUpdate *= 100; - ratioUpdate = Math.floor(ratioUpdate); - // console.log('ratio = ' + ratioUpdate.toString() ); - - const uiApp = store.uiApp; - uiApp.doSetProgressBarRatio(ratioUpdate); - - const isFinished = this.m_sobel.isFinished(); - - if (isFinished) { - console.log('`onSobelCallback: iters finished!'); - uiApp.doHideProgressBar(); - - clearInterval(this.m_timerId); - this.m_timerId = 0; - - const volSet = store.volumeSet; - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - - // normalize dst - this.m_sobel.normalizeDstImage(); - - // copy result pixels into source - const xDim = vol.m_xDim; - const yDim = vol.m_yDim; - const zDim = vol.m_zDim; - const xyzDim = xDim * yDim * zDim; - const pixelsDst = this.m_sobel.getPixelsDst() - for (let i = 0; i < xyzDim; i++) { - vol.m_dataArray[i] = Math.floor(pixelsDst[i]); - } // for i - this.m_sobel.stop(); - - // rebuild 3d data - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: volSet }); - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); - const tex3d = new Texture3D(); - tex3d.createFromRawVolume(vol); - store.dispatch({ type: StoreActionType.SET_TEXTURE3D, texture3d: tex3d }); - store.dispatch({ type: StoreActionType.SET_MODE_VIEW, modeView: ModeView.VIEW_2D }); - store.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); - } // if finished - // update render - store.graphics2d.forceUpdate(); - // next update timer - if (!isFinished) { - const SOBEL_UPDATE_DELAY_MSEC = 150; - this.m_timerId = setTimeout(this.onSobelCallback, SOBEL_UPDATE_DELAY_MSEC); - } - } // end onSobelCallback - - // - // on Bilateral - // - onButtonBilateral() { - this.showModalBilateral(); - } - - // - // detect brain segmentation - // - onButtonDetectBrain() { - // get globals - const store = this.props; - - const volSet = store.volumeSet; - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - - if ((vol === undefined) || (vol === null)) { - console.log('onButtonDetectBrain: no volume!'); - return; - } - const xDim = vol.m_xDim; - const yDim = vol.m_yDim; - const zDim = vol.m_zDim; - if (xDim * yDim * zDim < 1) { - console.log(`onButtonDetectBrain: bad volume! dims = ${xDim}*${yDim}*${zDim}`); - return; - } - let volTextureSrc = vol.m_dataArray; - const ONE = 1; - if (vol.m_bytesPerVoxel !== ONE) { - console.log('onButtonDetectBrain: supported only 1bpp volumes'); - return; - } - - // non-proportional scale for too non-squared volumes - // TODO:... - /* - const TWICE = 2; - if (zDim < xDim / TWICE) { - const xNew = xDim >> 1; - const yNew = yDim >> 1; - const zNew = zDim << 1; - const volTexNew = Graphics2d.rescale(xDim, yDim, zDim, volTextureSrc, xNew, yNew, zNew); - volTextureSrc = volTexNew; - xDim = xNew; yDim = yNew; - zDim = zNew; - this.m_engine2d.m_volumeHeader.m_pixelWidth = xDim; - this.m_engine2d.m_volumeHeader.m_pixelHeight = yDim; - this.m_engine2d.m_volumeHeader.m_pixelDepth = zDim; - } - */ - const xyzDim = xDim * yDim * zDim; - const volTextureDst = new Uint8Array(xyzDim); - const NEED_LOG = true; - const CREATE_TYPE = ActiveVolume.REMOVE_SKULL; - const actVolume = new ActiveVolume(); - this.m_actVolume = actVolume; - - const uiApp = store.uiApp; - uiApp.doShowProgressBar('Remove skull...'); - uiApp.doSetProgressBarRatio(0.0); - - this.m_geoRender = actVolume.skullRemoveStart(xDim, yDim, zDim, - volTextureSrc, volTextureDst, CREATE_TYPE, NEED_LOG); - const SK_REM_DELAY_MSEC = 10; - this.m_timerId = setTimeout(this.onSkullRemoveCallback, SK_REM_DELAY_MSEC); - - // let isRoiVolume = false; - if (CREATE_TYPE === ActiveVolume.CREATE_MASK) { - /* - // now create argb texture with intensity and roi - isRoiVolume = true; - const newDataArray = this.combineWithRoiTexture(xDim, yDim, zDim, volTextureSrc, volTextureDst); - - // start create data for render - this.m_engine2d.m_volumeData = newDataArray; - - // create header for ARGB data (4 bytes per voxel, not 1 byte) - const KTX_GL_RGBA = 0x1908; - const KTX_UNSIGNED_BYTE = 0x1401; - const header = { - m_pixelWidth: xDim, - m_pixelHeight: yDim, - m_pixelDepth: zDim, - m_glType: KTX_UNSIGNED_BYTE, - m_glTypeSize: 1, - m_glFormat: KTX_GL_RGBA, - m_glInternalFormat: KTX_GL_RGBA, - m_glBaseInternalFormat: KTX_GL_RGBA, - }; - this.m_engine2d.m_volumeHeader = header; - */ - } else if (CREATE_TYPE === ActiveVolume.REMOVE_SKULL) { - // vol.m_dataArray = volTextureDst; - } - - /* - store.dispatch({ type: StoreActionType.SET_VOLUME, volume: vol }); - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); - const tex3d = new Texture3D(); - tex3d.createFromRawVolume(vol); - store.dispatch({ type: StoreActionType.SET_TEXTURE3D, texture3d: tex3d }); - store.dispatch({ type: StoreActionType.SET_MODE_VIEW, modeView: ModeView.VIEW_2D }); - store.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); - - // update render - store.graphics2d.forceUpdate(); - */ - } - - onSkullRemoveCallback() { - const store = this.props; - const iterCounter = this.m_actVolume.m_updateCounter; - // console.log(`onSkullRemoveCallback: iter counter = ${iterCounter}`); - - const maxCounter = this.m_actVolume.m_numPredSteps; - let ratioUpdate = iterCounter / maxCounter; - ratioUpdate = (ratioUpdate < 1.0) ? ratioUpdate : 1.0; - ratioUpdate *= 100; - - const uiApp = store.uiApp; - uiApp.doSetProgressBarRatio(ratioUpdate); - - const isFinished = this.m_actVolume.skullRemoveUpdate(this.m_geoRender); - - if (isFinished) { - console.log('`onSkullRemoveCallback: iters finished!'); - - uiApp.doHideProgressBar(); - - clearInterval(this.m_timerId); - this.m_timerId = 0; - this.m_actVolume.skullRemoveStop(this.m_geoRender); - - // perform finalize skull remove - const volSet = store.volumeSet; - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - - const volTextureDst = this.m_actVolume.m_volTexDst; - vol.m_dataArray = volTextureDst; - - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: volSet }); - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); - const tex3d = new Texture3D(); - tex3d.createFromRawVolume(vol); - store.dispatch({ type: StoreActionType.SET_TEXTURE3D, texture3d: tex3d }); - store.dispatch({ type: StoreActionType.SET_MODE_VIEW, modeView: ModeView.VIEW_2D }); - store.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); - } - // update render - store.graphics2d.forceUpdate(); - // next update timer - if (!isFinished) { - const SK_REM_DELAY_MSEC = 10; - this.m_timerId = setTimeout(this.onSkullRemoveCallback, SK_REM_DELAY_MSEC); - } - } - - componentDidMount() { - } - - showModalBilateral() { - this.setState({ showModalBilateral: true }); - } - - hideModalBilateral() { - this.setState({ showModalBilateral: false }); - // console.log('onModalSaveNiftiHide...'); - } - - // - render() { - const store = this.props; - const isLoaded = store.isLoaded; - - const strDisabled = (isLoaded) ? false : true; - const jsxFilterMenu = - <NavDropdown id="save-nav-dropdown" - disabled={strDisabled} - title={ - <div style={{ display: 'inline-block' }}> - <i className="fas fa-broom"></i> - Filter - </div> - } > - <NavDropdown.Item href="#actionLungsSeg" onClick={evt => this.onButtonLungsSeg(evt)}> - <i className="fas fa-cloud"></i> - Lungs segmentation - </NavDropdown.Item> - <NavDropdown.Item href="#actionDataectBrain" onClick={evt => this.onButtonDetectBrain(evt)}> - <i className="fas fa-brain"></i> - Auto detect brain - </NavDropdown.Item> - <NavDropdown.Item href="#actionSobel" onClick={evt => this.onButtonSobel(evt)}> - Sobel filter - </NavDropdown.Item> - <NavDropdown.Item href="#actionBilateral" onClick={evt => this.onButtonBilateral(evt)}> - Bilateral (denoise or smooth) - </NavDropdown.Item> - <UiModalBilateral stateVis={this.state.showModalBilateral} onHide={this.hideModalBilateral} /> - </NavDropdown>; - - return jsxFilterMenu; - } -} - -export default connect(store => store)(UiFilterMenu); - diff --git a/src/demo/ui/UiFilterMenu.test.js b/src/demo/ui/UiFilterMenu.test.js deleted file mode 100644 index 2880a91f..00000000 --- a/src/demo/ui/UiFilterMenu.test.js +++ /dev/null @@ -1,102 +0,0 @@ -// ******************************************************** -// Imports -// ******************************************************** - -import Volume from '../engine/Volume'; -import SobelEdgeDetector from '../engine/imgproc/Sobel'; -import GaussSmoother from '../engine/imgproc/Gauss'; - -// ******************************************************** -// Tests -// ******************************************************** - -describe('UiFilterMenuTests', () => { - - it('testGaussOnSmallVolume', () => { - // create simple small volume - const SZ = 16; - const HALF_SZ = SZ / 2; - const volume = new Volume(); - volume.createEmptyBytesVolume(SZ, SZ, SZ); - let offDst = 0; - const pixelsSrc = volume.m_dataArray; - for (let z = 0; z < SZ; z++) { - for (let y = 0; y < SZ; y++) { - for (let x = 0; x < SZ; x++) { - pixelsSrc[offDst++] = (z < HALF_SZ) ? 0 : 255; - } - } - } - // apply gauss - const NEED_HW = false; - const gauss = new GaussSmoother(NEED_HW); - const kernelSize = 2; - const sigma = kernelSize / 6.0; - gauss.start(volume, kernelSize, sigma); - while (!gauss.isFinished()) { - gauss.update(); - } - // gauss.normalizeDstImage(); - const pixelsDst = gauss.getPixelsDst(); - // check some pixels - const xOff = HALF_SZ; - const yOff = HALF_SZ * SZ; - const xyDim = SZ * SZ; - let valPrev = -1; - for (let z = 0; z < SZ; z++) { - // const srcVal = pixelsSrc[xOff + yOff + z * xyDim]; - const val = pixelsDst[xOff + yOff + z * xyDim]; - // console.log('src val / gauss val = ' + srcVal.toString() + ' / ' + val.toString()); - expect(val >= valPrev).toBeTruthy(); - valPrev = val; - if (z <= 2) { - expect(val === 0).toBeTruthy(); - } - if (z >= SZ - 2) { - expect(val === 255).toBeTruthy(); - } - } // for z - gauss.stop(); - // console.log('gauss test completed on a small volume'); - }); - - it('testSobelOnSmallVolume', () => { - const SZ = 16; - const HALF_SZ = SZ / 2; - const volume = new Volume(); - volume.createEmptyBytesVolume(SZ, SZ, SZ); - let offDst = 0; - const pixelsSrc = volume.m_dataArray; - for (let z = 0; z < SZ; z++) { - for (let y = 0; y < SZ; y++) { - for (let x = 0; x < SZ; x++) { - pixelsSrc[offDst++] = (z < HALF_SZ) ? 0 : 255; - } - } - } - - const sobel = new SobelEdgeDetector(); - sobel.start(volume); - while (!sobel.isFinished()) { - sobel.update(); - } - sobel.normalizeDstImage(); - const pixelsDst = sobel.getPixelsDst(); - // check some pixels - let off = 0; - for (let z = 0; z < SZ; z++) { - for (let y = 0; y < SZ; y++) { - for (let x = 0; x < SZ; x++) { - const val = pixelsDst[off++]; - if ((z == HALF_SZ) || (z == HALF_SZ - 1)) { - expect(val > 240).toBeTruthy(); - } else { - expect(val < 10).toBeTruthy(); - } - } - } - } - sobel.stop(); - // console.log('Sobel test completed'); - }); -}); diff --git a/src/demo/ui/UiHistCard.js b/src/demo/ui/UiHistCard.js deleted file mode 100644 index dbf6a736..00000000 --- a/src/demo/ui/UiHistCard.js +++ /dev/null @@ -1,76 +0,0 @@ -/** - * @fileOverview UiHistCard - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { Card } from 'react-bootstrap'; - -import UiHistogram from './UiHistogram'; - - -// ******************************************************** -// Const -// ******************************************************** - - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiHistCard some text later... - */ -class UiHistCard extends React.Component { - /** - * Main component render func callback - */ - render() { - const vol = this.props.volume; - if (vol === undefined) { - return <p>UiHistogram.props volume is not defined !!!</p>; - } - const transfFuncCallback = this.props.transfFunc; - const transfFuncUpdateCallback = this.props.transfFuncUpdate; - - let strMsg = 'Volume histogram'; - if (vol !== null) { - const xDim = vol.m_xDim; - const yDim = vol.m_yDim; - const zDim = vol.m_zDim; - const bpp = vol.m_bytesPerVoxel; - const strDim = xDim.toString() + '*' + yDim.toString() + '*' + zDim.toString(); - const strBox = vol.m_boxSize.x.toFixed(2) + '*' + vol.m_boxSize.y.toFixed(2) + '*' + vol.m_boxSize.z.toFixed(2); - strMsg = 'Volume histogram: Dim = ' + strDim + '; bpp = ' + bpp.toString() + '; box = ' + strBox; - } - // const cw = this.state.width; - // const ch = this.state.height; - - const jsxHistCard = - <Card> - <Card.Body> - <Card.Title> - {strMsg} - </Card.Title> - <UiHistogram volume={vol} - transfFunc={transfFuncCallback} transfFuncUpdate={transfFuncUpdateCallback} /> - { /* - <div ref={ (mount) => {this.m_canvasOwner = mount} }> - <canvas ref="canvasHistogram" width={cw} height={ch} - onMouseDown={this.onMouseDown} onMouseUp={this.onMouseUp} onMouseMove={this.onMouseMove} /> - </div> - */ } - </Card.Body> - </Card> - return jsxHistCard; - } // end render - -} // end class - -export default UiHistCard; diff --git a/src/demo/ui/UiMain.js b/src/demo/ui/UiMain.js deleted file mode 100644 index 1991181e..00000000 --- a/src/demo/ui/UiMain.js +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; - -import UiMainMpr from './UiMainMpr'; -import UiMain2d from './UiMain2d'; -import UiMain3dLight from './UiMain3dLight'; - -import ModeView from '../store/ModeView'; - -class UiMain extends React.Component { - render() { - const store = this.props; - const modeViewIndex = store.modeView; - const jsxMainMpr = <UiMainMpr></UiMainMpr>; - const jsxMain2d = <UiMain2d></UiMain2d>; - const jsxMain3dLight = <UiMain3dLight></UiMain3dLight>; - - const jsxArray = new Array(ModeView.VIEW_COUNT); - jsxArray[ModeView.VIEW_MPR] = jsxMainMpr; - jsxArray[ModeView.VIEW_2D] = jsxMain2d; - jsxArray[ModeView.VIEW_3D_LIGHT] = jsxMain3dLight ; - jsxArray[ModeView.VIEW_3D] = jsxMain3dLight; - const jsxRet = jsxArray[modeViewIndex]; - return jsxRet; - }; -} - -export default connect(store => store)(UiMain); diff --git a/src/demo/ui/UiMain2d.js b/src/demo/ui/UiMain2d.js deleted file mode 100644 index 441983f7..00000000 --- a/src/demo/ui/UiMain2d.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * @fileOverview UiMain2d - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; -import { Row, Col, Container } from 'react-bootstrap'; - -import UiCtrl2d from './UiCtrl2d'; -import Graphics2d from '../engine/Graphics2d'; -import UiTools2d from './UiTools2d'; -import UiSegm2d from './UiSegm2d'; -import UiVolumeSel from './UiVolumeSel' - -// import UiHistCard from './UiHistCard'; - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiMain2d some text later... - */ -class UiMain2d extends React.Component { - transferFuncCallback(transfFuncObj) { - const i = transfFuncObj.m_indexMoved; - const x = transfFuncObj.m_handleX[i]; - const y = transfFuncObj.m_handleY[i]; - console.log(`moved point[${i}] = ${x}, ${y} `); - } - - /* - * - * Main component render func callback - */ - render() { - const MIN_HEIGHT = 800; - const strMinHeight = { - minHeight: MIN_HEIGHT.toString() + 'px' - }; - const store = this.props; - // const dicomSeries = store.dicomSeries; - // const numSer = dicomSeries.length; - const volSet = store.volumeSet; - const vols = volSet.m_volumes; - const numVols = vols.length; - const jsxVolSel = (numVols > 1) ? <UiVolumeSel /> : <br /> - - - const jsxMain2d = - <Container fluid="true" style={{ height: '100%', minHeight:'100%' }} > - <Row> - <Col xs md lg="4" style={{ height: '100%', position: 'relative' }} > - <UiCtrl2d /> - <UiTools2d /> - <UiSegm2d /> - {jsxVolSel} - - { /* - <UiHistCard volume={vol} transfFunc={funcTra} /> - */ } - - </Col> - <Col xs md lg="8" style={strMinHeight} > - <Graphics2d /> - </Col> - </Row> - </Container> - - return jsxMain2d; - }; -} - -export default connect(store => store)(UiMain2d); diff --git a/src/demo/ui/UiMain3dLight.js b/src/demo/ui/UiMain3dLight.js deleted file mode 100644 index f6c65dd2..00000000 --- a/src/demo/ui/UiMain3dLight.js +++ /dev/null @@ -1,172 +0,0 @@ -/** - * @fileOverview UiMain3dLight - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; -import { Row, Col } from 'react-bootstrap'; - -import UiCtrl3dLight from './UiCtrl3dLight'; -import UiCtrl3d from './UiCtrl3d'; -import Graphics3d from '../engine/Graphics3d'; -import 'nouislider/distribute/nouislider.css'; - -import { ListGroup } from 'react-bootstrap'; - -import Nouislider from 'react-nouislider'; - -//import Modes3d from '../store/Modes3d'; - -import StoreActionType from '../store/ActionTypes'; -import ModeView from '../store/ModeView'; -import UiTools2d from './UiTools2d'; - - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiMain3dLight some text later... - */ -class UiMain3dLight extends React.Component { - /** - * Main component render func callback - */ - constructor(props) { - super(props); - this.m_updateEnable = true; - } - - onChangeSliderBrightness() { - this.m_updateEnable = false; - const aval = this.refs.sliderBrightness.slider.get(); - const store = this.props; - store.dispatch({ type: StoreActionType.SET_SLIDER_Brightness, sliderBrightness: Number.parseFloat(aval) }); - } - - onChangeSliderCut() { - this.m_updateEnable = false; - const aval = this.refs.sliderCut.slider.get(); - const store = this.props; - store.dispatch({ type: StoreActionType.SET_SLIDER_Cut, sliderCut: Number.parseFloat(aval) }); - } - - onChangeSliderQuality() { - this.m_updateEnable = false; - const aval = this.refs.sliderQuality.slider.get(); - const store = this.props; - store.dispatch({ type: StoreActionType.SET_SLIDER_Quality, sliderQuality: Number.parseFloat(aval) }); - } - - onChangeSliderContrast3D() { - this.m_updateEnable = false; - const aval = this.refs.sliderContrast3D.slider.get(); - const store = this.props; - store.dispatch({ type: StoreActionType.SET_SLIDER_Contrast3D, sliderContrast3D: Number.parseFloat(aval) }); - } - - /* - shouldComponentUpdate() { - //return this.m_updateEnable; - return true; - } - */ - shouldComponentUpdate(nextProps) { - //return this.m_updateEnable; - let flag = this.m_updateEnable; - if (this.props.isTool3D !== nextProps.isTool3D || this.props.modeView !== nextProps.modeView) { - flag = true; - } - return flag; - //return true; - } - - //{(store.isTool3D === false) ? jsxView : jsxTool} - render() { - const store = this.props; - const modeViewIndex = store.modeView; - - const sliderBrightness = store.sliderBrightness; - const sliderCut = store.sliderCut; - const sliderQuality = store.sliderQuality; - - const wArrBrightness = [sliderBrightness]; - const wArrCut = [sliderCut]; - const wArrQuality = [sliderQuality]; - const jsx3dLight = <UiCtrl3dLight></UiCtrl3dLight>; - const jsx3d = <UiCtrl3d></UiCtrl3d>; - - const jsxArray = new Array(ModeView.VIEW_COUNT); - jsxArray[ModeView.VIEW_3D_LIGHT] = jsx3dLight ; - jsxArray[ModeView.VIEW_3D] = jsx3d; - const jsxRet = jsxArray[modeViewIndex]; - const jsxView = - <ListGroup as="ul" variant="flush"> - <ListGroup.Item> - <p> Brightness </p> - <Nouislider onSlide={this.onChangeSliderBrightness.bind(this)} ref={'sliderBrightness'} - range={{ min: 0.0, max: 1.0 }} - overflow-scroll={'true'} - start={wArrBrightness} connect={[false, false]} step={0.02} tooltips={true} /> - </ListGroup.Item> - <ListGroup.Item> - <p> Quality </p> - <Nouislider onSlide={this.onChangeSliderQuality.bind(this)} ref={'sliderQuality'} - range={{ min: 0.0, max: 1.0 }} - overflow-scroll={'true'} - start={wArrQuality} connect={[false, false]} step={0.02} tooltips={true} /> - </ListGroup.Item> - - </ListGroup> - const jsxTool = - <ListGroup as="ul" variant="flush"> - <ListGroup.Item> - <p> Cut plane opacity </p> - <Nouislider onSlide={this.onChangeSliderContrast3D.bind(this)} ref={'sliderContrast3D'} - range={{ min: 0.0, max: 1.0 }} - overflow-scroll={'true'} - start={wArrBrightness} connect={[false, false]} step={0.02} tooltips={true} /> - </ListGroup.Item> - <UiTools2d /> - </ListGroup> - const MIN_HEIGHT = 882; - const strMinHeight = { - minHeight: MIN_HEIGHT.toString() + 'px' - }; - - - const jsxMain3dLight = - <Row> - <Col xs={12} sm md lg={4} > - {jsxRet} - <ListGroup.Item as="ul" variant="flush"> - <p> Cut </p> - <Nouislider onSlide={this.onChangeSliderCut.bind(this)} ref={'sliderCut'} - range={{ min: 0.0, max: 1.0 }} - overflow-scroll={'true'} - start={wArrCut} connect={[false, false]} step={0.01} tooltips={true} /> - </ListGroup.Item> - {(store.isTool3D === false) ? jsxView : jsxTool} - </Col> - <Col xs={12} sm md lg={8} style={strMinHeight} > - <Graphics3d /> - </Col> - </Row> ; - - return jsxMain3dLight; - }; -} - -export default connect(store => store)(UiMain3dLight); diff --git a/src/demo/ui/UiMainMpr.js b/src/demo/ui/UiMainMpr.js deleted file mode 100644 index e1a5668a..00000000 --- a/src/demo/ui/UiMainMpr.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @fileOverview UiMainMpr - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiMainMpr some text later... - */ -class UiMainMpr extends React.Component { - /** - * Main component render func callback - */ - render() { - const jsxRet = <p>MPR is not implemented yet</p>; - return jsxRet; - }; -} - -export default connect(store => store)(UiMainMpr); diff --git a/src/demo/ui/UiModalAlert.js b/src/demo/ui/UiModalAlert.js deleted file mode 100644 index 35230711..00000000 --- a/src/demo/ui/UiModalAlert.js +++ /dev/null @@ -1,90 +0,0 @@ -/** - * @fileOverview UiModalAlert - * @author Epam - * @version 1.0.0 - */ - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; - -import { Modal, Button, Row, Col } from 'react-bootstrap'; - -// ******************************************************** -// Class -// ******************************************************** - -class UiModalAlert extends React.Component { - /** - * @param {object} props - props from up level object - */ - constructor(props) { - super(props); - this.onButtonOk = this.onButtonOk.bind(this); - - this.m_showFunc = null; - this.m_hideFunc = null; - - this.state = { - title: '', - text: '', - }; - } // end constr - - /** - * When user press OK button - */ - onButtonOk() { - // console.log('on button OK'); - this.m_hideFunc(); - } - - render() { - const stateVis = this.props.stateVis; - const onHideFunc = this.props.onHide; - const onShowFunc = this.props.onShow; - this.m_hideFunc = onHideFunc; - this.m_showFunc = onShowFunc; - // console.log(`UiModalAlert. setup funcs: ${this.m_showFunc}, ${this.m_hideFunc}`); - - const strTitle = this.props.title; - const strText = this.props.text; - - const jsxModalAlert = - <Modal show={stateVis} onHide={onHideFunc} > - - <Modal.Header closeButton> - <Modal.Title> - {strTitle} - </Modal.Title> - </Modal.Header> - - <Modal.Body> - <p> - {strText} - </p> - - - <Row> - <Col lg xl="2"> - <Button onClick={this.onButtonOk} > - Ok - </Button> - </Col> - - <Col lg xl="10"> - </Col> - </Row> - - </Modal.Body> - - </Modal> - return jsxModalAlert; - } // end render - -} // end class - -export default connect(store => store)(UiModalAlert); diff --git a/src/demo/ui/UiModalBilateral.js b/src/demo/ui/UiModalBilateral.js deleted file mode 100644 index e1d01cb4..00000000 --- a/src/demo/ui/UiModalBilateral.js +++ /dev/null @@ -1,317 +0,0 @@ -/** - * @fileOverview UiModalBilateral - * @author Epam - * @version 1.0.0 - */ - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; - -import { Modal, Button, Form, Row, Col, Table } from 'react-bootstrap'; -import Nouislider from 'react-nouislider'; - -import GaussSmoother from '../engine/imgproc/Gauss'; - -import StoreActionType from '../store/ActionTypes'; -import Texture3D from '../engine/Texture3D'; -import ModeView from '../store/ModeView'; -import Modes3d from '../store/Modes3d'; - - -// ******************************************************** -// Class -// ******************************************************** - -class UiModalBilateral extends React.Component { - /** - * @param {object} props - props from up level object - */ - constructor(props) { - super(props); - this.onModalShow = this.onModalShow.bind(this); - this.onModalHide = this.onModalHide.bind(this); - this.onButtonStart = this.onButtonStart.bind(this); - this.onChangeSliderKoefDist = this.onChangeSliderKoefDist.bind(this); - this.onChangeSliderKoefVal = this.onChangeSliderKoefVal.bind(this); - - this.onBilateralCallback = this.onBilateralCallback.bind(this); - - this.m_hideFunc = null; - this.m_gauss = null; - - this.state = { - showModalGauss: false, - text: 'dump' - }; - - this.m_kernelSize = 10; - this.m_koefDist = 3.0; - this.m_koefVal = 0.1; - } // end constr - - // - // - // - onButtonStart() { - console.log('on button start Bilateral with kernel = ' + this.m_kernelSize.toString()); - this.m_hideFunc(); - - const store = this.props; - - const volSet = store.volumeSet; - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - - if ((vol === undefined) || (vol === null)) { - console.log('onButtonSobel: no volume!'); - return; - } - this.m_vol = vol; - const xDim = vol.m_xDim; - const yDim = vol.m_yDim; - const zDim = vol.m_zDim; - if (xDim * yDim * zDim < 1) { - console.log(`onButtonBilateral: bad volume! dims = ${xDim}*${yDim}*${zDim}`); - return; - } - // let volTextureSrc = vol.m_dataArray; - const ONE = 1; - if (vol.m_bytesPerVoxel !== ONE) { - console.log('onButtonBilateral: supported only 1bpp volumes'); - return; - } - - console.log('onButtonBilateral: start 3d bilateral filtration...'); - //const xyzDim = xDim * yDim * zDim; - //const volTextureDst = new Uint8Array(xyzDim); - - const NEED_HW = true; - const gauss = new GaussSmoother(NEED_HW); - - // test - // gauss.testSimple(); - - const kernelSize = this.m_kernelSize; - gauss.start(vol, kernelSize, this.m_koefDist, this.m_koefVal); - this.m_gauss = gauss; - - const uiApp = store.uiApp; - uiApp.doShowProgressBar('Apply bilateral filter...'); - uiApp.doSetProgressBarRatio(0.0); - - const UPDATE_DELAY_MSEC = 150; - this.m_timerId = setTimeout(this.onBilateralCallback, UPDATE_DELAY_MSEC); - } - - // - // callback for periodicallt invoke sobel 3d volume filtering - // - onBilateralCallback() { - this.m_gauss.update(); - - const store = this.props; - - let ratioUpdate = this.m_gauss.getRatio(); - ratioUpdate = (ratioUpdate < 1.0) ? ratioUpdate : 1.0; - ratioUpdate *= 100; - ratioUpdate = Math.floor(ratioUpdate); - // console.log('ratio = ' + ratioUpdate.toString() ); - - const uiApp = store.uiApp; - uiApp.doSetProgressBarRatio(ratioUpdate); - - const isFinished = this.m_gauss.isFinished(); - - if (isFinished) { - console.log('onBilateralCallback: iters finished!'); - uiApp.doHideProgressBar(); - - clearInterval(this.m_timerId); - this.m_timerId = 0; - - const volSet = store.volumeSet; - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - - const xDim = vol.m_xDim; - const yDim = vol.m_yDim; - const zDim = vol.m_zDim; - const xyzDim = xDim * yDim * zDim; - const pixelsDst = this.m_gauss.getPixelsDst() - for (let i = 0; i < xyzDim; i++) { - vol.m_dataArray[i] = Math.floor(pixelsDst[i]); - } // for i - this.m_gauss.stop(); - - // rebuild 3d data - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: volSet }); - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); - const tex3d = new Texture3D(); - tex3d.createFromRawVolume(vol); - store.dispatch({ type: StoreActionType.SET_TEXTURE3D, texture3d: tex3d }); - store.dispatch({ type: StoreActionType.SET_MODE_VIEW, modeView: ModeView.VIEW_2D }); - store.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); - } // if finished - // update render - store.graphics2d.forceUpdate(); - // next update timer - if (!isFinished) { - const UPDATE_DELAY_MSEC = 150; - this.m_timerId = setTimeout(this.onBilateralCallback, UPDATE_DELAY_MSEC); - } - } // end onBilateralCallback - - // - onModalShow() { - this.setState({ showModalGauss: true }); - } - - onModalHide() { - this.setState({ showModalGauss: false }); - } - - handleFormSubmit(evt) { - evt.preventDefault(); - this.m_hideFunc(); - // this.onSaveNifti(); - } - - onChangeSliderKoefDist() { - if (this.refs === undefined) { - return; - } - this.m_updateEnable = false; - let val = 0.0; - const aval = this.refs.slider1.slider.get(); - if (typeof (aval) === 'string') { - val = Number.parseFloat(aval); - this.m_koefDist = val; - } - } - - onChangeSliderKoefVal() { - if (this.refs === undefined) { - return; - } - this.m_updateEnable = false; - let val = 0.0; - const aval = this.refs.slider2.slider.get(); - if (typeof (aval) === 'string') { - val = Number.parseFloat(aval); - this.m_koefVal = val; - } - } - - // - render() { - const stateVis = this.props.stateVis; - const onHideFunc = this.props.onHide; - this.m_hideFunc = onHideFunc; - - const strSlider1 = 'slider1'; - const strSlider2 = 'slider2'; - const defaultDist = 3; - const defaultVal = 0.1; - const wArrDist = [defaultDist]; - const wArrVal = [defaultVal]; - - const valToolTps = true; - - const jsxModalGauss = - <Modal show={stateVis} onHide={onHideFunc} > - - <Modal.Title> - Bilateral filtration - </Modal.Title> - - <Modal.Body> - - <Table> - <tbody> - - <tr> - <td style={{ paddingBottom: '32px' }}> - Select koefficient distance (kd) - </td> - </tr> - - <tr> - <td> - - <Row> - <Col> - <Form onSubmit={evt => this.handleFormSubmit(evt)}> - <Nouislider onSlide={this.onChangeSliderKoefDist.bind(this)} ref={strSlider1} - range={{ min: 0.5, max: 3.0 }} - start={wArrDist} step={0.2} tooltips={valToolTps} /> - </Form> - </Col> - </Row> - - </td> - </tr> - - <tr> - <td style={{ paddingBottom: '32px' }}> - Select koefficient value (kv) - </td> - </tr> - - <tr> - <td> - - <Row> - <Col> - <Form onSubmit={evt => this.handleFormSubmit(evt)}> - <Nouislider onSlide={this.onChangeSliderKoefVal.bind(this)} ref={strSlider2} - range={{ min: 0.1, max: 4.0 }} - start={wArrVal} step={0.2} tooltips={valToolTps} /> - </Form> - </Col> - </Row> - - </td> - </tr> - - <tr> - <td> - <b>Hints to setup values:</b> <br /> - kd = 0.5, kv = 0.1 => original image <br /> - kd = 3.0, kv = 0.1 => denoise image <br /> - kd = 3.0, kv = 4.0 => image blur - </td> - </tr> - - <tr> - <td> - <Row> - <Col lg xl="2"> - <Button onClick={this.onButtonStart} > - Start - </Button> - </Col> - - <Col lg xl="10"> - </Col> - - </Row> - </td> - </tr> - </tbody> - </Table> - - </Modal.Body> - - </Modal> - return jsxModalGauss; - } // end render - -} // end class - -export default connect(store => store)(UiModalBilateral); - - diff --git a/src/demo/ui/UiModalDemo.js b/src/demo/ui/UiModalDemo.js deleted file mode 100644 index 8aa90c00..00000000 --- a/src/demo/ui/UiModalDemo.js +++ /dev/null @@ -1,197 +0,0 @@ -/** - * @fileOverview UiModalDemo - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; - -import { Container, Row, Col, Image, OverlayTrigger, Tooltip } from 'react-bootstrap'; -import { Modal, Button } from 'react-bootstrap'; - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiModalDemo some text later... - */ -class UiModalDemo extends React.Component { - /** - * @param {object} props - props from up level object - */ - constructor(props) { - super(props); - this.onModalShow = this.onModalShow.bind(this); - this.onModalHide = this.onModalHide.bind(this); - this.onButton0 = this.onButton0.bind(this); - this.onButton1 = this.onButton1.bind(this); - this.onButton2 = this.onButton2.bind(this); - this.onButton3 = this.onButton3.bind(this); - this.onButton4 = this.onButton4.bind(this); - this.onButton5 = this.onButton5.bind(this); - this.onButton6 = this.onButton6.bind(this); - this.onButton7 = this.onButton7.bind(this); - this.onDemo = this.onDemo.bind(this); - this.state = { - showModalDemo: false - }; - } - - onModalShow() { - this.setState({ showModalDemo: true }); - } - - onModalHide() { - this.setState({ showModalDemo: false }); - } - - onDemo(index) { - const onSelectFunc = this.props.onSelectDemo; - const onHideFunc = this.props.onHide; - onHideFunc(); - onSelectFunc(index); - } - - onButton0() { - this.onDemo(0); - } - - onButton1() { - this.onDemo(1); - } - - onButton2() { - this.onDemo(2); - } - - onButton3() { - this.onDemo(3); - } - - onButton4() { - this.onDemo(4); - } - - onButton5() { - this.onDemo(5); - } - - onButton6() { - this.onDemo(6); - } - - onButton7() { - this.onDemo(7); - } - - render() { - const stateVis = this.props.stateVis; - const onHideFunc = this.props.onHide; - - // icons description - const iconsSet = [ - { - tooltip: 'Lungs 20101108 from ktx', - image: 'images/thumb_lungs.png', - alt: 'lungs', - func: this.onButton0, - }, - { - tooltip: 'Brain set from ktx', - image: 'images/thumb_brain.png', - alt: 'lungs', - func: this.onButton1, - }, - { - tooltip: 'Grandmother (gm3) from nifti', - image: 'images/thumb_gm3_512_512_165.png', - alt: 'gm3', - func: this.onButton2, - }, - { - tooltip: 'Woman pelvis from dicom', - image: 'images/thumb_woman_pelvis.png', - alt: 'woman_pelvis', - func: this.onButton3, - }, - { - tooltip: 'Lungs 00cba...957e from dicom', - image: 'images/thumb_ocb.png', - alt: 'lungs_ocb', - func: this.onButton4, - }, - { - tooltip: 'CT 256^3 from ktx', - image: 'images/thumb_ct_256.png', - alt: 'ct_256', - func: this.onButton5, - }, - { - tooltip: 'Lungs 256^3 from ktx', - image: 'images/thumb_lungs_256.png', - alt: 'lungs_256', - func: this.onButton6, - }, - { - tooltip: 'Brain with ROI (colored) from Hdr+Img', - image: 'images/thumb_set.png', - alt: 'hdr_set_roi', - func: this.onButton7, - }, - ]; - - const jsxModalDemo = - <Modal show={stateVis} onHide={onHideFunc} > - <Modal.Header closeButton> - <Modal.Title> - Load demo data - </Modal.Title> - </Modal.Header> - <Modal.Body> - - <Container> - <Row> - {iconsSet.map( (d, i) => { - const strId = `id_${i}`; - const strTooltip = d.tooltip; - const strImage = d.image; - const strAlt = d.alt; - const funcCallback = d.func; - return <Col xs={6} md={4} key={strId}> - <OverlayTrigger - placement="top" - delay={{ show: 150, hide: 300 }} - overlay={ - <Tooltip id={strId}> - {strTooltip} - </Tooltip> - } - > - <Button variant="light" onClick={funcCallback} > - <Image src={strImage} alt={strAlt} thumbnail /> - </Button> - </OverlayTrigger> - </Col> - })} - </Row> - </Container> - - </Modal.Body> - </Modal>; - - return jsxModalDemo; - } // end render -} // end class - -export default connect(store => store)(UiModalDemo); diff --git a/src/demo/ui/UiModalDicomSeries.js b/src/demo/ui/UiModalDicomSeries.js deleted file mode 100644 index f138927a..00000000 --- a/src/demo/ui/UiModalDicomSeries.js +++ /dev/null @@ -1,101 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { Modal } from 'react-bootstrap'; - -import BootstrapTable from 'react-bootstrap-table-next'; - -class UiModalDicomSeries extends React.Component { - constructor(props) { - super(props); - this.m_onHide = null; - this.m_onSelect = null; - this.m_strStyle = ''; - - this.onClickRow = this.onClickRow.bind(this); - } - - onClickRow(evt, row, rowIndex) { - // console.log(`clicked row = ${rowIndex}`); - this.m_onHide(); - this.m_onSelect(rowIndex); - } - - // special code to fix bootstrap table - // clippimng problem - componentWillUpdate(){ - // document.querySelector('.react-bs-table-container').style.height = "auto"; - this.m_strStyle = 'auto'; - } - - componentDidUpdate(){ - // document.querySelector('.react-bs-table-container').style.height = "100%"; - this.m_strStyle = '100%'; - } - - render() { - const isVisible = this.props.stateVis; - const store = this.props; - const arrSeries = store.dicomSeries; - this.m_onHide = this.props.onHide; - this.m_onSelect = this.props.onSelect; - - const strColumns = [ - { - dataField: 'm_patientName', - text: 'Patient name', - }, - { - dataField: 'm_studyDescr', - text: 'Study description', - }, - { - dataField: 'm_studyDate', - text: 'Study date', - }, - { - dataField: 'm_seriesTime', - text: 'Series time', - }, - { - dataField: 'm_seriesDescr', - text: 'Series descriotpon', - }, - { - dataField: 'm_bodyPartExamined', - text: 'Body part examined', - }, - { - dataField: 'm_numSlices', - text: 'Number of slices', - }, - { - dataField: 'm_hash', - text: 'Hash code', - }, - ]; - const rowEvents = { - onClick: this.onClickRow, - }; - const strWidth = this.m_strStyle; - - const jsxModalDicomSeries = - <Modal show={isVisible} onHide={this.m_onHide} size="xl" > - <Modal.Header closeButton> - <Modal.Title> - Select Dicom series - </Modal.Title> - </Modal.Header> - - <Modal.Body> - <div> - <BootstrapTable bootsrap4 stripped hover keyField='m_hash' data={arrSeries} columns={strColumns} - rowEvents={rowEvents} - style={{ width: { strWidth }, overflow: 'overlay' }} /> - </div> - </Modal.Body> - </Modal>; - - return jsxModalDicomSeries; - } // end render -} // end class -export default connect(store => store)(UiModalDicomSeries); diff --git a/src/demo/ui/UiModalDicomTags.js b/src/demo/ui/UiModalDicomTags.js deleted file mode 100644 index 0dbd8b04..00000000 --- a/src/demo/ui/UiModalDicomTags.js +++ /dev/null @@ -1,150 +0,0 @@ -/** - * @fileOverview UiModalDicomTags - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; - -import { Modal, Table, Form } from 'react-bootstrap'; - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiModalDicomTags some text later... - */ -class UiModalDicomTags extends React.Component { - /** - * @param {object} props - props from up level object - */ - constructor(props) { - super(props); - this.onModalHide = this.onModalHide.bind(this); - - this.state = { - showModalDemo: false, - currentSlice: 0, - }; - } - - onModalHide() { - this.setState({ showModalDemo: false }); - } - - onSelectSlice(evt) { - // const nam = evt.target.name; - const val = evt.target.value; - // console.log(`onSelectSlice. name = ${nam} val = ${val}`); - const arr = val.split(' '); - const ind = parseInt(arr[1]); - console.log(`onSelectSlice. index = ${ind}`); - this.setState({ currentSlice: ind }); - } - - render() { - const stateVis = this.props.stateVis; - const onHideFunc = this.props.onHide; - - const store = this.props; - const dicomInfo = store.dicomInfo; - let slicesInfo = []; - let tagsList = []; - - if (dicomInfo !== null) { - slicesInfo = dicomInfo.m_sliceInfo; - if (slicesInfo.length > 0) { - tagsList = slicesInfo[this.state.currentSlice].m_tags; - } - /* - const numSlices = slicesInfo.length; - console.log(`UiModalDicomTags.render. num slices = ${numSlices}`); - for (let i = 0; i < numSlices; i++) { - const sliceInfo = slicesInfo[i]; - console.log(`UiModalDicomTags.render. slice = ${sliceInfo.m_sliceName} file = ${sliceInfo.m_fileName}`); - const tagsInfo = sliceInfo.m_tags; - const numTags = tagsInfo.length; - for (let j = 0; j < numTags; j++) { - const tagInfo = tagsInfo[j]; - console.log(`UiModalDicomTags.render. tag = ${tagInfo.m_tag} name = ${tagInfo.m_attrName} value = ${tagInfo.m_attrValue}`); - } - } - */ - } - - - const jsxModalDemo = - <Modal show={stateVis} onHide={onHideFunc} size="xl" > - <Modal.Header closeButton> - <Modal.Title> - Dicom information - </Modal.Title> - </Modal.Header> - - <Modal.Body> - - <Form> - <Form.Group controlId="modalDicomTags.slice"> - <Form.Label> - Choose slice - </Form.Label> - - <Form.Control as="select" onChange={this.onSelectSlice.bind(this)}> - {slicesInfo.map( (d, i) => { - const sn = d.m_sliceName; - const fn = d.m_fileName; - const str = sn + ' (' + fn + ')'; - return <option key={i} value={str}> {str} </option>; - })} - </Form.Control> - - </Form.Group> - - </Form> - - <Table striped bordered responsive> - <thead> - - <tr> - <th> - Tag - </th> - <th> - Attribute Name - </th> - <th> - Attribute Value - </th> - </tr> - - </thead> - <tbody> - {tagsList.map( (d, i) => { - const strTag = d.m_tag; - const strNam = d.m_attrName; - const strVal = (d.m_attrValue.length > 0) ? d.m_attrValue : '_'; - // return <tr key={i}><td>{strTag}</td><td>{i}</td><td>{i}</td></tr>; - return <tr key={i}><td>{strTag}</td><td>{strNam}</td><td>{strVal}</td></tr>; - })} - </tbody> - - </Table> - - </Modal.Body> - </Modal> - return jsxModalDemo; - } // end render -} // end class - -export default connect(store => store)(UiModalDicomTags); diff --git a/src/demo/ui/UiModalSaveNifti.js b/src/demo/ui/UiModalSaveNifti.js deleted file mode 100644 index 847f7e5f..00000000 --- a/src/demo/ui/UiModalSaveNifti.js +++ /dev/null @@ -1,180 +0,0 @@ -/** - * @fileOverview UiModalSaveNifti - * @author Epam - * @version 1.0.0 - */ - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; - -import { Modal, Table, Button, Form, Row, Col } from 'react-bootstrap'; - -import SaverNifti from '../engine/savers/SaverNifti'; - -// ******************************************************** -// Class -// ******************************************************** - -class UiModalSaveNifti extends React.Component { - /** - * @param {object} props - props from up level object - */ - constructor(props) { - super(props); - this.onModalShow = this.onModalShow.bind(this); - this.onModalHide = this.onModalHide.bind(this); - this.onButtonSave = this.onButtonSave.bind(this); - this.onTexChange = this.onTexChange.bind(this); - this.handleFormSubmit = this.handleFormSubmit.bind(this); - this.onSaveNifti = this.onSaveNifti.bind(this); - - this.m_hideFunc = null; - - this.state = { - showModalSaveNifti: false, - text: 'dump' - }; - } // end constr - - onButtonSave() { - // console.log('on button save'); - this.m_hideFunc(); - this.onSaveNifti(); - } - - onModalShow() { - this.setState({ showModalSaveNifti: true }); - } - - onModalHide() { - this.setState({ showModalSaveNifti: false }); - } - - handleFormSubmit(evt) { - evt.preventDefault(); - this.m_hideFunc(); - this.onSaveNifti(); - } - - onTexChange(evt) { - const strText = evt.target.value; - // console.log(`onTexChange. text = ${strText}`); - this.setState({ text: strText }); - } - - // invoked on save nifti file format - onSaveNifti() { - const store = this.props; - - const volSet = store.volumeSet; - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - - const xDim = vol.m_xDim; - const yDim = vol.m_yDim; - const zDim = vol.m_zDim; - const xBox = vol.m_boxSize.x; - const yBox = vol.m_boxSize.y; - const zBox = vol.m_boxSize.z; - const volSize = { - x: xDim, - y: yDim, - z: zDim, - pixdim1: xBox / xDim, - pixdim2: yBox / yDim, - pixdim3: zBox / zDim, - }; - let volData = vol.m_dataArray; - const vR = store.volumeRenderer; - if ( vR !== null ) { - volData = vR.volumeUpdater.bufferR; - }; - - const niiArr = SaverNifti.writeBuffer(volData, volSize); - const textToSaveAsBlob = new Blob([niiArr], { type: 'application/octet-stream' }); - const textToSaveAsURL = window.URL.createObjectURL(textToSaveAsBlob); - let fileName = this.state.text; - const goodSuffix = fileName.endsWith('.nii'); - if (!goodSuffix) { - fileName = fileName.concat('.nii'); - } - // console.log(`Save to file ${fileName}`); - - const downloadLink = document.createElement('a'); - downloadLink.download = fileName; - downloadLink.innerHTML = 'Download File'; - downloadLink.href = textToSaveAsURL; - downloadLink.onclick = event => document.body.removeChild(event.target); - downloadLink.style.display = 'none'; - document.body.appendChild(downloadLink); - - downloadLink.click(); - } // end on save nifti - - render() { - const stateVis = this.props.stateVis; - const onHideFunc = this.props.onHide; - this.m_hideFunc = onHideFunc; - const jsxModalSaveNifti = - <Modal show={stateVis} onHide={onHideFunc} > - - <Modal.Body> - - <Modal.Title> - Save as Nifti - </Modal.Title> - - <Form onSubmit={evt => this.handleFormSubmit(evt)}> - <Table> - <thead> - <tr> - - <th> - <Form.Control required type="text" placeholder="Enter file name here" - defaultValue={this.state.text} onChange={this.onTexChange} /> - </th> - - <th> - <Form.Label className="text-left"> - .nii - </Form.Label> - </th> - - - </tr> - </thead> - - </Table> - - </Form> - <Row> - <Col lg xl="2"> - <Button onClick={this.onButtonSave} > - Save - </Button> - </Col> - - <Col lg xl="2"> - <Button onClick={onHideFunc} > - Cancel - </Button> - </Col> - - <Col lg xl="8"> - </Col> - - </Row> - - </Modal.Body> - - </Modal> - return jsxModalSaveNifti; - } // end render - -} // end class - -export default connect(store => store)(UiModalSaveNifti); diff --git a/src/demo/ui/UiOpenMenu.test.js b/src/demo/ui/UiOpenMenu.test.js deleted file mode 100644 index 1c5c97b7..00000000 --- a/src/demo/ui/UiOpenMenu.test.js +++ /dev/null @@ -1,50 +0,0 @@ -// ******************************************************** -// Imports -// ******************************************************** - -import FileTools from '../engine/loaders/FileTools'; - - -// ******************************************************** -// Tests -// ******************************************************** - -describe('UiOpenMenu', () => { - - it('testValidUrl', () => { - const fileTools = new FileTools(); - const URL_1 = 'http://www.bkk.kepa/some/ktx/ogo23863.ktx'; - const URL_2 = 'www.bams.kepa/xxx/yyy/fdss.ktx'; - const URL_3 = 'bams.kepa/xxx/yyy/fdss.ktx'; - const URL_4 = 'bams/xxx/yyy/fdss.ktx'; - const URL_5 = 'bams.banya'; - const VALID_1 = fileTools.isValidUrl(URL_1); - const VALID_2 = fileTools.isValidUrl(URL_2); - const VALID_3 = fileTools.isValidUrl(URL_3); - const VALID_4 = fileTools.isValidUrl(URL_4); - const VALID_5 = fileTools.isValidUrl(URL_5); - expect(VALID_1).toBeTruthy(); - expect(VALID_2).toBeTruthy(); - expect(VALID_3).toBeTruthy(); - expect(VALID_4).toBeFalsy(); - expect(VALID_5).toBeFalsy(); - }); // indi test - it('testExistsdUrl', () => { - const fileTools = new FileTools(); - const URL_1 = 'www.google.com'; - const URL_2 = 'www.fdhsjaksdf.nu/fdsad/gfdsfg/bgdgb/rethtr/kjhdf.ktx'; - const EXIST_1 = fileTools.isUrlExists(URL_1); - const EXIST_2 = fileTools.isUrlExists(URL_2); - expect(EXIST_1).toBeTruthy(); - expect(EXIST_2).toBeTruthy(); - }); // indi test - - it('testEncodeDecode', () => { - const fileTools = new FileTools(); - const URL_ORIG = 'www.makaka.da/some/kind/of/path/khs7652019/ko.ktx'; - const URL_ENCODED = fileTools.encodeUrl(URL_ORIG); - const URL_RESTORED = fileTools.decodeUrl(URL_ENCODED); - expect(URL_ORIG === URL_RESTORED).toBeTruthy(); - }); // indi test - -}); // all tests diff --git a/src/demo/ui/UiReportMenu.js b/src/demo/ui/UiReportMenu.js deleted file mode 100644 index 2f0f6d0e..00000000 --- a/src/demo/ui/UiReportMenu.js +++ /dev/null @@ -1,106 +0,0 @@ -/** - * @fileOverview UiReportMenu - * @author Epam - * @version 1.0.0 - */ - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; -import { NavDropdown } from 'react-bootstrap'; - -import UiModalDicomTags from './UiModalDicomTags'; -import Screenshot from '../engine/utils/Screenshot'; -import ModeView from '../store/ModeView'; - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiReportMenu some text later... - */ -class UiReportMenu extends React.Component { - // constructor - constructor(props) { - super(props); - - this.onModalDicomTagsShow = this.onModalDicomTagsShow.bind(this); - this.onModalDicomTagsHide = this.onModalDicomTagsHide.bind(this); - this.onModalScreenshot = this.onModalScreenshot.bind(this); - - this.state = { - showModalDicomTags: false, - }; - } - - onModalDicomTagsShow() { - this.setState({ showModalDicomTags: true }); - } - - onModalDicomTagsHide() { - this.setState({ showModalDicomTags: false }); - } - - onModalScreenshot() { - const SHOT_W = 800; - const SHOT_H = 600; - - const store = this.props; - const modeView = store.modeView; - if (modeView === ModeView.VIEW_2D) { - const gra2d = store.graphics2d; - Screenshot.makeScreenshot(gra2d, SHOT_W, SHOT_H); - } else if ((modeView === ModeView.VIEW_3D) || (modeView === ModeView.VIEW_3D_LIGHT)) { - const volRender = store.volumeRenderer; - Screenshot.makeScreenshot(volRender, SHOT_W, SHOT_H); - } else { - console.log('onModalScreenshot. not implemented yet'); - } - } - - // invoked after render - componentDidMount() { - } - - render() { - const store = this.props; - const isLoaded = store.isLoaded; - - const strDisabled = (isLoaded) ? false : true; - const jsxReportMenu = - <NavDropdown id="save-nav-dropdown" - disabled={strDisabled} - title={ - <div style={{ display: 'inline-block' }}> - <i className="fas fa-book"></i> - Report - </div> - } > - <NavDropdown.Item onClick={this.onModalDicomTagsShow} > - <i className="fas fa-clipboard-list"></i> - Show tags - </NavDropdown.Item> - - <NavDropdown.Item onClick={this.onModalScreenshot} > - <i className="fas fa-camera"></i> - Screenshot - </NavDropdown.Item> - - <UiModalDicomTags stateVis={this.state.showModalDicomTags} - onHide={this.onModalDicomTagsHide} /> - - </NavDropdown>; - - return jsxReportMenu; - } -} - -export default connect(store => store)(UiReportMenu); diff --git a/src/demo/ui/UiRoiSelect.js b/src/demo/ui/UiRoiSelect.js deleted file mode 100644 index 17680979..00000000 --- a/src/demo/ui/UiRoiSelect.js +++ /dev/null @@ -1,162 +0,0 @@ -/** - * @fileOverview UiRoiSelect - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - - -import React from 'react'; -import { connect } from 'react-redux'; -import { Form, Card } from 'react-bootstrap'; -import { Row, Col } from 'react-bootstrap'; - -import RoiPalette from '../engine/loaders/roipalette'; - - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -class UiRoiSelect extends React.Component { - constructor(props) { - super(props); - - this.m_setRoiFunc = undefined; - - this.onChangeSelectAll = this.onChangeSelectAll.bind(this); - this.onChangeRoiIndi = this.onChangeRoiIndi.bind(this); - - this.m_roiPalette = new RoiPalette(); - const arrPal = this.m_roiPalette.getPalette(); - const numPalElems = arrPal.length; - - const NUM_PAL_ELEMS = 94; - if (numPalElems !== NUM_PAL_ELEMS) { - console.log(`numPalElems = ${numPalElems}, but expected = ${NUM_PAL_ELEMS} `); - } - - const arrState = arrPal.map( (elem) => { - const ename = elem.name; - const ecolor = elem.roiColor; - const eid = elem.roiId; - const eposition = elem.position; - - const arrColor = ecolor.split(' '); - const rCol = Math.floor(arrColor[0] * 255); - const gCol = Math.floor(arrColor[1] * 255); - const bCol = Math.floor(arrColor[2] * 255); - const strCol = '#' + rCol.toString(16) + gCol.toString(16) + bCol.toString(16); - // console.log(`palElem = ${strCol} `); - - const obj = { - name: ename, - color: ecolor, - strColor: strCol, - id: eid, - position: eposition, - selected: false, - }; - // console.log(`palElem = ${obj.name}, ${rcol}, ${rid}, ${posi} `); - return obj; - }); - this.state = { - allSelected: false, - checkboxes: arrState, - }; - } - - /** - * On change individual - * - * @param {object} evt - event - */ - onChangeRoiIndi(evt) { - // obj is type: HTMLInputElement - const obj = evt.target; - const isCheck = obj.checked; - const id = Number.parseInt(obj.id); - const ind = this.state.checkboxes.findIndex( elem => { - const isEq = (elem.id === id); - return isEq; - }); - // console.log(`id = ${id}`); - // console.log(`ind = ${ind}`); - // console.log(`isCheck = ${isCheck}`); - - const arrStates = this.state.checkboxes; - if (ind >= 0) { - arrStates[ind].selected = isCheck; - this.setState({ checkboxes: arrStates }); - - if (this.m_setRoiFunc !== undefined) { - this.m_setRoiFunc(arrStates); - } - } - } - - /** - * On select all chech box event handler - * - * @param {object} evt - event - */ - onChangeSelectAll(evt) { - const isCheck = evt.target.checked; - // console.log(`isCheck = ${isCheck}`); - const arrStates = this.state.checkboxes; - const numElems = arrStates.length; - for (let i = 0; i < numElems; i++) { - arrStates[i].selected = isCheck; - } - this.setState({ checkboxes: arrStates }); - this.setState({ allSelected: isCheck }); - if (this.m_setRoiFunc !== undefined) { - this.m_setRoiFunc(arrStates); - } - } - - render() { - this.m_setRoiFunc = this.props.setRoiFunc; - const isAllSel = this.state.allSelected; - const strSel = (isAllSel) ? 'Select none' : 'Select all'; - const jsxRoiCard = - <Card style={{ height: '350px', 'overflowY': 'auto' }}> - <Card.Body> - <Card.Title> - ROI Selector - </Card.Title> - <Form.Group controlId="ROI selector"> - <Form.Check type="checkbox" key="selall" label={strSel} onChange={this.onChangeSelectAll}/> - {this.state.checkboxes.map(elem => { - const strCol = elem.strColor; - const obj = - <Row key={elem.id} id={elem.id} > - <Col xs lg="11"> - <Form.Check type="checkbox" label={elem.name} key={elem.id} - id={elem.id} - checked={elem.selected} - onChange={this.onChangeRoiIndi} /> - </Col> - <Col xs lg="1"> - <i className="fa fa-square" style={{ 'color': strCol }}> </i> - </Col> - </Row> - return obj; - })} - </Form.Group> - </Card.Body> - </Card>; - - return jsxRoiCard; - } -} - -export default connect(store => store)(UiRoiSelect); diff --git a/src/demo/ui/UiSaveMenu.js b/src/demo/ui/UiSaveMenu.js deleted file mode 100644 index 81c5ae65..00000000 --- a/src/demo/ui/UiSaveMenu.js +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @fileOverview UiSaveMenu - * @author Epam - * @version 1.0.0 - */ - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; -import { NavDropdown } from 'react-bootstrap'; - -import UiModalSaveNifti from './UiModalSaveNifti'; - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiSaveMenu some text later... - */ -class UiSaveMenu extends React.Component { - /** - * @param {object} props - props from up level object - */ - constructor(props) { - super(props); - - this.onModalSaveNiftiShow = this.onModalSaveNiftiShow.bind(this); - this.onModalSaveNiftiHide = this.onModalSaveNiftiHide.bind(this); - - this.state = { - showModalSaveNifti: false, - }; - } - - // invoked after render - componentDidMount() { - } - - onModalSaveNiftiShow() { - this.setState({ showModalSaveNifti: true }); - } - - onModalSaveNiftiHide() { - this.setState({ showModalSaveNifti: false }); - // console.log('onModalSaveNiftiHide...'); - } - - // - // render - // - render() { - const store = this.props; - const isLoaded = store.isLoaded; - const strDisabled = (isLoaded) ? false : true; - - const jsxSaveMenu = - <NavDropdown id="save-nav-dropdown" - disabled={strDisabled} - title={ - <div style={{ display: 'inline-block' }}> - <i className="fas fa-save"></i> - Save - </div> - } > - <NavDropdown.Item onClick={evt => this.onModalSaveNiftiShow(evt)} > - <i className="fas fa-globe"></i> - Save to Nifti - </NavDropdown.Item> - <UiModalSaveNifti stateVis={this.state.showModalSaveNifti} onHide={this.onModalSaveNiftiHide} /> - </NavDropdown>; - - - return jsxSaveMenu; - } -} - -export default connect(store => store)(UiSaveMenu); - - diff --git a/src/demo/ui/UiSegm2d.js b/src/demo/ui/UiSegm2d.js deleted file mode 100644 index ef1bd02e..00000000 --- a/src/demo/ui/UiSegm2d.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @fileOverview UiSegm2d - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; - -// import StoreActionType from '../store/ActionTypes'; -// import Tools2dType from '../engine/tools2d/ToolTypes'; -import { Form, Card, OverlayTrigger, Tooltip } from 'react-bootstrap'; - -// ******************************************************** -// Class -// ******************************************************** -class UiSegm2d extends React.Component { - constructor(props) { - super(props); - this.onChangeSegm2d = this.onChangeSegm2d.bind(this); - this.state = { - isSegmented: false, - }; - } - - onChangeSegm2d() { - // console.log('UiSegm2d. onChangeSegm2d ...'); - this.setState({ isSegmented: !this.state.isSegmented }); - - const store = this.props; - const gra2d = store.graphics2d; - if (gra2d !== null) { - - gra2d.m_isSegmented = !this.state.isSegmented; - gra2d.forceUpdate(); - gra2d.forceRender(); - const segm = gra2d.segm2d; - if ((segm !== null) && (!this.state.isSegmented)) { - if (segm.model == null) { - //console.log('onChangeSegm2d. onLoadModel ...'); - segm.onLoadModel(); - } else { - //console.log('onChangeSegm2d. start apply image ...'); - //segm.startApplyImage(); - } - } - } - } // end of onChangeSegm2d - - // render UI for 2d segmentation on screen - render() { - const strTitle = 'Segmentation 2d (brain only)'; - const jsx = - <Card> - <Card.Header> - {strTitle} - </Card.Header> - <Card.Body> - <OverlayTrigger - key="about" - placement="bottom" - overlay = { - <Tooltip> - You can use automatic 2d image segmentation only for brain-like data - </Tooltip> - } - > - <Form> - <Form.Check inline type="checkbox" label="Segmentation 2d" id="idseg2d" onChange={this.onChangeSegm2d} > - </Form.Check> - </Form> - - </OverlayTrigger> - - <Card.Text> - Switch checker above on and see segmentation result on right - </Card.Text> - - </Card.Body> - </Card> - return jsx; - } -} - -export default connect(store => store)(UiSegm2d); - diff --git a/src/demo/ui/UiTF.js b/src/demo/ui/UiTF.js deleted file mode 100644 index b5e83c69..00000000 --- a/src/demo/ui/UiTF.js +++ /dev/null @@ -1,253 +0,0 @@ -/** - * @fileOverview UiTF - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -// special css for NoUiSlioder -import 'nouislider/distribute/nouislider.css'; -import React from 'react'; -import { connect } from 'react-redux'; -import { ListGroup } from 'react-bootstrap'; - -import Nouislider from 'react-nouislider'; -import StoreActionType from '../store/ActionTypes'; -import UiHistogram from './UiHistogram'; - - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** -/** - * Class UiTF some text later... - */ -class UiTF extends React.Component { - constructor(props) { - super(props); - //this.onUndo = this.onUndo.bind(this); - this.m_updateEnable = true; - this.onAO = this.onAO.bind(this); - this.offAO = this.offAO.bind(this); - this.onStartEr = this.onStartEr.bind(this); - this.onStopEr = this.onStopEr.bind(this); - this.onUndo = this.onUndo.bind(this); - this.onSave = this.onSave.bind(this); - } - - onAO() { - const store = this.props; - const isoThreshold = store.sliderIsosurface;//this.refs.sliderIsosurface.slider.get(); - store.volumeRenderer.setAmbientTextureMode(isoThreshold); - } - - offAO() { - const store = this.props; - store.volumeRenderer.offAmbientTextureMode(); - } - - onStartEr() { - const store = this.props; - store.volumeRenderer.setEraserStart(true); - } - - onStopEr() { - const store = this.props; - store.volumeRenderer.setEraserStart(false); - } - - onUndo() { - const store = this.props; - store.volumeRenderer.undoEraser(); - } - - onSave() { - const store = this.props; - store.volumeRenderer.volumeUpdater.updateVolumeTextureWithMask(); - console.log(`onSave`); - } - - onChangeSliderTF() { - this.m_updateEnable = false; - const aval = this.refs.sliderTF.slider.get(); - const store = this.props; - store.dispatch({ type: StoreActionType.SET_SLIDER_3DR, slider3d_r: Number.parseFloat(aval[0]) }); - store.dispatch({ type: StoreActionType.SET_SLIDER_3DG, slider3d_g: Number.parseFloat(aval[1]) }); - store.dispatch({ type: StoreActionType.SET_SLIDER_3DB, slider3d_b: Number.parseFloat(aval[2]) }); - } - - shouldComponentUpdate(nextProps) { - //return this.m_updateEnable; - let flag = this.m_updateEnable; - if (this.props.mode3d !== nextProps.mode3d) { - flag = true; - } - return flag; - //return true; - } - - onChangeSliderOpacity() { - this.m_updateEnable = false; - const aval = this.refs.sliderOpacity.slider.get(); - const store = this.props; - store.dispatch({ type: StoreActionType.SET_SLIDER_Opacity, sliderOpacity: Number.parseFloat(aval) }); - } - - onChangeSliderIsosurface() { - this.m_updateEnable = false; - const aval = this.refs.sliderIsosurface.slider.get(); - const store = this.props; - store.dispatch({ type: StoreActionType.SET_SLIDER_Isosurface, sliderIsosurface: Number.parseFloat(aval) }); - } - - onChangeSliderErRadius() { - this.m_updateEnable = false; - const aval = this.refs.sliderErRadius.slider.get(); - const store = this.props; - store.dispatch({ type: StoreActionType.SET_SLIDER_ErRadius, sliderErRadius: Number.parseFloat(aval) }); - } - - onChangeSliderErDepth() { - this.m_updateEnable = false; - const aval = this.refs.sliderErDepth.slider.get(); - const store = this.props; - store.dispatch({ type: StoreActionType.SET_SLIDER_ErDepth, sliderErDepth: Number.parseFloat(aval) }); - } - - transferFuncCallback(transfFuncObj) { - const i = transfFuncObj.m_indexMoved; - const x = transfFuncObj.m_handleX[i]; - const y = transfFuncObj.m_handleY[i]; - console.log(`moved point[${i}] = ${x}, ${y} `); - } - - /** - * Main component render func callback - */ - render() { - const store = this.props; - const mode3d = store.mode3d; - const slider3dr = store.slider3d_r; - const slider3dg = store.slider3d_g; - const slider3db = store.slider3d_b; - const sliderOpacity = store.sliderOpacity; - const sliderIsosurface = store.sliderIsosurface; - const sliderErRadius = store.sliderErRadius; - const sliderErDepth = store.sliderErDepth; - const wArr = [slider3dr, slider3dg, slider3db]; - const wArrOpacity = [sliderOpacity]; - const wArrIsosurface = [sliderIsosurface]; - const wArrErRadius = [sliderErRadius]; - const wArrErDepth = [sliderErDepth]; - - let vol = null; - const volSet = store.volumeSet; - if (volSet.getNumVolumes() > 0) { - const volIndex = store.volumeIndex; - vol = volSet.getVolume(volIndex); - } - - const NEED_TANSF_FUNC = true; - const funcTra = (NEED_TANSF_FUNC) ? this.transferFuncCallback : undefined; - //store.volumeRenderer.updateTransferFuncTexture(this.m_transfFunc.m_handleX, this.m_transfFunc.m_handleY); - /* - const styleObj = { - margin: '30px 0px 0px' - }; - */ - const jsxVolumeTF = - <ListGroup> - <ListGroup.Item> - <UiHistogram volume={vol} transfFunc={funcTra} /> - </ListGroup.Item> - <ListGroup.Item> - <p> Set </p> - <Nouislider onSlide={this.onChangeSliderTF.bind(this)} ref={'sliderTF'} - range={{ min: 0.0, max: 1.0 }} - start={wArr} connect={[false, true, false, true]} step={0.02} tooltips={true} /> - </ListGroup.Item> - <ListGroup.Item> - <p> Opacity </p> - <Nouislider onSlide={this.onChangeSliderOpacity.bind(this)} ref={'sliderOpacity'} - range={{ min: 0.0, max: 1.0 }} - start={wArrOpacity} connect={[true, false]} step={0.02} tooltips={true} /> - </ListGroup.Item> - </ListGroup>; - - const jsxIsoTF = - <ul className="list-group"> - <li className="list-group-item"> - <UiHistogram volume={vol} transfFunc={funcTra} /> - </li> - <li className="list-group-item"> - <p> Isosurface </p> - <Nouislider onSlide={this.onChangeSliderIsosurface.bind(this)} ref={'sliderIsosurface'} - range={{ min: 0.0, max: 1.0 }} - start={wArrIsosurface} connect={[true, false]} step={0.02} tooltips={true} /> - </li> - <li className="list-group-item"> - Ambient Oclusion -> - <button type="button" className={'btn btn-outline-dark'} onClick={this.onAO} > - On - </button> - <button type="button" className={'btn btn-outline-dark'} onClick={this.offAO} > - Off - </button> - <button type="button" className={'btn btn-outline-dark'} onClick={this.onAO} > - Reset - </button> - </li> - </ul> - const jsxEreaser = - <div className="card"> - <div className="card-header"> - Press Control + Mouse Down [+ Mouse Move] for erease - </div> - <ul className="list-group list-group-flush"> - <li className="list-group-item"> - <p> Radius </p> - <Nouislider onSlide={this.onChangeSliderErRadius.bind(this)} ref={'sliderErRadius'} - range={{ min: 1.0, max: 100.0 }} - start={wArrErRadius} connect={[true, false]} step={0.02} tooltips={true} /> - </li> - <li className="list-group-item"> - <p> Depth </p> - <Nouislider onSlide={this.onChangeSliderErDepth.bind(this)} ref={'sliderErDepth'} - range={{ min: 1.0, max: 100.0 }} - start={wArrErDepth} connect={[true, false]} step={0.02} tooltips={true} /> - </li> - <li className="list-group-item"> - <p> Isosurface </p> - <Nouislider onSlide={this.onChangeSliderIsosurface.bind(this)} ref={'sliderIsosurface'} - range={{ min: 0.0, max: 1.0 }} - start={wArrIsosurface} connect={[true, false]} step={0.02} tooltips={true} /> - </li> - <li className="list-group-item"> - <button type="button" className={'btn btn-outline-dark'} onClick={this.onUndo} > - Undo - </button> - <button type="button" className={'btn btn-outline-dark'} onClick={this.onSave} > - Save - </button> - </li> - </ul> - </div> - - const jsxRayfastTF = null - - console.log(`UiTF . mode = ${mode3d}`); - const jsxArray = [jsxIsoTF, jsxVolumeTF, jsxRayfastTF, jsxEreaser]; - const jsxRet = jsxArray[mode3d]; - return jsxRet; - } -} - -export default connect(store => store)(UiTF); diff --git a/src/demo/ui/UiTFroi.js b/src/demo/ui/UiTFroi.js deleted file mode 100644 index 028b547c..00000000 --- a/src/demo/ui/UiTFroi.js +++ /dev/null @@ -1,115 +0,0 @@ -/** - * @fileOverview UiTF - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -// special css for NoUiSlioder -import 'nouislider/distribute/nouislider.css'; -import React from 'react'; -import { connect } from 'react-redux'; - -import Nouislider from 'react-nouislider'; -import StoreActionType from '../store/ActionTypes'; - - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** -/** - * Class UiTF some text later... - */ -class UiTFroi extends React.Component { - constructor(props) { - super(props); - this.m_updateEnable = true; - } - - shouldComponentUpdate(nextProps) { - //return this.m_updateEnable; - let flag = this.m_updateEnable; - if (this.props.mode3d !== nextProps.mode3d) { - flag = true; - } - return flag; - } - - onChangeSliderTF() { - this.m_updateEnable = false; - const aval = this.refs.sliderTF.slider.get(); - const store = this.props; - store.dispatch({ type: StoreActionType.SET_SLIDER_3DR, slider3d_r: Number.parseFloat(aval[0]) }); - store.dispatch({ type: StoreActionType.SET_SLIDER_3DG, slider3d_g: Number.parseFloat(aval[1]) }); - } - - onChangeSliderOpacity() { - this.m_updateEnable = false; - const aval = this.refs.sliderOpacity.slider.get(); - const store = this.props; - store.dispatch({ type: StoreActionType.SET_SLIDER_Opacity, sliderOpacity: Number.parseFloat(aval) }); - } - - onChangeSliderIsosurface() { - this.m_updateEnable = false; - const aval = this.refs.sliderIsosurface.slider.get(); - const store = this.props; - store.dispatch({ type: StoreActionType.SET_SLIDER_Isosurface, sliderIsosurface: Number.parseFloat(aval) }); - } - - /** - * Main component render func callback - const jsxRet = jsxArray[mode3d]; - */ - render() { - const store = this.props; - let mode3d = store.mode3d; - if (mode3d > 1) { - mode3d = 1; - } - const slider3dr = store.slider3d_r; - const slider3dg = store.slider3d_g; - const wArr = [slider3dr, slider3dg]; - const sliderOpacity = store.sliderOpacity; - const sliderIsosurface = store.sliderIsosurface; - const wArrOpacity = [sliderOpacity]; - const wArrIsosurface = [sliderIsosurface]; - - const jsxVolumeTF = - <ul className="list-group" > - <li className="list-group-item"> - <Nouislider onSlide={this.onChangeSliderTF.bind(this)} ref={'sliderTF'} - range={{ min: 0.0, max: 1.0 }} - start={wArr} connect={[false, true, false]} step={0.02} tooltips={true} /> - </li> - <li className="list-group-item"> - <p> Opacity </p> - <Nouislider onSlide={this.onChangeSliderOpacity.bind(this)} ref={'sliderOpacity'} - range={{ min: 0.0, max: 1.0 }} - start={wArrOpacity} connect={[false, true]} step={0.02} tooltips={true} /> - </li> - </ul> - const jsxIsoTF = - <ul className="list-group"> - <li className="list-group-item"> - <p> Isosurface </p> - <Nouislider onSlide={this.onChangeSliderIsosurface.bind(this)} ref={'sliderIsosurface'} - range={{ min: 0.0, max: 1.0 }} - start={wArrIsosurface} connect={[false, true]} step={0.02} tooltips={true} /> - </li> - </ul> - const jsxArray = [jsxIsoTF, jsxVolumeTF]; - const jsxRet = jsxArray[1]; - return jsxRet; - } -} - -export default connect(store => store)(UiTFroi); diff --git a/src/demo/ui/UiTools2d.js b/src/demo/ui/UiTools2d.js deleted file mode 100644 index 043527b7..00000000 --- a/src/demo/ui/UiTools2d.js +++ /dev/null @@ -1,115 +0,0 @@ -/** - * @fileOverview UiTools2d - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; - -import StoreActionType from '../store/ActionTypes'; -import Tools2dType from '../engine/tools2d/ToolTypes'; - -import { OverlayTrigger, Tooltip } from 'react-bootstrap'; - -// ******************************************************** -// Class -// ******************************************************** -class UiTools2d extends React.Component { - constructor(props) { - super(props); - this.onClickButtonTools = this.onClickButtonTools.bind(this); - this.state = { - data: [ - { img: 'images/icon_tools2d_intensity.png', txt: 'intensity', ke: Tools2dType.INTENSITY, msgTp: 'Get voxel intensity' }, - { img: 'images/icon_tools2d_distance.png', txt: 'distance', ke: Tools2dType.DISTANCE, msgTp: 'Measure distance between voxels' }, - { img: 'images/icon_tools2d_angle.png', txt: 'angle', ke: Tools2dType.ANGLE, msgTp: 'Measure angle between lines' }, - { img: 'images/icon_tools2d_area.png', txt: 'area', ke: Tools2dType.AREA, msgTp: 'Calculate arbitrary area' }, - { img: 'images/icon_tools2d_rect.png', txt: 'rect', ke: Tools2dType.RECT, msgTp: 'Calculate rectangular area' }, - { img: 'images/icon_tools2d_text.png', txt: 'text', ke: Tools2dType.TEXT, msgTp: 'Add annotation text' }, - { img: 'images/icon_tools2d_edit.png', txt: 'edit', ke: Tools2dType.EDIT, msgTp: 'Move annotation text' }, - { img: 'images/icon_tools2d_delete.png', txt: 'delete', ke: Tools2dType.DELETE, msgTp: 'Delete annotation object' }, - { img: 'images/icon_tools2d_clear.png', txt: 'clear', ke: Tools2dType.CLEAR, msgTp: 'Clear all objects' }, - { img: 'images/icon_tools2d_zoom.png', txt: 'zoom', ke: Tools2dType.ZOOM, msgTp: 'Zoom in/out' }, - { img: 'images/icon_tools2d_default.png', txt: 'default', ke: Tools2dType.DEFAULT, msgTp: 'Zoom to default' }, - // { img: 'images/icon_tools2d_filter.png', txt: 'filter', ke: Tools2dType.FILTER }, - { img: 'images/icon_tools2d_empty.png', txt: 'none', ke: Tools2dType.NONE, msgTp: 'Empty' }, - ], - }; - } - - onClickButtonTools(evt) { - // console.log('UiTools2d. onClickButtonTools'); - const btn = evt.target; - const idx = this.state.data.findIndex(obj => (obj.txt === btn.alt) ); - if (idx >= 0) { - // set new toools 2s index to global store - const store = this.props; - store.dispatch({ type: StoreActionType.SET_2D_TOOLS_INDEX, indexTools2d: idx }); - // console.log(`UiTools2d. onClickButton index = ${idx}`); - if( idx === Tools2dType.DEFAULT) { - store.dispatch({ type: StoreActionType.SET_2D_ZOOM, render2dZoom: 1.0 }); - store.dispatch({ type: StoreActionType.SET_2D_X_POS, render2dxPos: 0.0 }); - store.dispatch({ type: StoreActionType.SET_2D_Y_POS, render2dyPos: 0.0 }); - - const gra = store.graphics2d; - gra.forceUpdate(); - gra.forceRender(); - } - if( idx === Tools2dType.CLEAR) { - const gra2d = store.graphics2d; - if (gra2d !== null) { - gra2d.clear(); - } - } - - } // if button index valid - } // end of onClickButtonTools - - render() { - const strTitle = 'Tools'; - - const store = this.props; - const indexCur = store.indexTools2d; - - const jsx = - <div className="card" > - <div className="card-header"> - {strTitle} - </div> - <div className="card-body"> - <div className="btn-group row"> - - {this.state.data.map(d => - { - const strAttr = (indexCur === d.ke) ? 'col-2 btn btn-outline-secondary' : 'col-2 btn'; - - const jsxBtn = <button type='button' className={strAttr} key={d.ke} id={d.ke} onClick={this.onClickButtonTools} > - <img className='img-thumbnail' src={d.img} alt={d.txt} /> - </button> - const msgTooltip = d.msgTp; - const jsxOverlay = <OverlayTrigger key={d.txt} placement="bottom" overlay={ - <Tooltip> - {msgTooltip} - </Tooltip> - }> - {jsxBtn} - </OverlayTrigger> - - return jsxOverlay; - })} - - </div> - </div> - </div> - return jsx; - } -} - -export default connect(store => store)(UiTools2d); - diff --git a/src/demo/ui/UiViewMode.js b/src/demo/ui/UiViewMode.js deleted file mode 100644 index d4f87b77..00000000 --- a/src/demo/ui/UiViewMode.js +++ /dev/null @@ -1,208 +0,0 @@ -/** - * @fileOverview UiViewMode - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - - -import React from 'react'; -import { connect } from 'react-redux'; -import { ButtonToolbar, Button, ButtonGroup } from 'react-bootstrap'; -import { OverlayTrigger, Tooltip } from 'react-bootstrap'; - -import ModeView from '../store/ModeView'; -import StoreActionType from '../store/ActionTypes'; - -// ******************************************************** -// Class -// ******************************************************** - - - -/** - * Class UiViewMode some text later... - */ -class UiViewMode extends React.Component { - /** - * @param {object} props - props from up level object - */ - constructor(props) { - super(props); - - // main view configuration - // setup true, where you want to see mode renderer - // - this.m_needModeMpr = true; - this.m_needMode2d = true; - this.m_needMode3dLight = true; - this.m_needMode3d = true; - - this.onModeMpr = this.onModeMpr.bind(this); - this.onMode2d = this.onMode2d.bind(this); - this.onMode3dLight = this.onMode3dLight.bind(this); - this.onMode3d = this.onMode3d.bind(this); - this.onTool3d = this.onTool3d.bind(this); - this.onView3d = this.onView3d.bind(this); - } - - onMode(indexMode) { - const store = this.props; - store.dispatch({ type: StoreActionType.SET_MODE_VIEW, modeView: indexMode }); - } - - onTool_View(isOn) { - const store = this.props; - store.dispatch({ type: StoreActionType.SET_IS_TOOL3D, isTool3D: isOn }); - store.dispatch({ type: StoreActionType.SET_SLIDER_Contrast3D, sliderContrast3D: 0 }); - } - - onModeMpr() { - this.onMode(ModeView.VIEW_MPR); - } - - onMode2d() { - this.onMode(ModeView.VIEW_2D); - } - - onMode3dLight() { - this.onMode(ModeView.VIEW_3D_LIGHT); - } - - onMode3d() { - this.onMode(ModeView.VIEW_3D); - } - - onTool3d() { - this.onTool_View(true); - } - - onView3d() { - this.onTool_View(false); - } - - logObject(strTitle, obj) { - let str = ''; - for (let prp in obj) { - if (str.length > 0) { - str += '\n'; - } - str += prp + ' = ' + obj[prp]; - } - console.log(`${strTitle}\n${str}`); - } - - render() { - const store = this.props; - // this.logObject('UiViewMode this props: ', store); - let viewMode = store.modeView; - let isTool3D = store.isTool3D; - if ((viewMode === ModeView.VIEW_MPR) && (!this.m_needModeMpr)) { - viewMode = ModeView.VIEW_2D; - } - if ((viewMode === ModeView.VIEW_3D_LIGHT) && (!this.m_needMode3dLight)) { - viewMode = ModeView.VIEW_2D; - } - if ((viewMode === ModeView.VIEW_3D) && (!this.m_needMode3d)) { - viewMode = ModeView.VIEW_2D; - } - if ((viewMode === ModeView.VIEW_2D) && (!this.m_needMode2d)) { - viewMode = ModeView.VIEW_3D; - } - - // const strMpr = (viewMode === ModeView.VIEW_MPR) ? 'primary' : 'secondary'; - const str2d = (viewMode === ModeView.VIEW_2D) ? 'primary' : 'secondary'; - const str3dLight = (viewMode === ModeView.VIEW_3D_LIGHT) ? 'primary' : 'secondary'; - const str3d = (viewMode === ModeView.VIEW_3D) ? 'primary' : 'secondary'; - - const strTool3Don = (viewMode === ModeView.VIEW_3D_LIGHT && isTool3D === true) ? 'primary' : 'secondary'; - const strTool3Doff = (viewMode === ModeView.VIEW_3D_LIGHT && isTool3D === false) ? 'primary' : 'secondary'; - - const jsx3d = - <OverlayTrigger key="3d" placement="bottom" overlay={ - <Tooltip> - Show volume in 3d mode with old rendering - </Tooltip> - }> - <Button variant={str3d} onClick={this.onMode3d} > - 3D - </Button> - </OverlayTrigger> - - const jsxViewTool = - <ButtonGroup className="mr-2" aria-label="Top group"> - <OverlayTrigger key="view" placement="bottom" overlay={ - <Tooltip> - Show volume in 3d mode with fast rendering - </Tooltip> - }> - <Button variant={strTool3Doff} onClick={this.onView3d} > - View - </Button> - </OverlayTrigger> - <OverlayTrigger key="tool" placement="bottom" overlay={ - <Tooltip> - Show volume in 2d mode per slice on selected orientation - </Tooltip> - }> - <Button variant={strTool3Don} onClick={this.onTool3d} > - Tool - </Button> - </OverlayTrigger> - </ButtonGroup> - - const FOUR = 4; - let needShow3d = false; - - const volSet = store.volumeSet; - if (volSet.getNumVolumes() > 0) { - const volIndex = store.volumeIndex; - const vol = volSet.getVolume(volIndex); - if (vol !== null) { - if (vol.m_bytesPerVoxel !== FOUR) { - needShow3d = true; - } - } - } // if more 0 volumes - const test = true; - const jsxOut = - <ButtonToolbar ria-label="Toolbar with button groups"> - <ButtonGroup className="mr-2" aria-label="Top group"> - - <OverlayTrigger key="2d" placement="bottom" overlay={ - <Tooltip> - Show volume in 2d mode per slice on selected orientation - </Tooltip> - }> - - <Button variant={str2d} onClick={this.onMode2d} > - 2D - </Button> - </OverlayTrigger> - - <OverlayTrigger key="3dLight" placement="bottom" overlay={ - <Tooltip> - Show volume in 3d mode with fast rendering - </Tooltip> - }> - - <Button variant={str3dLight} onClick={this.onMode3dLight} > - 3D - <span className="fa fa-bolt"></span> - </Button> - - </OverlayTrigger> - {(needShow3d) ? jsx3d : ''} - </ButtonGroup> - {(viewMode === ModeView.VIEW_3D_LIGHT && test) ? jsxViewTool : ''} - </ButtonToolbar> - - return jsxOut; - } -} - -export default connect(store => store)(UiViewMode); diff --git a/src/demo/ui/UiVolIcon.js b/src/demo/ui/UiVolIcon.js deleted file mode 100644 index c4c56ff8..00000000 --- a/src/demo/ui/UiVolIcon.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * @fileOverview UiVolIcon - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; -import { VOLUME_ICON_SIDE } from '../engine/Volume'; - -// ******************************************************** -// Class -// ******************************************************** - -class UiVolIcon extends React.Component { - constructor(props) { - super(props); - this.m_volIndex = -1; - } - - componentDidMount() { - // console.log("UiVlIcon.componentDidMount"); - const store = this.props; - const volSet = store.volumeSet; - const vol = volSet.getVolume(this.m_volIndex); - // console.log(`vol icon = ${vol.m_xIcon} * ${vol.m_yIcon}`); - - const objCanvas = this.m_mount; - if (objCanvas === null) { - return; - } - const ctx = objCanvas.getContext('2d'); - const w = objCanvas.clientWidth; - const h = objCanvas.clientHeight; - if (w * h === 0) { - return; - } - // clear dest image - ctx.fillStyle = 'rgb(64, 64, 64)'; - ctx.fillRect(0,0, w, h); - - if (vol.m_xIcon <= 0) { - // draw cross on whole image - ctx.beginPath(); - ctx.moveTo(0, 0); - ctx.lineTo(w - 1, h - 1); - ctx.stroke(); - - ctx.beginPath(); - ctx.moveTo(w - 1, 0); - ctx.lineTo(0, h - 1); - ctx.stroke(); - return; - } - // copy icon data to screen - const imgData = ctx.createImageData(w, h); - const dataDst = imgData.data; - const numPixels = w * h; - let j = 0; - for (let i = 0; i < numPixels; i++) { - const val = vol.m_dataIcon[i]; - dataDst[j + 0] = val; - dataDst[j + 1] = val; - dataDst[j + 2] = val; - dataDst[j + 3] = 255; - j += 4; - } - ctx.putImageData(imgData, 0, 0); - } - - // render on screen - render() { - const side = VOLUME_ICON_SIDE; - this.m_volIndex = this.props.index;; - const jsxCanvas = <canvas ref={ (mount) => {this.m_mount = mount} } width={side} height={side} /> - return jsxCanvas; - } - -} // end class UiVolIcon -export default connect(store => store)(UiVolIcon); diff --git a/src/demo/ui/UiVolumeSel.js b/src/demo/ui/UiVolumeSel.js deleted file mode 100644 index f8baffad..00000000 --- a/src/demo/ui/UiVolumeSel.js +++ /dev/null @@ -1,140 +0,0 @@ -/** - * @fileOverview UiVolumeSel - * @author Epam - * @version 1.0.0 - */ - - -// ******************************************************** -// Imports -// ******************************************************** - -import React from 'react'; -import { connect } from 'react-redux'; - -import { Card, ListGroup, ListGroupItem } from 'react-bootstrap'; - -import StoreActionType from '../store/ActionTypes'; -// import LoaderDicom from '../engine/loaders/LoaderDicom'; -import Texture3D from '../engine/Texture3D'; -// import ModeView from '../store/ModeView'; -// import Modes3d from '../store/Modes3d'; - -import UiVolIcon from './UiVolIcon'; - -// ******************************************************** -// Const -// ******************************************************** - -const NEED_TEXTURE_SIZE_4X = true; - -// ******************************************************** -// Class -// ******************************************************** -class UiVolumeSel extends React.Component { - constructor(props) { - super(props); - this.onClickRow = this.onClickRow.bind(this); - // this.state = { - // index: 0, - // }; - } - - setVolumeIndex(indexSelected) { - const store = this.props; - // const series = store.dicomSeries; - // const serieSelected = series[indexSelected]; - // const hash = serieSelected.m_hash; - const volumeSet = store.volumeSet; - - // const loaderDicom = store.loaderDicom; - - // volumes are already created from slices - // loaderDicom.createVolumeFromSlices(volumeSet, indexSelected, hash); - - // finalize load - const vol = volumeSet.getVolume(indexSelected); - console.assert(vol !== null, "setVolumeIndex: vol should be non zero volume"); - - if (vol.m_dataArray !== null) { - // console.log(`success loaded volume from ${fileNameIn}`); - if (NEED_TEXTURE_SIZE_4X) { - vol.makeDimensions4x(); - } - // invoke notification - - // send update (repaint) if was loaded prev model - if (store.isLoaded) { - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); - } - - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: volumeSet }); - store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: indexSelected }); - // store.dispatch({ type: StoreActionType.SET_FILENAME, fileName: fileNameIn }); - // store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: [] }); - const tex3d = new Texture3D(); - tex3d.createFromRawVolume(vol); - store.dispatch({ type: StoreActionType.SET_TEXTURE3D, texture3d: tex3d }); - // store.dispatch({ type: StoreActionType.SET_MODE_VIEW, modeView: ModeView.VIEW_2D }); - // store.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); - - const gra = store.graphics2d; - gra.clear(); - gra.forceUpdate(indexSelected); - gra.forceRender(); - - } // if vol data not null - } - - onClickRow(ind) { - console.assert(typeof(ind) == 'number'); - const store = this.props; - if (ind !== store.volumeIndex) { - // set global selected volume index - store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: ind }); - this.setVolumeIndex(ind); - } - } - - render() { - const store = this.props; - const volumeSet = store.volumeSet; - const vols = volumeSet.m_volumes; - const volumeIndex = store.volumeIndex; - - const strPatName = store.dicomInfo.m_patientName; - const strStudyDescr = store.dicomInfo.m_studyDescr; - const strTitle = `Volume select. [${strPatName}]: ${strStudyDescr}`; - - // const slices = store.dicomInfo.m_sliceInfo; - - const jsx = - <Card> - <Card.Header> - {strTitle} - </Card.Header> - <Card.Body> - <ListGroup> - {vols.map( (vol, i) => { - const numSlices = vol.m_zDim; - const strSer = vol.m_seriesDescr; - const strVo = `vol ${strSer} [${numSlices}] slices`; - let jsxListItem; - if (i === volumeIndex) { - jsxListItem = <ListGroupItem key={i} onClick={() => {this.onClickRow(i)} } active>{strVo} <UiVolIcon index={i} /> </ListGroupItem>; - } else { - jsxListItem = <ListGroupItem key={i} onClick={() => {this.onClickRow(i)} }>{strVo} <UiVolIcon index={i} /> </ListGroupItem>; - } - return jsxListItem; - })} - </ListGroup> - - </Card.Body> - </Card> - return jsx; - } -} - -export default connect(store => store)(UiVolumeSel); - diff --git a/src/demo/engine/Eraser.js b/src/engine/Eraser.js similarity index 89% rename from src/demo/engine/Eraser.js rename to src/engine/Eraser.js index f872f24e..2ed18cad 100644 --- a/src/demo/engine/Eraser.js +++ b/src/engine/Eraser.js @@ -1,15 +1,9 @@ -/** - * @fileOverview Eraser - * @author Epam - * @version 1.0.0 +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 */ -// ******************************************************** -// Imports -// ********************************************************/** + import * as THREE from 'three'; -// ******************************************************** -// Class Eraser is used for erasing of volume data part -// ******************************************************** export default class Eraser { constructor() { this.bufferBF = null; @@ -70,8 +64,7 @@ export default class Eraser { const GPU_CELL_SIZE = 4; const cellInd = (y * windowWidth + x) * GPU_CELL_SIZE; const THREE3 = 3; - const bigCellInd = (Math.floor(y / THREE3) * Math.floor(windowWidth / THREE3) + - Math.floor(x / THREE3)) * GPU_CELL_SIZE; + const bigCellInd = (Math.floor(y / THREE3) * Math.floor(windowWidth / THREE3) + Math.floor(x / THREE3)) * GPU_CELL_SIZE; const dist = this.bufferRenderToTexture[bigCellInd + OFF3]; const NO_MATERIAL = 2; if (dist === NO_MATERIAL) { @@ -83,9 +76,9 @@ export default class Eraser { const vDir = new THREE.Vector3(vX, vY, vZ); const length = Math.sqrt(vX * vX + vY * vY + vZ * vZ); const COORD_SHIFT = 0.5; - vX = vX / length * dist + COORD_SHIFT + this.bufferFF[cellInd + OFF0]; - vY = vY / length * dist + COORD_SHIFT + this.bufferFF[cellInd + OFF1]; - vZ = vZ / length * dist + COORD_SHIFT + this.bufferFF[cellInd + OFF2]; + vX = (vX / length) * dist + COORD_SHIFT + this.bufferFF[cellInd + OFF0]; + vY = (vY / length) * dist + COORD_SHIFT + this.bufferFF[cellInd + OFF1]; + vZ = (vZ / length) * dist + COORD_SHIFT + this.bufferFF[cellInd + OFF2]; this.erasePixels(vX, vY, vZ, vDir, startflag, dist); this.updatableTextureMask.needsUpdate = true; } @@ -136,11 +129,11 @@ export default class Eraser { nZ += curVal * gauss * (-k / SIGMA2); } } - }// end gauss summation + } // end gauss summation normalGauss.set(nX / normFactor, nY / normFactor, nZ / normFactor); normal.copy(normalGauss); normal.normalize(); - const pi = 180;// pi (just for console output) + const pi = 180; // pi (just for console output) const radiusRatio = this.xDim / this.zDim; const geometry = new THREE.CylinderGeometry(this.radius, this.radius, this.depth, pi, this.depth); const mesh = new THREE.Mesh(geometry, null); @@ -170,8 +163,11 @@ export default class Eraser { RotPoint.applyAxisAngle(new THREE.Vector3(1, 0, 0), -mesh.rotation.x); RotPoint.applyAxisAngle(new THREE.Vector3(0, 1, 0), -mesh.rotation.y); RotPoint.applyAxisAngle(new THREE.Vector3(0, 0, 1), mesh.rotation.z); - if (Math.sqrt(RotPoint.x * RotPoint.x + RotPoint.y * RotPoint.y) > this.radius || - Math.abs(RotPoint.z) > this.depth || RotPoint.z < backZ) { + if ( + Math.sqrt(RotPoint.x * RotPoint.x + RotPoint.y * RotPoint.y) > this.radius || + Math.abs(RotPoint.z) > this.depth || + RotPoint.z < backZ + ) { continue; } for (let x = this.point.x - 1; x <= this.point.x + 1; x++) { @@ -201,11 +197,9 @@ export default class Eraser { this.lastDepth.push(this.depth); this.lastRotationVector.push(new THREE.Vector3(-mesh.rotation.x, -mesh.rotation.y, mesh.rotation.z)); this.lastTarget.push(new THREE.Vector3(targetX, targetY, targetZ)); - this.lastBackDistance.push(-Math.round(Math.abs(Math.tan(vDir.normalize().angleTo(normalGauss.normalize()))) - * (this.radius))); - } + this.lastBackDistance.push(-Math.round(Math.abs(Math.tan(vDir.normalize().angleTo(normalGauss.normalize()))) * this.radius)); + } this.updatableTextureMask.needsUpdate = true; - } else { this.resetflag = false; } @@ -232,8 +226,7 @@ export default class Eraser { RotPoint.applyAxisAngle(new THREE.Vector3(1, 0, 0), lastRotation.x); RotPoint.applyAxisAngle(new THREE.Vector3(0, 1, 0), lastRotation.y); RotPoint.applyAxisAngle(new THREE.Vector3(0, 0, 1), lastRotation.z); - if (Math.sqrt(RotPoint.x * RotPoint.x + RotPoint.y * RotPoint.y) > rxy || - RotPoint.z > lastDepth || RotPoint.z < lastback) { + if (Math.sqrt(RotPoint.x * RotPoint.x + RotPoint.y * RotPoint.y) > rxy || RotPoint.z > lastDepth || RotPoint.z < lastback) { continue; } let offDst = 0; diff --git a/src/engine/GlSelector.js b/src/engine/GlSelector.js new file mode 100644 index 00000000..ecad01c6 --- /dev/null +++ b/src/engine/GlSelector.js @@ -0,0 +1,49 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +// import * as THREE from 'three'; + +/** + * OpenGL, WebGL renderer selector + * @module lib/scripts/graphics3d/glselector + */ + +export default class GlSelector { + /** constructor: defines fields + * @constructor + */ + constructor() { + this.m_useWebGL2 = undefined; + } + + /** Create compatible canvas + * + */ + createWebGLContext() { + this.canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas'); + let context = this.canvas.getContext('webgl2'); + this.m_useWebGL2 = 1; + if (context == null) { + console.log('WebGL 2 not supported, moving to webgl 1'); + context = this.canvas.getContext('webgl'); + this.m_useWebGL2 = 0; + } else { + console.log('WebGL 2 context created'); + } + return context; + } + + /** return canvas */ + getCanvas() { + return this.canvas; + } + + /** Create compatible canvas + * + */ + useWebGL2() { + return this.m_useWebGL2; + } +} diff --git a/src/engine/Graphics2d.js b/src/engine/Graphics2d.js new file mode 100644 index 00000000..02807fd8 --- /dev/null +++ b/src/engine/Graphics2d.js @@ -0,0 +1,721 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React from 'react'; +import { connect } from 'react-redux'; + +import Modes2d from '../store/Modes2d'; +import StoreActionType from '../store/ActionTypes'; +import ToolPick from './tools2d/ToolPick'; +import ToolDistance from './tools2d/ToolDistance'; +import ToolAngle from './tools2d/ToolAngle'; +import ToolArea from './tools2d/ToolArea'; +import ToolRect from './tools2d/ToolRect'; +import ToolText from './tools2d/ToolText'; +import ToolEdit from './tools2d/ToolEdit'; +import ToolDelete from './tools2d/ToolDelete'; + +import Tools2dType from './tools2d/ToolTypes'; +import Segm2d from './Segm2d'; + +import { getPalette256 } from './loaders/RoiPalette256'; + +class Graphics2d extends React.Component { + constructor(props) { + super(props); + + this.m_mount = React.createRef(); + + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); + this.onMouseMove = this.onMouseMove.bind(this); + this.onMouseWheel = this.onMouseWheel.bind(this); + + this.m_sliceRatio = 0.5; + this.m_mode2d = Modes2d.TRANSVERSE; + + // scale + this.m_zoom = 1; + this.m_xPos = 0; + this.m_yPos = 0; + + // mounted + this.m_isMounted = false; + + // animation + // this.animate = this.animate.bind(this); + // this.m_frameId = null; + + // actual render window dimenison + this.state = { + wRender: 0, + hRender: 0, + stateMouseDown: false, + xMouse: -1, + yMouse: -1, + }; + + // segm 2d + this.segm2d = new Segm2d(this); + this.m_isSegmented = false; + + // tools2d + this.m_toolPick = new ToolPick(this); + this.m_toolDistance = new ToolDistance(this); + this.m_toolAngle = new ToolAngle(this); + this.m_toolArea = new ToolArea(this); + this.m_toolRect = new ToolRect(this); + this.m_toolText = new ToolText(this); + this.m_toolEdit = new ToolEdit(this); + this.m_toolDelete = new ToolDelete(this); + + // store + props.dispatch({ type: StoreActionType.SET_GRAPHICS_2D, graphics2d: this }); + } + + componentDidMount() { + this.m_isMounted = true; + this.prepareImageForRender(); + this.renderReadyImage(); + + const w = this.m_mount.current.clientWidth; + const h = this.m_mount.current.clientHeight; + if (this.state.wRender === 0) { + this.setState({ wRender: w }); + this.setState({ hRender: h }); + } + } + + componentWillUnmount() { + this.m_isMounted = false; + } + + componentDidUpdate() { + if (this.m_isMounted) { + this.renderReadyImage(); + } + } + + screenshot() { + return this.m_mount.current.toDataURL(); + } + + prepareImageForRender(volIndexArg) { + //TODO: center the image by click + const objCanvas = this.m_mount.current; // Canvas HTML element reference + if (objCanvas === null) { + return; + } + // resetting canvas max sizes, by checking its wrapper's size + const canvasWrapper = objCanvas.parentNode; + const w = canvasWrapper.clientWidth; + const h = canvasWrapper.clientHeight; + if (w * h === 0) { + return; + } + + const ctx = objCanvas.getContext('2d'); + ctx.fillStyle = 'rgb(64, 64, 64)'; + ctx.fillRect(0, 0, w, h); + + const store = this.props; + const volSet = store.volumeSet; + // const volIndex = this.m_volumeIndex; + const volIndex = volIndexArg !== undefined ? volIndexArg : store.volumeIndex; + + const vol = volSet.getVolume(volIndex); + const mode2d = this.m_mode2d; + const sliceRatio = store.sliceRatio; + + if (vol === null) return; + + if (vol.m_dataArray === null) { + console.log('Graphics2d. Volume has no data array'); + return; + } + const xDim = vol.m_xDim; + const yDim = vol.m_yDim; + const zDim = vol.m_zDim; + const xyDim = xDim * yDim; + const dataSrc = vol.m_dataArray; // 1 or 4 bytes array of pixels + if (dataSrc.length !== xDim * yDim * zDim * vol.m_bytesPerVoxel) { + console.log(`Bad src data len = ${dataSrc.length}, but expect ${xDim}*${yDim}*${zDim}`); + } + + // console.log(`Graphics2d. prepareImageForRender. mode= ${mode2d}`); + + const ONE = 1; + const FOUR = 4; + const OFF_3 = 3; + + let imgData = null; + let dataDst = null; + + const roiPal256 = getPalette256(); + + // determine actual render square (not w * h - viewport) + // calculate area using physical volume dimension + const TOO_SMALL = 1.0e-5; + const pbox = vol.m_boxSize; + if (pbox.x * pbox.y * pbox.z < TOO_SMALL) { + console.log(`Bad physical dimensions for rendered volume = ${pbox.x}*${pbox.y}*${pbox.z} `); + } + let wScreen = 0, + hScreen = 0; + + const xPos = store.render2dxPos; + const yPos = store.render2dyPos; + const zoom = store.render2dZoom; + + if (mode2d === Modes2d.TRANSVERSE) { + // calc screen rect based on physics volume slice size (z slice) + const xyRratio = pbox.x / pbox.y; + wScreen = w; + hScreen = Math.floor(w / xyRratio); + if (hScreen > h) { + hScreen = h; + wScreen = Math.floor(h * xyRratio); + if (wScreen > w) { + console.log(`logic error! wScreen * hScreen = ${wScreen} * ${hScreen}`); + } + } + hScreen = hScreen > 0 ? hScreen : 1; + + // console.log(`gra2d. render: wScreen*hScreen = ${wScreen} * ${hScreen}, but w*h=${w}*${h} `); + + this.m_toolPick.setScreenDim(wScreen, hScreen); + this.m_toolDistance.setScreenDim(wScreen, hScreen); + this.m_toolAngle.setScreenDim(wScreen, hScreen); + this.m_toolArea.setScreenDim(wScreen, hScreen); + this.m_toolRect.setScreenDim(wScreen, hScreen); + this.m_toolText.setScreenDim(wScreen, hScreen); + this.m_toolEdit.setScreenDim(wScreen, hScreen); + this.m_toolDelete.setScreenDim(wScreen, hScreen); + + // setup pixel size for 2d tools + const xPixelSize = vol.m_boxSize.x / xDim; + const yPixelSize = vol.m_boxSize.y / yDim; + // console.log(`xyPixelSize = ${xPixelSize} * ${yPixelSize}`); + this.m_toolDistance.setPixelSize(xPixelSize, yPixelSize); + this.m_toolAngle.setPixelSize(xPixelSize, yPixelSize); + this.m_toolArea.setPixelSize(xPixelSize, yPixelSize); + this.m_toolRect.setPixelSize(xPixelSize, yPixelSize); + this.m_toolText.setPixelSize(xPixelSize, yPixelSize); + this.m_toolEdit.setPixelSize(xPixelSize, yPixelSize); + this.m_toolDelete.setPixelSize(xPixelSize, yPixelSize); + + // create image data + imgData = ctx.createImageData(wScreen, hScreen); + dataDst = imgData.data; + if (dataDst.length !== wScreen * hScreen * 4) { + console.log(`Bad dst data len = ${dataDst.length}, but expect ${wScreen}*${hScreen}*4`); + } + + // z slice + let zSlice = Math.floor(zDim * sliceRatio); + zSlice = zSlice < zDim ? zSlice : zDim - 1; + const zOff = zSlice * xyDim; + const xStep = (zoom * xDim) / wScreen; + const yStep = (zoom * yDim) / hScreen; + let j = 0; + let ay = yPos * yDim; + if (vol.m_bytesPerVoxel === ONE) { + for (let y = 0; y < hScreen; y++, ay += yStep) { + const ySrc = Math.floor(ay); + const yOff = ySrc * xDim; + let ax = xPos * xDim; + for (let x = 0; x < wScreen; x++, ax += xStep) { + const xSrc = Math.floor(ax); + const val = dataSrc[zOff + yOff + xSrc]; + dataDst[j + 0] = val; + dataDst[j + 1] = val; + dataDst[j + 2] = val; + dataDst[j + 3] = 255; // opacity + j += 4; + } // for (x) + } // for (y) + } else if (vol.m_bytesPerVoxel === FOUR) { + for (let y = 0; y < hScreen; y++, ay += yStep) { + const ySrc = Math.floor(ay); + const yOff = ySrc * xDim; + let ax = xPos * xDim; + for (let x = 0; x < wScreen; x++, ax += xStep) { + const xSrc = Math.floor(ax); + const val = dataSrc[(zOff + yOff + xSrc) * FOUR + OFF_3]; + const val4 = val * FOUR; + const rCol = roiPal256[val4 + 0]; + const gCol = roiPal256[val4 + 1]; + const bCol = roiPal256[val4 + 2]; + + dataDst[j + 0] = bCol; + dataDst[j + 1] = gCol; + dataDst[j + 2] = rCol; + dataDst[j + 3] = 255; + j += 4; + } // for (x) + } // for (y) + } // if 4 bpp + } else if (mode2d === Modes2d.SAGGITAL) { + // calc screen rect based on physics volume slice size (x slice) + const yzRatio = pbox.y / pbox.z; + wScreen = w; + hScreen = Math.floor(w / yzRatio); + if (hScreen > h) { + hScreen = h; + wScreen = Math.floor(h * yzRatio); + if (wScreen > w) { + console.log(`logic error! wScreen * hScreen = ${wScreen} * ${hScreen}`); + } + } + hScreen = hScreen > 0 ? hScreen : 1; + // console.log(`gra2d. render: wScreen*hScreen = ${wScreen} * ${hScreen}, but w*h=${w}*${h} `); + + this.m_toolPick.setScreenDim(wScreen, hScreen); + this.m_toolDistance.setScreenDim(wScreen, hScreen); + this.m_toolAngle.setScreenDim(wScreen, hScreen); + this.m_toolArea.setScreenDim(wScreen, hScreen); + this.m_toolRect.setScreenDim(wScreen, hScreen); + this.m_toolText.setScreenDim(wScreen, hScreen); + this.m_toolEdit.setScreenDim(wScreen, hScreen); + this.m_toolDelete.setScreenDim(wScreen, hScreen); + + // setup pixel size for 2d tools + const xPixelSize = vol.m_boxSize.y / yDim; + const yPixelSize = vol.m_boxSize.z / zDim; + // console.log(`xyPixelSize = ${xPixelSize} * ${yPixelSize}`); + this.m_toolDistance.setPixelSize(xPixelSize, yPixelSize); + this.m_toolAngle.setPixelSize(xPixelSize, yPixelSize); + this.m_toolArea.setPixelSize(xPixelSize, yPixelSize); + this.m_toolRect.setPixelSize(xPixelSize, yPixelSize); + this.m_toolText.setPixelSize(xPixelSize, yPixelSize); + this.m_toolEdit.setPixelSize(xPixelSize, yPixelSize); + this.m_toolDelete.setPixelSize(xPixelSize, yPixelSize); + + // create image data + imgData = ctx.createImageData(wScreen, hScreen); + dataDst = imgData.data; + if (dataDst.length !== wScreen * hScreen * 4) { + console.log(`Bad dst data len = ${dataDst.length}, but expect ${wScreen}*${hScreen}*4`); + } + + // x slice + let xSlice = Math.floor(xDim * sliceRatio); + xSlice = xSlice < xDim ? xSlice : xDim - 1; + + const yStep = (zoom * yDim) / wScreen; + const zStep = (zoom * zDim) / hScreen; + let j = 0; + let az = yPos * zDim; + if (vol.m_bytesPerVoxel === ONE) { + for (let y = 0; y < hScreen; y++, az += zStep) { + const zSrc = Math.floor(az); + const zOff = zSrc * xDim * yDim; + let ay = xPos * yDim; + for (let x = 0; x < wScreen; x++, ay += yStep) { + const ySrc = Math.floor(ay); + const yOff = ySrc * xDim; + const val = dataSrc[zOff + yOff + xSlice]; + + dataDst[j + 0] = val; + dataDst[j + 1] = val; + dataDst[j + 2] = val; + dataDst[j + 3] = 255; // opacity + + j += 4; + } // for (x) + } // for (y) + } else if (vol.m_bytesPerVoxel === FOUR) { + for (let y = 0; y < hScreen; y++, az += zStep) { + const zSrc = Math.floor(az); + const zOff = zSrc * xDim * yDim; + let ay = xPos * yDim; + for (let x = 0; x < wScreen; x++, ay += yStep) { + const ySrc = Math.floor(ay); + const yOff = ySrc * xDim; + const val = dataSrc[(zOff + yOff + xSlice) * FOUR + OFF_3]; + const val4 = val * FOUR; + const rCol = roiPal256[val4 + 0]; + const gCol = roiPal256[val4 + 1]; + const bCol = roiPal256[val4 + 2]; + + dataDst[j + 0] = bCol; + dataDst[j + 1] = gCol; + dataDst[j + 2] = rCol; + dataDst[j + 3] = 255; // opacity + + j += 4; + } // for (x) + } // for (y) + } // if 4 bppp + } else if (mode2d === Modes2d.CORONAL) { + // calc screen rect based on physics volume slice size (y slice) + const xzRatio = pbox.x / pbox.z; + wScreen = w; + hScreen = Math.floor(w / xzRatio); + if (hScreen > h) { + hScreen = h; + wScreen = Math.floor(h * xzRatio); + if (wScreen > w) { + console.log(`logic error! wScreen * hScreen = ${wScreen} * ${hScreen}`); + } + } + hScreen = hScreen > 0 ? hScreen : 1; + // console.log(`gra2d. render: wScreen*hScreen = ${wScreen} * ${hScreen}, but w*h=${w}*${h} `); + + this.m_toolPick.setScreenDim(wScreen, hScreen); + this.m_toolDistance.setScreenDim(wScreen, hScreen); + this.m_toolAngle.setScreenDim(wScreen, hScreen); + this.m_toolArea.setScreenDim(wScreen, hScreen); + this.m_toolRect.setScreenDim(wScreen, hScreen); + this.m_toolText.setScreenDim(wScreen, hScreen); + this.m_toolEdit.setScreenDim(wScreen, hScreen); + this.m_toolDelete.setScreenDim(wScreen, hScreen); + + // setup pixel size for 2d tools + const xPixelSize = vol.m_boxSize.x / xDim; + const yPixelSize = vol.m_boxSize.z / zDim; + // console.log(`xyPixelSize = ${xPixelSize} * ${yPixelSize}`); + this.m_toolDistance.setPixelSize(xPixelSize, yPixelSize); + this.m_toolAngle.setPixelSize(xPixelSize, yPixelSize); + this.m_toolArea.setPixelSize(xPixelSize, yPixelSize); + this.m_toolRect.setPixelSize(xPixelSize, yPixelSize); + this.m_toolText.setPixelSize(xPixelSize, yPixelSize); + this.m_toolEdit.setPixelSize(xPixelSize, yPixelSize); + this.m_toolDelete.setPixelSize(xPixelSize, yPixelSize); + + // create image data + imgData = ctx.createImageData(wScreen, hScreen); + dataDst = imgData.data; + if (dataDst.length !== wScreen * hScreen * 4) { + console.log(`Bad dst data len = ${dataDst.length}, but expect ${wScreen}*${hScreen}*4`); + } + + // y slice + let ySlice = Math.floor(yDim * sliceRatio); + ySlice = ySlice < yDim ? ySlice : yDim - 1; + const yOff = ySlice * xDim; + + const xStep = (zoom * xDim) / wScreen; + const zStep = (zoom * zDim) / hScreen; + let j = 0; + let az = yPos * zDim; + if (vol.m_bytesPerVoxel === ONE) { + for (let y = 0; y < hScreen; y++, az += zStep) { + const zSrc = Math.floor(az); + const zOff = zSrc * xDim * yDim; + let ax = xPos * xDim; + for (let x = 0; x < wScreen; x++, ax += xStep) { + const xSrc = Math.floor(ax); + const val = dataSrc[zOff + yOff + xSrc]; + + dataDst[j + 0] = val; + dataDst[j + 1] = val; + dataDst[j + 2] = val; + dataDst[j + 3] = 255; // opacity + + j += 4; + } // for (x) + } // for (y) + } else if (vol.m_bytesPerVoxel === FOUR) { + for (let y = 0; y < hScreen; y++, az += zStep) { + const zSrc = Math.floor(az); + const zOff = zSrc * xDim * yDim; + let ax = xPos * xDim; + for (let x = 0; x < wScreen; x++, ax += xStep) { + const xSrc = Math.floor(ax); + const val = dataSrc[(zOff + yOff + xSrc) * FOUR + OFF_3]; + const val4 = val * FOUR; + const rCol = roiPal256[val4 + 0]; + const gCol = roiPal256[val4 + 1]; + const bCol = roiPal256[val4 + 2]; + + dataDst[j + 0] = bCol; + dataDst[j + 1] = gCol; + dataDst[j + 2] = rCol; + dataDst[j + 3] = 255; // opacity + + j += 4; + } // for (x) + } // for (y) + } // end if 4 bpp + } + + // centering: setting canvas image size, to match its HTML element's size + objCanvas.width = wScreen; + objCanvas.height = hScreen; + // check is segmentation 2d mode is active + // const isSegm = store.graphics2dModeSegmentation; + // console.log("Segm2d mode = " + isSegm); + + this.imgData = imgData; + this.segm2d.setImageData(imgData); + } // prepareImageForRender + + fillBackground(ctx) { + const { hRender, wRender } = this.state; + ctx.fillStyle = '#000000'; + ctx.fillRect(0, 0, wRender, hRender); + } + + renderReadyImage() { + if (!this.m_isMounted) { + return; + } + + const objCanvas = this.m_mount.current; + if (objCanvas === null) { + return; + } + const ctx = objCanvas.getContext('2d'); + // prepare canvas + this.fillBackground(ctx); + + const store = this.props; + + const volSet = store.volumeSet; + if (volSet.getNumVolumes() === 0) { + return; + } + const volIndex = store.volumeIndex; + const vol = volSet.getVolume(volIndex); + if (vol === null) { + return; + } + + const isSegm = this.m_isSegmented; + if (isSegm) { + const w = this.m_toolPick.m_wScreen; + const h = this.m_toolPick.m_hScreen; + this.segm2d.render(ctx, w, h, this.imgData); + } else { + ctx.putImageData(this.imgData, 0, 0); + } + + // render all tools + this.m_toolPick.render(ctx); + this.m_toolDistance.render(ctx, store); + this.m_toolAngle.render(ctx, store); + this.m_toolArea.render(ctx, store); + this.m_toolRect.render(ctx, store); + this.m_toolText.render(ctx, store); + this.m_toolEdit.render(ctx, store); + this.m_toolDelete.render(ctx, store); + } + + onMouseWheel(evt) { + const store = this.props; + const step = evt.deltaY * 2 ** -10; + + const zoom = store.render2dZoom; + let zoomNew = zoom + step; + let xPosNew = store.render2dxPos - ((step / 4) * evt.clientX) / evt.clientY; + let yPosNew = store.render2dyPos - ((step / 4) * evt.clientY) / evt.clientX; + + console.log(`onMouseWheel.evt = ${xPosNew}, ${yPosNew}`); + // console.log(`onMouseWheel. zoom.puml = ${zoom.puml} zoomNew = ${zoomNew}, xyPos = ${xPosNew},${yPosNew}`); + if (Math.abs(zoomNew) > 1 || Math.abs(zoomNew) < 0.02 || xPosNew < 0 || yPosNew < 0 || xPosNew > 1 || yPosNew > 1) { + return; + } + store.dispatch({ type: StoreActionType.SET_2D_ZOOM, render2dZoom: zoomNew }); + store.dispatch({ type: StoreActionType.SET_2D_X_POS, render2dxPos: xPosNew }); + store.dispatch({ type: StoreActionType.SET_2D_Y_POS, render2dyPos: yPosNew }); + + store.graphics2d.forceUpdate(); + } + + onMouseUp(evt) { + const store = this.props; + const indexTools2d = store.indexTools2d; + if (indexTools2d === Tools2dType.DISTANCE) { + const store = this.props; + const box = this.m_mount.current.getBoundingClientRect(); + const xScr = evt.clientX - box.left; + const yScr = evt.clientY - box.top; + this.m_toolDistance.onMouseUp(xScr, yScr, store); + } + if (indexTools2d === Tools2dType.ANGLE) { + const store = this.props; + const box = this.m_mount.current.getBoundingClientRect(); + const xScr = evt.clientX - box.left; + const yScr = evt.clientY - box.top; + this.m_toolAngle.onMouseUp(xScr, yScr, store); + } + if (indexTools2d === Tools2dType.AREA) { + const store = this.props; + const box = this.m_mount.current.getBoundingClientRect(); + const xScr = evt.clientX - box.left; + const yScr = evt.clientY - box.top; + this.m_toolArea.onMouseUp(xScr, yScr, store); + } + if (indexTools2d === Tools2dType.RECT) { + const store = this.props; + const box = this.m_mount.current.getBoundingClientRect(); + const xScr = evt.clientX - box.left; + const yScr = evt.clientY - box.top; + this.m_toolRect.onMouseUp(xScr, yScr, store); + } + if (indexTools2d === Tools2dType.EDIT) { + const store = this.props; + const box = this.m_mount.current.getBoundingClientRect(); + const xScr = evt.clientX - box.left; + const yScr = evt.clientY - box.top; + this.m_toolEdit.onMouseUp(xScr, yScr, store); + } + if (indexTools2d === Tools2dType.DELETE) { + const store = this.props; + const box = this.m_mount.current.getBoundingClientRect(); + const xScr = evt.clientX - box.left; + const yScr = evt.clientY - box.top; + this.m_toolDelete.onMouseUp(xScr, yScr, store); + } + } + + onMouseMove(evt) { + const store = this.props; + const indexTools2d = store.indexTools2d; + const box = this.m_mount.current.getBoundingClientRect(); + const xContainer = evt.clientX - box.left; + const yContainer = evt.clientY - box.top; + const xScr = xContainer; + const yScr = yContainer; + + if (indexTools2d === Tools2dType.DISTANCE) { + this.m_toolDistance.onMouseMove(xScr, yScr, store); + } + if (indexTools2d === Tools2dType.ANGLE) { + this.m_toolAngle.onMouseMove(xScr, yScr, store); + } + if (indexTools2d === Tools2dType.AREA) { + this.m_toolArea.onMouseMove(xScr, yScr, store); + } + if (indexTools2d === Tools2dType.RECT) { + this.m_toolRect.onMouseMove(xScr, yScr, store); + } + if (indexTools2d === Tools2dType.EDIT) { + this.m_toolEdit.onMouseMove(xScr, yScr, store); + } + if (indexTools2d === Tools2dType.DELETE) { + this.m_toolDelete.onMouseMove(xScr, yScr, store); + } + } + + onMouseDown(evt) { + const box = this.m_mount.current.getBoundingClientRect(); + const xContainer = evt.clientX - box.left; + const yContainer = evt.clientY - box.top; + const xScr = xContainer; + const yScr = yContainer; + // console.log(`onMouseDown. down = ${xScr}, ${yScr}`); + + const store = this.props; + const indexTools2d = store.indexTools2d; + // console.log(`onMouseDown. tool index = ${indexTools2d}`); + + switch (indexTools2d) { + case Tools2dType.INTENSITY: + this.m_toolPick.onMouseDown(xScr, yScr, store); + break; + case Tools2dType.DISTANCE: + this.m_toolDistance.onMouseDown(xScr, yScr, store); + break; + case Tools2dType.ANGLE: + this.m_toolAngle.onMouseDown(xScr, yScr, store); + break; + case Tools2dType.AREA: + this.m_toolArea.onMouseDown(xScr, yScr, store); + break; + case Tools2dType.RECT: + this.m_toolRect.onMouseDown(xScr, yScr, store); + break; + case Tools2dType.TEXT: + this.m_toolText.onMouseDown(xScr, yScr, store); + break; + case Tools2dType.EDIT: + this.m_toolEdit.onMouseDown(xScr, yScr, store); + break; + case Tools2dType.DELETE: + this.m_toolDelete.onMouseDown(xScr, yScr, store); + break; + default: + // not defined + } // switch + // force update + this.forceUpdate(); + } // onMouseDown + + /** + * Invoke clear all tools + */ + clear() { + this.m_toolDistance.clear(); + this.m_toolAngle.clear(); + this.m_toolArea.clear(); + this.m_toolRect.clear(); + this.m_toolText.clear(); + this.m_toolEdit.clear(); + this.m_toolDelete.clear(); + } + + /** + * Invoke forced rendering, after some tool visual changes + */ + forceUpdate(volIndex) { + // console.log('forceUpdate ...'); + this.prepareImageForRender(volIndex); + // this.forceRender(); + if (this.m_isSegmented) { + // need to draw segmented image + if (this.segm2d.model !== null) { + // we have loaded model: applt it to image + this.segm2d.startApplyImage(); + } + } else { + this.forceRender(); + } // if not segmented image + } + + forceRender() { + if (this.m_isMounted) { + // console.log('forceRender ...'); + this.setState({ state: this.state }); + } + } + + /** + * Main component render func callback + */ + render() { + // const store = this.props; + // const volSet = store.volumeSet; + this.m_sliceRatio = this.props.sliderValue; + this.m_mode2d = this.props.mode2d; + + const wrapperStyles = { + display: 'flex', + justifyContent: 'flex-start', + width: `calc(100% - 110px)`, + height: `calc(100% - 110px)`, + margin: '100px 125px', + }; + const canvasStyles = { + maxWidth: '100%', + border: '2px solid #dc5e47', + borderRadius: '10px', + }; + return ( + <div style={wrapperStyles}> + <canvas + ref={this.m_mount} + style={canvasStyles} + onMouseDown={this.onMouseDown} + onMouseUp={this.onMouseUp} + onMouseMove={this.onMouseMove} + onWheel={this.onMouseWheel} + /> + </div> + ); + } +} + +export default connect((store) => store)(Graphics2d); diff --git a/src/demo/engine/Graphics2d.test.js b/src/engine/Graphics2d.test.js similarity index 84% rename from src/demo/engine/Graphics2d.test.js rename to src/engine/Graphics2d.test.js index 14dadef1..4d0acedb 100644 --- a/src/demo/engine/Graphics2d.test.js +++ b/src/engine/Graphics2d.test.js @@ -1,42 +1,39 @@ -/** - * @fileOverview Graphics2d.test - * @author Epam - * @version 1.0.0 +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 */ -// ******************************************************** -// Imports -// ******************************************************** - import ToolArea from './tools2d/ToolArea'; -import Graphics2d from './Graphics2d'; import VolumeSet from './VolumeSet'; import Volume from './Volume'; - -// ******************************************************** -// Tests -// ******************************************************** +import Graphics2d from './Graphics2d'; +jest.mock('./Graphics2d', () => jest.fn(() => {})); describe('ToolArea. test line intersect', () => { + beforeEach(() => { + // Clear all instances and calls to constructor and all methods: + Graphics2d.mockClear(); + }); + it('ToolArea. test line intersect no 0', () => { // const gra = new Graphics2d(); // const toolArea = new ToolArea(gra); const v0 = { x: 0.0, - y: 0.0 + y: 0.0, }; const v1 = { x: 1.0, - y: 0.0 + y: 0.0, }; const v2 = { x: 2.0, - y: -1.0 + y: -1.0, }; const v3 = { x: 2.0, - y: 1.0 + y: 1.0, }; const vInter = ToolArea.getLineIntersection(v0, v1, v2, v3); expect(vInter === null).toBeTruthy(); @@ -47,19 +44,19 @@ describe('ToolArea. test line intersect', () => { const v0 = { x: 0.0, - y: 0.0 + y: 0.0, }; const v1 = { x: 1.0, - y: 0.0 + y: 0.0, }; const v2 = { x: 0.5, - y: -1.0 + y: -1.0, }; const v3 = { x: 0.5, - y: 1.0 + y: 1.0, }; const vInter = ToolArea.getLineIntersection(v0, v1, v2, v3); expect(vInter !== null).toBeTruthy(); @@ -72,19 +69,19 @@ describe('ToolArea. test line intersect', () => { const v0 = { x: 0.0, - y: 0.0 + y: 0.0, }; const v1 = { x: 1.0, - y: 0.0 + y: 0.0, }; const v2 = { x: 0.0, - y: 1.0 + y: 1.0, }; const v3 = { x: 1.0, - y: 1.0 + y: 1.0, }; const vInter = ToolArea.getLineIntersection(v0, v1, v2, v3); expect(vInter === null).toBeTruthy(); @@ -121,11 +118,10 @@ describe('ToolArea. test line intersect', () => { const bHas = ToolArea.hasSelfIntersection(points); expect(bHas === true).toBeTruthy(); }); - it('ToolArea. test check area', () => { const vol = new Volume(); vol.m_xDim = vol.m_yDim = vol.m_zDim = 100.0; - vol.m_boxSize.x = vol.m_boxSize.y = vol.m_boxSize.z = 10.0; + vol.m_boxSize.x = vol.m_boxSize.y = vol.m_boxSize.z = 10.0; const volSet = new VolumeSet(); volSet.addVolume(vol); const store = { @@ -146,5 +142,4 @@ describe('ToolArea. test line intersect', () => { // console.log(`test area = ${area}`); expect(area === 100.0).toBeTruthy(); }); - }); diff --git a/src/demo/engine/Graphics3d.js b/src/engine/Graphics3d.js similarity index 71% rename from src/demo/engine/Graphics3d.js rename to src/engine/Graphics3d.js index 641b395d..d598de51 100644 --- a/src/demo/engine/Graphics3d.js +++ b/src/engine/Graphics3d.js @@ -1,37 +1,17 @@ -/** - * @fileOverview Graphics3d - * @author Epam - * @version 1.0.0 +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 */ - -// ******************************************************** -// Imports -// ******************************************************** - import React from 'react'; import { connect } from 'react-redux'; -import ModeView from '../store/ModeView'; +import ViewMode from '../store/ViewMode'; import Modes3d from '../store/Modes3d'; import StoreActionType from '../store/ActionTypes'; -import VolumeRenderer3d from './VolumeRenderer3d' +import VolumeRenderer3d from './VolumeRenderer3d'; //import DistanceTool from '../tools23d/distancetool' -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class Graphics2d some text later... - */ class Graphics3d extends React.Component { - /** - * @param {object} props - props from up level object - */ constructor(props) { super(props); this.onMode = this.onMode.bind(this); @@ -57,7 +37,7 @@ class Graphics3d extends React.Component { this.m_fileDataType = { thresholdIsosurf: 0.46, thresholdTissue1: 0.09, - thresholdTissue2: 0.30, + thresholdTissue2: 0.3, opacityTissue: 0.53, startRotX: -Math.PI * 0.5, startRotY: Math.PI, @@ -74,14 +54,14 @@ class Graphics3d extends React.Component { setVolRenderToStore(VolRender) { const store = this.props; store.dispatch({ type: StoreActionType.SET_VOLUME_Renderer, volumeRenderer: VolRender }); - store.dispatch({ type: StoreActionType.SET_SLIDER_3DR, slider3d_r: Number.parseFloat(0.09) }); - store.dispatch({ type: StoreActionType.SET_SLIDER_3DG, slider3d_g: Number.parseFloat(0.3) }); - store.dispatch({ type: StoreActionType.SET_SLIDER_3DB, slider3d_b: Number.parseFloat(0.46) }); - store.dispatch({ type: StoreActionType.SET_SLIDER_Opacity, sliderOpacity: Number.parseFloat(0.53) }); - store.dispatch({ type: StoreActionType.SET_SLIDER_Isosurface, sliderIsosurface: Number.parseFloat(0.46) }); - store.dispatch({ type: StoreActionType.SET_SLIDER_Brightness, sliderBrightness: Number.parseFloat(0.56) }); - store.dispatch({ type: StoreActionType.SET_SLIDER_Cut, sliderCut: Number.parseFloat(1.0) }); - store.dispatch({ type: StoreActionType.SET_SLIDER_Quality, sliderQuality: Number.parseFloat(0.35) }); + store.dispatch({ type: StoreActionType.SET_SLIDER_3DR, slider3d_r: 0.09 }); + store.dispatch({ type: StoreActionType.SET_SLIDER_3DG, slider3d_g: 0.3 }); + store.dispatch({ type: StoreActionType.SET_SLIDER_3DB, slider3d_b: 0.46 }); + store.dispatch({ type: StoreActionType.SET_SLIDER_Opacity, opacityValue3D: 0.53 }); + store.dispatch({ type: StoreActionType.SET_SLIDER_Isosurface, isoThresholdValue: 0.46 }); + store.dispatch({ type: StoreActionType.SET_SLIDER_Brightness, brightness3DValue: 0.56 }); + store.dispatch({ type: StoreActionType.SET_SLIDER_Cut, cut3DRatio: 1.0 }); + store.dispatch({ type: StoreActionType.SET_SLIDER_Quality, quality3DStepSize: 0.35 }); } start() { @@ -100,7 +80,7 @@ class Graphics3d extends React.Component { this.m_mesh.rotation.y += 0.01; this.m_material.color.setRGB(this.m_slider3dr, this.m_slider3dg, this.m_slider3db); this.m_material.wireframe = (this.m_mode3d === Modes3d.ISO);*/ - + this.renderScene(); this.m_frameId = window.requestAnimationFrame(this.animate); } @@ -120,8 +100,8 @@ class Graphics3d extends React.Component { componentDidMount() { // detect actual render window dims const MIN_DIM = 200; - const w = (this.m_mount.clientWidth > 0) ? this.m_mount.clientWidth : MIN_DIM; - const h = (this.m_mount.clientHeight > 0) ? this.m_mount.clientHeight : MIN_DIM; + const w = this.m_mount.clientWidth > 0 ? this.m_mount.clientWidth : MIN_DIM; + const h = this.m_mount.clientHeight > 0 ? this.m_mount.clientHeight : MIN_DIM; if (this.state.wRender === 0) { this.setState({ wRender: w }); this.setState({ hRender: h }); @@ -152,24 +132,31 @@ class Graphics3d extends React.Component { curFileDataType: this.m_fileDataType, width: w, height: h, - mount: this.m_mount + mount: this.m_mount, }); } this.setVolRenderToStore(this.m_volumeRenderer3D); - if (this.volume !== null && this.isLoaded === false && this.m_volumeRenderer3D !== null) { + if (this.volume !== null && this.isLoaded === false && this.m_volumeRenderer3D !== null) { const store = this.props; const volSet = store.volumeSet; const volIndex = store.volumeIndex; const vol = volSet.getVolume(volIndex); const FOUR = 4; - const isIso = (vol.m_bytesPerVoxel === FOUR) ? true : false; - const modeView = store.modeView; + const isIso = vol.m_bytesPerVoxel === FOUR; + const viewMode = store.viewMode; //let tst = 0; //if (this.volume.m_zDim < 4) - if (modeView === ModeView.VIEW_3D) { + if (viewMode === ViewMode.VIEW_3D) { this.m_volumeRenderer3D.initWithVolume(this.volume, this.volume.m_boxSize, { x: 0, y: 0, z: 0 }, { x: 1, y: 1, z: 1 }, isIso, true); } else { - this.m_volumeRenderer3D.initWithVolume(this.volume, this.volume.m_boxSize, { x: 0, y: 0, z: 0 }, { x: 1, y: 1, z: 1 }, isIso, false); + this.m_volumeRenderer3D.initWithVolume( + this.volume, + this.volume.m_boxSize, + { x: 0, y: 0, z: 0 }, + { x: 1, y: 1, z: 1 }, + isIso, + false + ); } //if (tst) { // return; @@ -182,7 +169,7 @@ class Graphics3d extends React.Component { } componentWillUnmount() { - this.stop() + this.stop(); if (this.m_renderer !== null) { this.m_mount.removeChild(this.m_renderer.domElement); } @@ -209,7 +196,8 @@ class Graphics3d extends React.Component { } } - _onMouseUp() { // ommited args: evt + _onMouseUp() { + // ommited args: evt //console.log(`${e.x}, ${e.y}\n`); if (this.m_volumeRenderer3D !== null) { this.m_volumeRenderer3D.onMouseUp(); @@ -228,7 +216,7 @@ class Graphics3d extends React.Component { } onTouchStart(evt) { - if ((this.m_mount !== undefined) && (this.m_mount !== null)) { + if (this.m_mount !== undefined && this.m_mount !== null) { // evt.preventDefault(); const touches = evt.changedTouches; const numTouches = touches.length; @@ -250,7 +238,7 @@ class Graphics3d extends React.Component { } onTouchMove(evt) { - if ((this.m_mount !== undefined) && (this.m_mount !== null)) { + if (this.m_mount !== undefined && this.m_mount !== null) { // evt.preventDefault(); const touches = evt.changedTouches; const numTouches = touches.length; @@ -282,7 +270,6 @@ class Graphics3d extends React.Component { console.log('Ctrl key was pressed'); const store = this.props; store.volumeRenderer.setEraserStart(true); - } } @@ -313,26 +300,26 @@ class Graphics3d extends React.Component { } const ZCUTSHIFT = 0.5; const mode3d = store.mode3d; - const modeView = store.modeView; + const viewMode = store.viewMode; if (this.m_volumeRenderer3D !== null) { // console.log(`Graphics3d . mode = ${mode3d}`); this.m_volumeRenderer3D.switchToTool23D(store.isTool3D); - if (modeView !== ModeView.VIEW_3D) { + if (viewMode !== ViewMode.VIEW_3D) { if (mode3d === Modes3d.RAYCAST) { //if (this.m_prevMode === Modes3d.EREASER) { //this.m_volumeRenderer3D.setEraserMode(false); //} this.m_prevMode = Modes3d.RAYCAST; this.m_volumeRenderer3D.setTransferFuncVec3([store.slider3d_r, store.slider3d_g, store.slider3d_b], 0); - this.m_volumeRenderer3D.switchToVolumeRender(); + this.m_volumeRenderer3D.switchToVolumeRender(); } if (mode3d === Modes3d.ISO) { //if (this.m_prevMode === Modes3d.EREASER) { // this.m_volumeRenderer3D.setEraserMode(false); //} this.m_prevMode = Modes3d.ISO; - this.m_volumeRenderer3D.switchToIsosurfRender(); - this.m_volumeRenderer3D.setIsoThresholdValue(store.sliderIsosurface); + this.m_volumeRenderer3D.switchToIsosurfRender(); + this.m_volumeRenderer3D.setIsoThresholdValue(store.isoThresholdValue); } if (mode3d === Modes3d.RAYFAST) { //if (this.m_prevMode === Modes3d.EREASER) { @@ -346,18 +333,18 @@ class Graphics3d extends React.Component { // this.m_volumeRenderer3D.setEraserMode(true); //} this.m_prevMode = Modes3d.RAYFAST; - this.m_volumeRenderer3D.switchToIsosurfRender(); - this.m_volumeRenderer3D.setIsoThresholdValue(store.sliderIsosurface); + this.m_volumeRenderer3D.switchToIsosurfRender(); + this.m_volumeRenderer3D.setIsoThresholdValue(store.isoThresholdValue); this.m_volumeRenderer3D.volumeUpdater.eraser.setEraserRadius(store.sliderErRadius); this.m_volumeRenderer3D.volumeUpdater.eraser.setEraserDepth(store.sliderErDepth); } } else { - this.m_volumeRenderer3D.switchToFullVolumeRender() + this.m_volumeRenderer3D.switchToFullVolumeRender(); } - this.m_volumeRenderer3D.setOpacityBarrier(store.sliderOpacity); - this.m_volumeRenderer3D.updateBrightness(store.sliderBrightness); - this.m_volumeRenderer3D.updateZCutPlane(store.sliderCut - ZCUTSHIFT); - this.m_volumeRenderer3D.setStepsize(store.sliderQuality); + this.m_volumeRenderer3D.setOpacityBarrier(store.opacityValue3D); + this.m_volumeRenderer3D.updateBrightness(store.brightness3DValue); + this.m_volumeRenderer3D.updateZCutPlane(store.cut3DRatio - ZCUTSHIFT); + this.m_volumeRenderer3D.setStepsize(store.quality3DStepSize); this.m_volumeRenderer3D.updateContrast(store.sliderContrast3D); } if (this.m_volumeRenderer3D !== null) { @@ -367,36 +354,31 @@ class Graphics3d extends React.Component { const styleObj = { width: '100%', height: '100%', + display: 'block', }; - const jsxCanvasNonSized = <div - style={styleObj} - ref={ (mount) => {this.m_mount = mount} } - onMouseMove={this._onMouseMove.bind(this)} - onMouseDown={this._onMouseDown.bind(this)} - onMouseUp={this._onMouseUp.bind(this)} - onTouchStart={this.onTouchStart.bind(this)} - onTouchEnd={this.onTouchEnd.bind(this)} - onTouchMove={this.onTouchMove.bind(this)} - onClick={this.onClick.bind(this)} - onWheel={this._onWheel.bind(this)} /> - const jsxCanvasSized = <div - width={this.state.wRender} height={this.state.hRender} - ref={ (mount) => {this.m_mount = mount} } - onMouseMove={this._onMouseMove.bind(this)} - onMouseDown={this._onMouseDown.bind(this)} - onMouseUp={this._onMouseUp.bind(this)} - onTouchStart={this.onTouchStart.bind(this)} - onTouchEnd={this.onTouchEnd.bind(this)} - onTouchMove={this.onTouchMove.bind(this)} - onClick={this.onClick.bind(this)} - tabIndex="1" - onKeyDown={(evt) => this.onKeyDown(evt)} - onKeyUp={(evt) => this.onKeyUp(evt)} - onWheel={this._onWheel.bind(this)} /> - const jsx = (this.state.wRender > 0) ? jsxCanvasSized : jsxCanvasNonSized; - return jsx; + return ( + <div + style={styleObj} + width={this.state.wRender} + height={this.state.hRender} + ref={(mount) => { + this.m_mount = mount; + }} + onMouseMove={this._onMouseMove.bind(this)} + onMouseDown={this._onMouseDown.bind(this)} + onMouseUp={this._onMouseUp.bind(this)} + onTouchStart={this.onTouchStart.bind(this)} + onTouchEnd={this.onTouchEnd.bind(this)} + onTouchMove={this.onTouchMove.bind(this)} + onClick={this.onClick.bind(this)} + tabIndex="1" + onKeyDown={(evt) => this.onKeyDown(evt)} + onKeyUp={(evt) => this.onKeyUp(evt)} + onWheel={this._onWheel.bind(this)} + /> + ); } } -export default connect(store => store)(Graphics3d); +export default connect((store) => store)(Graphics3d); diff --git a/src/engine/LoadResult.js b/src/engine/LoadResult.js new file mode 100644 index 00000000..22dba821 --- /dev/null +++ b/src/engine/LoadResult.js @@ -0,0 +1,98 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Loading result codes + * @module lib/scripts/loaders/loadresult + */ + +// ****************************************************************** +// imports +// ****************************************************************** + +/** Class LoadResult to report loading status of binary files (Ktx, Dicom, Nifti)*/ +export default class LoadResult { + static getResultString(errorCode) { + switch (errorCode) { + case LoadResult.SUCCESS: + return 'Success'; + case LoadResult.UNKNOWN: + return 'Unknown'; + case LoadResult.BAD_DICOM: + return 'Bad Dicom'; + case LoadResult.BAD_HEADER: + return 'Bad header'; + case LoadResult.UNSUPPORTED_ENDIANNESS: + return 'Unsupported endianness'; + case LoadResult.UNSUPPORTED_COLOR_FORMAT: + return 'Unsupported color format'; + case LoadResult.WRONG_HEADER_DATA_SIZE: + return 'Wrong header data size'; + case LoadResult.WRONG_HEADER_DIMENSIONS: + return 'Wrong header dimensions'; + case LoadResult.WRONG_HEADER_DATA_TYPE: + return 'Wrong header data type'; + case LoadResult.WRONG_HEADER_BITS_PER_PIXEL: + return 'Wrong header bits per pixel'; + case LoadResult.WRONG_HEADER_MAGIC: + return 'Wrong header magic'; + case LoadResult.ERROR_PROCESS_HISTOGRAM: + return 'Wrong histogram'; + case LoadResult.WRONG_IMAGE_DIM_X: + return 'Wrong image dim x'; + case LoadResult.WRONG_IMAGE_DIM_Y: + return 'Wrong image dim y'; + case LoadResult.WRONG_IMAGE_DIM_Z: + return 'Wrong image dim z'; + case LoadResult.ERROR_PIXELS_TAG_NOT_FOUND: + return 'Pixels tag is not found'; + case LoadResult.ERROR_NO_MEMORY: + return 'No memory during loading'; + case LoadResult.ERROR_CANT_OPEN_URL: + return 'Cant open file via url'; + case LoadResult.ERROR_WRONG_NUM_SLICES: + return 'Wrong number of slices'; + case LoadResult.ERROR_HISTOGRAM_DETECT_RIDGES: + return 'Error detect histogram ridges'; + case LoadResult.ERROR_SCALING: + return 'Error scaling 16 bit data into 8 bit'; + case LoadResult.ERROR_INVALID_SLICE_INDEX: + return 'Invalid slice index. Possible reason: incomplete dicom folder'; + case LoadResult.ERROR_TOO_SMALL_DATA_SIZE: + return 'Too small input data size'; + case LoadResult.ERROR_TOO_LARGE_DATA_SIZE: + return 'Too large input data size'; + case LoadResult.ERROR_COMPRESSED_IMAGE_NOT_SUPPORTED: + return 'Compressed image formats read is not supported'; + default: + return 'Unknown error code'; + } // switch + } // getResultString +} // class LoadResult + +LoadResult.SUCCESS = 0; +LoadResult.UNKNOWN = 1; +LoadResult.BAD_DICOM = 2; +LoadResult.BAD_HEADER = 3; +LoadResult.UNSUPPORTED_ENDIANNESS = 4; +LoadResult.UNSUPPORTED_COLOR_FORMAT = 5; +LoadResult.WRONG_HEADER_DATA_SIZE = 6; +LoadResult.WRONG_HEADER_DIMENSIONS = 7; +LoadResult.WRONG_HEADER_DATA_TYPE = 8; +LoadResult.WRONG_HEADER_BITS_PER_PIXEL = 9; +LoadResult.WRONG_HEADER_MAGIC = 10; +LoadResult.ERROR_PROCESS_HISTOGRAM = 11; +LoadResult.WRONG_IMAGE_DIM_X = 12; +LoadResult.WRONG_IMAGE_DIM_Y = 13; +LoadResult.ERROR_PIXELS_TAG_NOT_FOUND = 14; +LoadResult.ERROR_NO_MEMORY = 15; +LoadResult.ERROR_CANT_OPEN_URL = 16; +LoadResult.ERROR_WRONG_NUM_SLICES = 17; +LoadResult.ERROR_HISTOGRAM_DETECT_RIDGES = 18; +LoadResult.ERROR_SCALING = 19; +LoadResult.ERROR_INVALID_SLICE_INDEX = 20; +LoadResult.ERROR_TOO_SMALL_DATA_SIZE = 21; +LoadResult.ERROR_TOO_LARGE_DATA_SIZE = 22; +LoadResult.ERROR_COMPRESSED_IMAGE_NOT_SUPPORTED = 23; diff --git a/src/engine/PATH_MODEL.json b/src/engine/PATH_MODEL.json new file mode 100644 index 00000000..035a59bf --- /dev/null +++ b/src/engine/PATH_MODEL.json @@ -0,0 +1,1870 @@ +{ + "format": "layers-model", + "generatedBy": "keras v2.3.1", + "convertedBy": "TensorFlow.js Converter v1.5.2", + "modelTopology": { + "keras_version": "2.3.1", + "backend": "tensorflow", + "model_config": { + "class_name": "Model", + "config": { + "name": "model_4", + "layers": [ + { + "name": "input_1", + "class_name": "InputLayer", + "config": { + "batch_input_shape": [ + null, + 320, + 480, + 3 + ], + "dtype": "float32", + "sparse": false, + "name": "input_1" + }, + "inbound_nodes": [] + }, + { + "name": "block1_conv1", + "class_name": "Conv2D", + "config": { + "name": "block1_conv1", + "trainable": true, + "dtype": "float32", + "filters": 64, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "same", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "relu", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "input_1", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "block1_conv2", + "class_name": "Conv2D", + "config": { + "name": "block1_conv2", + "trainable": true, + "dtype": "float32", + "filters": 64, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "same", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "relu", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "block1_conv1", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "block1_pool", + "class_name": "MaxPooling2D", + "config": { + "name": "block1_pool", + "trainable": true, + "dtype": "float32", + "pool_size": [ + 2, + 2 + ], + "padding": "valid", + "strides": [ + 2, + 2 + ], + "data_format": "channels_last" + }, + "inbound_nodes": [ + [ + [ + "block1_conv2", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "block2_conv1", + "class_name": "Conv2D", + "config": { + "name": "block2_conv1", + "trainable": true, + "dtype": "float32", + "filters": 128, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "same", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "relu", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "block1_pool", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "block2_conv2", + "class_name": "Conv2D", + "config": { + "name": "block2_conv2", + "trainable": true, + "dtype": "float32", + "filters": 128, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "same", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "relu", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "block2_conv1", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "block2_pool", + "class_name": "MaxPooling2D", + "config": { + "name": "block2_pool", + "trainable": true, + "dtype": "float32", + "pool_size": [ + 2, + 2 + ], + "padding": "valid", + "strides": [ + 2, + 2 + ], + "data_format": "channels_last" + }, + "inbound_nodes": [ + [ + [ + "block2_conv2", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "block3_conv1", + "class_name": "Conv2D", + "config": { + "name": "block3_conv1", + "trainable": true, + "dtype": "float32", + "filters": 256, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "same", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "relu", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "block2_pool", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "block3_conv2", + "class_name": "Conv2D", + "config": { + "name": "block3_conv2", + "trainable": true, + "dtype": "float32", + "filters": 256, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "same", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "relu", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "block3_conv1", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "block3_conv3", + "class_name": "Conv2D", + "config": { + "name": "block3_conv3", + "trainable": true, + "dtype": "float32", + "filters": 256, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "same", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "relu", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "block3_conv2", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "block3_pool", + "class_name": "MaxPooling2D", + "config": { + "name": "block3_pool", + "trainable": true, + "dtype": "float32", + "pool_size": [ + 2, + 2 + ], + "padding": "valid", + "strides": [ + 2, + 2 + ], + "data_format": "channels_last" + }, + "inbound_nodes": [ + [ + [ + "block3_conv3", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "block4_conv1", + "class_name": "Conv2D", + "config": { + "name": "block4_conv1", + "trainable": true, + "dtype": "float32", + "filters": 512, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "same", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "relu", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "block3_pool", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "block4_conv2", + "class_name": "Conv2D", + "config": { + "name": "block4_conv2", + "trainable": true, + "dtype": "float32", + "filters": 512, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "same", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "relu", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "block4_conv1", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "block4_conv3", + "class_name": "Conv2D", + "config": { + "name": "block4_conv3", + "trainable": true, + "dtype": "float32", + "filters": 512, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "same", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "relu", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "block4_conv2", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "block4_pool", + "class_name": "MaxPooling2D", + "config": { + "name": "block4_pool", + "trainable": true, + "dtype": "float32", + "pool_size": [ + 2, + 2 + ], + "padding": "valid", + "strides": [ + 2, + 2 + ], + "data_format": "channels_last" + }, + "inbound_nodes": [ + [ + [ + "block4_conv3", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "zero_padding2d_1", + "class_name": "ZeroPadding2D", + "config": { + "name": "zero_padding2d_1", + "trainable": true, + "dtype": "float32", + "padding": [ + [ + 1, + 1 + ], + [ + 1, + 1 + ] + ], + "data_format": "channels_last" + }, + "inbound_nodes": [ + [ + [ + "block4_pool", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "conv2d_1", + "class_name": "Conv2D", + "config": { + "name": "conv2d_1", + "trainable": true, + "dtype": "float32", + "filters": 512, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "valid", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "linear", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "zero_padding2d_1", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "batch_normalization_1", + "class_name": "BatchNormalization", + "config": { + "name": "batch_normalization_1", + "trainable": true, + "dtype": "float32", + "axis": -1, + "momentum": 0.99, + "epsilon": 0.001, + "center": true, + "scale": true, + "beta_initializer": { + "class_name": "Zeros", + "config": {} + }, + "gamma_initializer": { + "class_name": "Ones", + "config": {} + }, + "moving_mean_initializer": { + "class_name": "Zeros", + "config": {} + }, + "moving_variance_initializer": { + "class_name": "Ones", + "config": {} + }, + "beta_regularizer": null, + "gamma_regularizer": null, + "beta_constraint": null, + "gamma_constraint": null + }, + "inbound_nodes": [ + [ + [ + "conv2d_1", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "up_sampling2d_1", + "class_name": "UpSampling2D", + "config": { + "name": "up_sampling2d_1", + "trainable": true, + "dtype": "float32", + "size": [ + 2, + 2 + ], + "data_format": "channels_last", + "interpolation": "nearest" + }, + "inbound_nodes": [ + [ + [ + "batch_normalization_1", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "concatenate_1", + "class_name": "Concatenate", + "config": { + "name": "concatenate_1", + "trainable": true, + "dtype": "float32", + "axis": -1 + }, + "inbound_nodes": [ + [ + [ + "up_sampling2d_1", + 0, + 0, + {} + ], + [ + "block3_pool", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "zero_padding2d_2", + "class_name": "ZeroPadding2D", + "config": { + "name": "zero_padding2d_2", + "trainable": true, + "dtype": "float32", + "padding": [ + [ + 1, + 1 + ], + [ + 1, + 1 + ] + ], + "data_format": "channels_last" + }, + "inbound_nodes": [ + [ + [ + "concatenate_1", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "conv2d_2", + "class_name": "Conv2D", + "config": { + "name": "conv2d_2", + "trainable": true, + "dtype": "float32", + "filters": 256, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "valid", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "linear", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "zero_padding2d_2", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "batch_normalization_2", + "class_name": "BatchNormalization", + "config": { + "name": "batch_normalization_2", + "trainable": true, + "dtype": "float32", + "axis": -1, + "momentum": 0.99, + "epsilon": 0.001, + "center": true, + "scale": true, + "beta_initializer": { + "class_name": "Zeros", + "config": {} + }, + "gamma_initializer": { + "class_name": "Ones", + "config": {} + }, + "moving_mean_initializer": { + "class_name": "Zeros", + "config": {} + }, + "moving_variance_initializer": { + "class_name": "Ones", + "config": {} + }, + "beta_regularizer": null, + "gamma_regularizer": null, + "beta_constraint": null, + "gamma_constraint": null + }, + "inbound_nodes": [ + [ + [ + "conv2d_2", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "up_sampling2d_2", + "class_name": "UpSampling2D", + "config": { + "name": "up_sampling2d_2", + "trainable": true, + "dtype": "float32", + "size": [ + 2, + 2 + ], + "data_format": "channels_last", + "interpolation": "nearest" + }, + "inbound_nodes": [ + [ + [ + "batch_normalization_2", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "concatenate_2", + "class_name": "Concatenate", + "config": { + "name": "concatenate_2", + "trainable": true, + "dtype": "float32", + "axis": -1 + }, + "inbound_nodes": [ + [ + [ + "up_sampling2d_2", + 0, + 0, + {} + ], + [ + "block2_pool", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "zero_padding2d_3", + "class_name": "ZeroPadding2D", + "config": { + "name": "zero_padding2d_3", + "trainable": true, + "dtype": "float32", + "padding": [ + [ + 1, + 1 + ], + [ + 1, + 1 + ] + ], + "data_format": "channels_last" + }, + "inbound_nodes": [ + [ + [ + "concatenate_2", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "conv2d_3", + "class_name": "Conv2D", + "config": { + "name": "conv2d_3", + "trainable": true, + "dtype": "float32", + "filters": 128, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "valid", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "linear", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "zero_padding2d_3", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "batch_normalization_3", + "class_name": "BatchNormalization", + "config": { + "name": "batch_normalization_3", + "trainable": true, + "dtype": "float32", + "axis": -1, + "momentum": 0.99, + "epsilon": 0.001, + "center": true, + "scale": true, + "beta_initializer": { + "class_name": "Zeros", + "config": {} + }, + "gamma_initializer": { + "class_name": "Ones", + "config": {} + }, + "moving_mean_initializer": { + "class_name": "Zeros", + "config": {} + }, + "moving_variance_initializer": { + "class_name": "Ones", + "config": {} + }, + "beta_regularizer": null, + "gamma_regularizer": null, + "beta_constraint": null, + "gamma_constraint": null + }, + "inbound_nodes": [ + [ + [ + "conv2d_3", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "up_sampling2d_3", + "class_name": "UpSampling2D", + "config": { + "name": "up_sampling2d_3", + "trainable": true, + "dtype": "float32", + "size": [ + 2, + 2 + ], + "data_format": "channels_last", + "interpolation": "nearest" + }, + "inbound_nodes": [ + [ + [ + "batch_normalization_3", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "concatenate_3", + "class_name": "Concatenate", + "config": { + "name": "concatenate_3", + "trainable": true, + "dtype": "float32", + "axis": -1 + }, + "inbound_nodes": [ + [ + [ + "up_sampling2d_3", + 0, + 0, + {} + ], + [ + "block1_pool", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "zero_padding2d_4", + "class_name": "ZeroPadding2D", + "config": { + "name": "zero_padding2d_4", + "trainable": true, + "dtype": "float32", + "padding": [ + [ + 1, + 1 + ], + [ + 1, + 1 + ] + ], + "data_format": "channels_last" + }, + "inbound_nodes": [ + [ + [ + "concatenate_3", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "conv2d_4", + "class_name": "Conv2D", + "config": { + "name": "conv2d_4", + "trainable": true, + "dtype": "float32", + "filters": 64, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "valid", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "linear", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "zero_padding2d_4", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "batch_normalization_4", + "class_name": "BatchNormalization", + "config": { + "name": "batch_normalization_4", + "trainable": true, + "dtype": "float32", + "axis": -1, + "momentum": 0.99, + "epsilon": 0.001, + "center": true, + "scale": true, + "beta_initializer": { + "class_name": "Zeros", + "config": {} + }, + "gamma_initializer": { + "class_name": "Ones", + "config": {} + }, + "moving_mean_initializer": { + "class_name": "Zeros", + "config": {} + }, + "moving_variance_initializer": { + "class_name": "Ones", + "config": {} + }, + "beta_regularizer": null, + "gamma_regularizer": null, + "beta_constraint": null, + "gamma_constraint": null + }, + "inbound_nodes": [ + [ + [ + "conv2d_4", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "conv2d_5", + "class_name": "Conv2D", + "config": { + "name": "conv2d_5", + "trainable": true, + "dtype": "float32", + "filters": 96, + "kernel_size": [ + 3, + 3 + ], + "strides": [ + 1, + 1 + ], + "padding": "same", + "data_format": "channels_last", + "dilation_rate": [ + 1, + 1 + ], + "activation": "linear", + "use_bias": true, + "kernel_initializer": { + "class_name": "VarianceScaling", + "config": { + "scale": 1.0, + "mode": "fan_avg", + "distribution": "uniform", + "seed": null + } + }, + "bias_initializer": { + "class_name": "Zeros", + "config": {} + }, + "kernel_regularizer": null, + "bias_regularizer": null, + "activity_regularizer": null, + "kernel_constraint": null, + "bias_constraint": null + }, + "inbound_nodes": [ + [ + [ + "batch_normalization_4", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "reshape_1", + "class_name": "Reshape", + "config": { + "name": "reshape_1", + "trainable": true, + "dtype": "float32", + "target_shape": [ + 38400, + -1 + ] + }, + "inbound_nodes": [ + [ + [ + "conv2d_5", + 0, + 0, + {} + ] + ] + ] + }, + { + "name": "activation_1", + "class_name": "Activation", + "config": { + "name": "activation_1", + "trainable": true, + "dtype": "float32", + "activation": "softmax" + }, + "inbound_nodes": [ + [ + [ + "reshape_1", + 0, + 0, + {} + ] + ] + ] + } + ], + "input_layers": [ + [ + "input_1", + 0, + 0 + ] + ], + "output_layers": [ + [ + "activation_1", + 0, + 0 + ] + ] + } + }, + "training_config": { + "optimizer_config": { + "class_name": "Adadelta", + "config": { + "learning_rate": 1.0, + "rho": 0.95, + "decay": 0.0, + "epsilon": 1e-07 + } + }, + "loss": "categorical_crossentropy", + "metrics": [ + "accuracy" + ], + "weighted_metrics": null, + "sample_weight_mode": null, + "loss_weights": null + } + }, + "weightsManifest": [ + { + "paths": [ + "group1-shard1of12.bin", + "group1-shard2of12.bin", + "group1-shard3of12.bin", + "group1-shard4of12.bin", + "group1-shard5of12.bin", + "group1-shard6of12.bin", + "group1-shard7of12.bin", + "group1-shard8of12.bin", + "group1-shard9of12.bin", + "group1-shard10of12.bin", + "group1-shard11of12.bin", + "group1-shard12of12.bin" + ], + "weights": [ + { + "name": "batch_normalization_1/gamma", + "shape": [ + 512 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_1/beta", + "shape": [ + 512 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_1/moving_mean", + "shape": [ + 512 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_1/moving_variance", + "shape": [ + 512 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_2/gamma", + "shape": [ + 256 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_2/beta", + "shape": [ + 256 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_2/moving_mean", + "shape": [ + 256 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_2/moving_variance", + "shape": [ + 256 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_3/gamma", + "shape": [ + 128 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_3/beta", + "shape": [ + 128 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_3/moving_mean", + "shape": [ + 128 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_3/moving_variance", + "shape": [ + 128 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_4/gamma", + "shape": [ + 64 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_4/beta", + "shape": [ + 64 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_4/moving_mean", + "shape": [ + 64 + ], + "dtype": "float32" + }, + { + "name": "batch_normalization_4/moving_variance", + "shape": [ + 64 + ], + "dtype": "float32" + }, + { + "name": "block1_conv1/kernel", + "shape": [ + 3, + 3, + 3, + 64 + ], + "dtype": "float32" + }, + { + "name": "block1_conv1/bias", + "shape": [ + 64 + ], + "dtype": "float32" + }, + { + "name": "block1_conv2/kernel", + "shape": [ + 3, + 3, + 64, + 64 + ], + "dtype": "float32" + }, + { + "name": "block1_conv2/bias", + "shape": [ + 64 + ], + "dtype": "float32" + }, + { + "name": "block2_conv1/kernel", + "shape": [ + 3, + 3, + 64, + 128 + ], + "dtype": "float32" + }, + { + "name": "block2_conv1/bias", + "shape": [ + 128 + ], + "dtype": "float32" + }, + { + "name": "block2_conv2/kernel", + "shape": [ + 3, + 3, + 128, + 128 + ], + "dtype": "float32" + }, + { + "name": "block2_conv2/bias", + "shape": [ + 128 + ], + "dtype": "float32" + }, + { + "name": "block3_conv1/kernel", + "shape": [ + 3, + 3, + 128, + 256 + ], + "dtype": "float32" + }, + { + "name": "block3_conv1/bias", + "shape": [ + 256 + ], + "dtype": "float32" + }, + { + "name": "block3_conv2/kernel", + "shape": [ + 3, + 3, + 256, + 256 + ], + "dtype": "float32" + }, + { + "name": "block3_conv2/bias", + "shape": [ + 256 + ], + "dtype": "float32" + }, + { + "name": "block3_conv3/kernel", + "shape": [ + 3, + 3, + 256, + 256 + ], + "dtype": "float32" + }, + { + "name": "block3_conv3/bias", + "shape": [ + 256 + ], + "dtype": "float32" + }, + { + "name": "block4_conv1/kernel", + "shape": [ + 3, + 3, + 256, + 512 + ], + "dtype": "float32" + }, + { + "name": "block4_conv1/bias", + "shape": [ + 512 + ], + "dtype": "float32" + }, + { + "name": "block4_conv2/kernel", + "shape": [ + 3, + 3, + 512, + 512 + ], + "dtype": "float32" + }, + { + "name": "block4_conv2/bias", + "shape": [ + 512 + ], + "dtype": "float32" + }, + { + "name": "block4_conv3/kernel", + "shape": [ + 3, + 3, + 512, + 512 + ], + "dtype": "float32" + }, + { + "name": "block4_conv3/bias", + "shape": [ + 512 + ], + "dtype": "float32" + }, + { + "name": "conv2d_1/kernel", + "shape": [ + 3, + 3, + 512, + 512 + ], + "dtype": "float32" + }, + { + "name": "conv2d_1/bias", + "shape": [ + 512 + ], + "dtype": "float32" + }, + { + "name": "conv2d_2/kernel", + "shape": [ + 3, + 3, + 768, + 256 + ], + "dtype": "float32" + }, + { + "name": "conv2d_2/bias", + "shape": [ + 256 + ], + "dtype": "float32" + }, + { + "name": "conv2d_3/kernel", + "shape": [ + 3, + 3, + 384, + 128 + ], + "dtype": "float32" + }, + { + "name": "conv2d_3/bias", + "shape": [ + 128 + ], + "dtype": "float32" + }, + { + "name": "conv2d_4/kernel", + "shape": [ + 3, + 3, + 192, + 64 + ], + "dtype": "float32" + }, + { + "name": "conv2d_4/bias", + "shape": [ + 64 + ], + "dtype": "float32" + }, + { + "name": "conv2d_5/kernel", + "shape": [ + 3, + 3, + 64, + 96 + ], + "dtype": "float32" + }, + { + "name": "conv2d_5/bias", + "shape": [ + 96 + ], + "dtype": "float32" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/demo/engine/Segm2d.js b/src/engine/Segm2d.js similarity index 88% rename from src/demo/engine/Segm2d.js rename to src/engine/Segm2d.js index 5b4e091b..80c1ee22 100644 --- a/src/demo/engine/Segm2d.js +++ b/src/engine/Segm2d.js @@ -1,3 +1,8 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview Segm2d * @author Epam @@ -9,6 +14,7 @@ // ******************************************************** import * as tf from '@tensorflow/tfjs'; +import PATH_MODEL from './PATH_MODEL.json'; // ******************************************************** // Const @@ -23,8 +29,6 @@ import * as tf from '@tensorflow/tfjs'; // - group1-shard12of12.bin: last binary koeeficient file // - .htaccess: file to prevent CORS issue -const PATH_MODEL = 'http://lugachai.ru/med3web/tfjs/model.json'; - // stages const STAGE_MODEL_NOT_LOADED = 0; const STAGE_MODEL_IS_LOADING = 1; @@ -33,18 +37,15 @@ const STAGE_IMAGE_PROCESSED = 3; const STAGE_SEGMENTATION_READY = 4; // const STAGE_READY_NEXT_IMAGE = 5; - const OUT_W = 240; const OUT_H = 160; const NUM_CLASSES = 96; - // ******************************************************** // Class // ******************************************************** -class Segm2d -{ +class Segm2d { constructor(objGraphics2d) { this.stage = STAGE_MODEL_NOT_LOADED; this.objGraphics2d = objGraphics2d; @@ -68,11 +69,11 @@ class Segm2d printTensor(tensor, numValues = 64 * 3) { console.log('tensor shape = ' + tensor.shape); const tensorData = tensor.dataSync(); - let strDebug = '' + let strDebug = ''; for (let i = 0; i < numValues; i++) { - strDebug += tensorData[i].toString() + ", "; + strDebug += tensorData[i].toString() + ', '; } - console.log("tensor raw data = " + strDebug); + console.log('tensor raw data = ' + strDebug); } // debug @@ -101,7 +102,7 @@ class Segm2d for (let y = 0; y < hDst; y++, ySrcAcc += yScale) { const ySrcBase = Math.floor(ySrcAcc); const yRem = ySrcAcc - ySrcBase; - const ySrcInd = (yRem < 0.5) ? 0 : 1; + const ySrcInd = yRem < 0.5 ? 0 : 1; const ySrc = ySrcBase + ySrcInd; const ySrcOff = ySrc * wSrc; @@ -109,10 +110,9 @@ class Segm2d for (let x = 0; x < wDst; x++, xSrcAcc += xScale) { const xSrcBase = Math.floor(xSrcAcc); const xRem = xSrcAcc - xSrcBase; - const xSrcInd = (xRem < 0.5) ? 0 : 1; + const xSrcInd = xRem < 0.5 ? 0 : 1; const xSrc = xSrcBase + xSrcInd; pixelsDst[iDst++] = pixelsSrcInt[xSrc + ySrcOff]; - } // for (x) } // for (y) } @@ -124,20 +124,20 @@ class Segm2d this.pixels = null; console.log('Loading tfjs model...'); - const modelLoaded = await tf.loadLayersModel(PATH_MODEL, { strict: false } ); + const modelLoaded = await tf.loadLayersModel(PATH_MODEL, { strict: false }); this.model = modelLoaded; this.stage = STAGE_MODEL_READY; // print success model loading - console.log("Model is loaded shape = " + modelLoaded.output.shape); + console.log('Model is loaded shape = ' + modelLoaded.output.shape); //this.objGraphics2d.forceUpdate(); this.startApplyImage(); } async startApplyImage() { this.stage = STAGE_IMAGE_PROCESSED; - console.log("Start apply segm to image ..."); + console.log('Start apply segm to image ...'); // prepare tensor const imgTensor = tf.browser.fromPixels(this.srcImageData).toFloat(); @@ -149,11 +149,11 @@ class Segm2d const imgResized = imgTensor.resizeBilinear([IN_W, IN_H]); // normalize to [-127..+127] - const mean = tf.tensor([123.0, 116.0, 103.0]) + const mean = tf.tensor([123.0, 116.0, 103.0]); const imgNormalized = imgResized.sub(mean); // reshape tensor => [1, 320, 480, 3] - const imgReshaped = imgNormalized.reshape([1, IN_W, IN_H, 3]); + const imgReshaped = imgNormalized.reshape([1, IN_W, IN_H, 3]); // apply prediction const prediction = this.model.predict(imgReshaped); @@ -196,7 +196,8 @@ class Segm2d // generate 96-colors palette const palette = new Uint8ClampedArray(256 * 4); let i, j; - i = 0; j = 0; + i = 0; + j = 0; // fill 5 first elements by hand palette[j++] = 0; palette[j++] = 0; @@ -242,7 +243,8 @@ class Segm2d const w = this.wSrc; const h = this.hSrc; - i = 0; j = 0; + i = 0; + j = 0; for (let y = 0; y < h; y++) { for (let x = 0; x < w; x++) { const ind = pixelsUpScale[i]; @@ -251,26 +253,25 @@ class Segm2d pixels[j + 2] = palette[ind * 4 + 2]; pixels[j + 3] = 255; - i++; j += 4; + i++; + j += 4; } } this.stage = STAGE_SEGMENTATION_READY; - console.log("Segm complete now "); + console.log('Segm complete now '); this.objGraphics2d.forceRender(); } getStageString() { - const msgArr = [ + return [ 'Wait. Model is not loaded', // const STAGE_MODEL_NOT_LOADED = 0; - 'Wait. Model is loading ...', // const STAGE_MODEL_IS_LOADING = 1; + 'Wait. Model is loading ...', // const STAGE_MODEL_IS_LOADING = 1; 'Model is ready', // const STAGE_MODEL_READY = 2; - 'Image is processed ...', // const STAGE_IMAGE_PROCESSED = 3; + 'Image is processed ...', // const STAGE_IMAGE_PROCESSED = 3; 'Segmentation is ready', // const STAGE_SEGMENTATION_READY = 4; - ]; - const strMessage = msgArr[this.stage]; - return strMessage; + ][this.stage]; } setImageData(imgData) { @@ -283,9 +284,9 @@ class Segm2d this.hSrc = h; // debug - console.log('Segm2d render. VGG model ' + ((this.model === null) ? 'not loaded' : 'loaded') ); + console.log('Segm2d render. VGG model ' + (this.model === null ? 'not loaded' : 'loaded')); const strMessage = this.getStageString(); - console.log('Segm2d render. stage = ' + strMessage ); + console.log('Segm2d render. stage = ' + strMessage); /* // load model @@ -299,8 +300,8 @@ class Segm2d } } // if model non null */ - - if ((this.stage === STAGE_SEGMENTATION_READY) && (this.pixels !== null)) { + + if (this.stage === STAGE_SEGMENTATION_READY && this.pixels !== null) { // draw pixels array on screen this.imgData = ctx.createImageData(w, h); const pixDst = this.imgData.data; @@ -313,11 +314,9 @@ class Segm2d return; } - - // clear screen ctx.fillStyle = 'rgb(64, 64, 64)'; - ctx.fillRect(0,0, w, h); + ctx.fillRect(0, 0, w, h); // draw cross ctx.strokeStyle = '#FF0000'; @@ -327,7 +326,7 @@ class Segm2d ctx.stroke(); ctx.beginPath(); - ctx.moveTo(w - 1 , 0); + ctx.moveTo(w - 1, 0); ctx.lineTo(0, h - 1); ctx.stroke(); // draw wait message diff --git a/src/demo/engine/TransFunc.js b/src/engine/TransFunc.js similarity index 75% rename from src/demo/engine/TransFunc.js rename to src/engine/TransFunc.js index c2c301ad..558cc560 100644 --- a/src/demo/engine/TransFunc.js +++ b/src/engine/TransFunc.js @@ -1,10 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview TransfFunc * @author Epam * @version 1.0.0 */ - // ******************************************************** // Imports // ******************************************************** @@ -27,12 +31,8 @@ class TransfFunc { { r: 255, g: 255, b: 255 }, { r: 255, g: 255, b: 255 }, ]; - this.m_handleX = [ - 0, 22, 40, 55, 61, 115, 118, 125, 160, 255 - ]; - this.m_handleY = [ - 0, 0, 0.3, 0.12, 0, 0, 0.4, 0.8, 0.95, 1.0 - ]; + this.m_handleX = [0, 22, 40, 55, 61, 115, 118, 125, 160, 255]; + this.m_handleY = [0, 0, 0.3, 0.12, 0, 0, 0.4, 0.8, 0.95, 1.0]; // screen projections this.m_proj = [ { x: 0, y: 0 }, @@ -44,7 +44,7 @@ class TransfFunc { { x: 0, y: 0 }, { x: 0, y: 0 }, { x: 0, y: 0 }, - { x: 0, y: 0 } + { x: 0, y: 0 }, ]; // check correct array size if (this.m_handleColors.length !== this.m_numHandles) { @@ -53,7 +53,6 @@ class TransfFunc { } // end constructor render(ctx, xMin, yMin, wScreen, hScreen) { - this.m_xMin = xMin; this.m_yMin = yMin; this.m_wScreen = wScreen; @@ -64,16 +63,17 @@ class TransfFunc { const RAD_CIRCLE = Math.floor(wScreen / 50.0); this.m_radCircle = RAD_CIRCLE; ctx.lineWidth = 1; - ctx.strokeStyle = '#000000' + ctx.strokeStyle = '#000000'; let xPre, yPre; // draw lines - xPre = -1; yPre = -1; + xPre = -1; + yPre = -1; for (let i = 0; i < this.m_numHandles; i++) { const xFunc = this.m_handleX[i]; const yFunc = this.m_handleY[i]; - const x = xMin + Math.floor(wScreen * xFunc / X_MAX); - const y = yMin + Math.floor(hScreen - 1 - hScreen * yFunc / Y_MAX); + const x = xMin + Math.floor((wScreen * xFunc) / X_MAX); + const y = yMin + Math.floor(hScreen - 1 - (hScreen * yFunc) / Y_MAX); this.m_proj[i].x = x; this.m_proj[i].y = y; if (i > 0) { @@ -89,14 +89,14 @@ class TransfFunc { for (let i = 0; i < this.m_numHandles; i++) { const xFunc = this.m_handleX[i]; const yFunc = this.m_handleY[i]; - const x = xMin + Math.floor(wScreen * xFunc / X_MAX); - const y = yMin + Math.floor(hScreen - 1 - hScreen * yFunc / Y_MAX); + const x = xMin + Math.floor((wScreen * xFunc) / X_MAX); + const y = yMin + Math.floor(hScreen - 1 - (hScreen * yFunc) / Y_MAX); let strRCol = this.m_handleColors[i].r.toString(16); let strGCol = this.m_handleColors[i].g.toString(16); let strBCol = this.m_handleColors[i].b.toString(16); - strRCol = (strRCol.length === 1) ? ('0' + strRCol) : strRCol; - strGCol = (strGCol.length === 1) ? ('0' + strGCol) : strGCol; - strBCol = (strBCol.length === 1) ? ('0' + strBCol) : strBCol; + strRCol = strRCol.length === 1 ? '0' + strRCol : strRCol; + strGCol = strGCol.length === 1 ? '0' + strGCol : strGCol; + strBCol = strBCol.length === 1 ? '0' + strBCol : strBCol; const strColor = `#${strRCol}${strGCol}${strBCol}`; // console.log(`strColor = ${strColor}`); ctx.fillStyle = strColor; @@ -105,7 +105,6 @@ class TransfFunc { ctx.fill(); ctx.stroke(); } // for (i) all handle points - } // end render onMouseDown(xScr, yScr) { @@ -125,7 +124,7 @@ class TransfFunc { /** * on mouse up even t handler - * + * * @param {number} xScr - mouse x position on screen * @param {number} yScr - mouse y position on screen */ @@ -136,15 +135,15 @@ class TransfFunc { onMouseMove(xScr, yScr) { if (this.m_mouseDown) { - const isBorderPoint = (this.m_indexMoved === 0) || (this.m_indexMoved === this.m_numHandles - 1); + const isBorderPoint = this.m_indexMoved === 0 || this.m_indexMoved === this.m_numHandles - 1; let xScrNew; let yScrNew; if (isBorderPoint) { xScrNew = this.m_proj[this.m_indexMoved].x; } else { xScrNew = xScr; - xScrNew = (xScrNew < this.m_proj[this.m_indexMoved - 1].x) ? this.m_proj[this.m_indexMoved - 1].x : xScrNew; - xScrNew = (xScrNew > this.m_proj[this.m_indexMoved + 1].x) ? this.m_proj[this.m_indexMoved + 1].x : xScrNew; + xScrNew = xScrNew < this.m_proj[this.m_indexMoved - 1].x ? this.m_proj[this.m_indexMoved - 1].x : xScrNew; + xScrNew = xScrNew > this.m_proj[this.m_indexMoved + 1].x ? this.m_proj[this.m_indexMoved + 1].x : xScrNew; } yScrNew = yScr; @@ -161,14 +160,14 @@ class TransfFunc { const X_MAX = 255; const Y_MAX = 1.0; - const xFunc = (xScrNew - this.m_xMin) * X_MAX / this.m_wScreen; - const yFunc = (this.m_yMin + this.m_hScreen - 1 - yScrNew) * Y_MAX / this.m_hScreen; + const xFunc = ((xScrNew - this.m_xMin) * X_MAX) / this.m_wScreen; + const yFunc = ((this.m_yMin + this.m_hScreen - 1 - yScrNew) * Y_MAX) / this.m_hScreen; this.m_handleX[this.m_indexMoved] = xFunc; this.m_handleY[this.m_indexMoved] = yFunc; return true; } return false; } -}; //end class TransfFunc +} //end class TransfFunc export default TransfFunc; diff --git a/src/demo/engine/Volume.js b/src/engine/Volume.js similarity index 77% rename from src/demo/engine/Volume.js rename to src/engine/Volume.js index 42b7c11a..d9c6dcea 100644 --- a/src/demo/engine/Volume.js +++ b/src/engine/Volume.js @@ -1,40 +1,17 @@ -/** - * @fileOverview Volume - * @author Epam - * @version 1.0.0 +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 */ - -// ******************************************************** -// Imports -// ******************************************************** - import React from 'react'; -//import LoaderKtx from './loaders/LoaderKtx'; -//import LoaderNifti from './loaders/LoaderNifti'; -//import LoaderDicom from './loaders/LoaderDicom'; -//import LoaderHdr from './loaders/LoaderHdr'; - -// ******************************************************** -// Const -// ******************************************************** - export const VOLUME_ICON_SIDE = 64; - -// ******************************************************** -// Class -// ******************************************************** - /** - * Class Volume - * + * Class Volume + * * Result volume, loaded from Dicom, Ktx, Nifti, ... files */ class Volume extends React.Component { - /** - * @param {object} props - props from up level object - */ constructor(props) { super(props); this.m_xDim = 0; @@ -44,7 +21,9 @@ class Volume extends React.Component { this.m_dataArray = null; this.m_dataSize = 0; this.m_boxSize = { - x: 0.0, y: 0.0, z: 0.0 + x: 0.0, + y: 0.0, + z: 0.0, }; // icon to show this.m_xIcon = 0; @@ -61,7 +40,9 @@ class Volume extends React.Component { this.m_dataArray = new Uint8Array(xyzDim); this.m_dataSize = xyzDim; this.m_boxSize = { - x: xDim, y: yDim, z: zDim + x: xDim, + y: yDim, + z: zDim, }; for (let i = 0; i < xyzDim; i++) { this.m_dataArray[i] = 0; @@ -74,7 +55,7 @@ class Volume extends React.Component { console.assert(this.m_yDim > 0); console.assert(this.m_zDim > 0); console.assert(this.m_dataArray !== null); - const sizeSrcMax = (this.m_xDim > this.m_yDim) ? this.m_xDim : this.m_yDim; + const sizeSrcMax = this.m_xDim > this.m_yDim ? this.m_xDim : this.m_yDim; const scale = sizeSrcMax / VOLUME_ICON_SIDE; // central slice @@ -85,12 +66,12 @@ class Volume extends React.Component { this.m_yIcon = this.m_xIcon; const numPixelsIcon = this.m_xIcon * this.m_yIcon; this.m_dataIcon = new Uint8Array(numPixelsIcon); - for (let i = 0; i < numPixelsIcon; i++){ + for (let i = 0; i < numPixelsIcon; i++) { this.m_dataIcon[i] = 0; } // actual size in icon (dest image) - const wDst = Math.floor(VOLUME_ICON_SIDE * this.m_xDim / sizeSrcMax); - const hDst = Math.floor(VOLUME_ICON_SIDE * this.m_yDim / sizeSrcMax); + const wDst = Math.floor((VOLUME_ICON_SIDE * this.m_xDim) / sizeSrcMax); + const hDst = Math.floor((VOLUME_ICON_SIDE * this.m_yDim) / sizeSrcMax); // top left corner in dst image const xDstL = Math.floor(this.m_xIcon / 2 - wDst / 2); const yDstT = Math.floor(this.m_yIcon / 2 - hDst / 2); @@ -115,15 +96,15 @@ class Volume extends React.Component { if (this.m_zDim < 4) { return; } - const xDimNew = (this.m_xDim + 3) & (~3); - const yDimNew = (this.m_yDim + 3) & (~3); - const zDimNew = (this.m_zDim + 3) & (~3); - if ((this.m_xDim === xDimNew) && (this.m_yDim === yDimNew) && (this.m_zDim === zDimNew)) { + const xDimNew = (this.m_xDim + 3) & ~3; + const yDimNew = (this.m_yDim + 3) & ~3; + const zDimNew = (this.m_zDim + 3) & ~3; + if (this.m_xDim === xDimNew && this.m_yDim === yDimNew && this.m_zDim === zDimNew) { return; // do nothing } // if new size the same as current // perfom convert adding black pixels console.log(`Volume. makeDimensions4x. Convert into ${xDimNew}*${yDimNew}*${zDimNew}`); - const xyzDimNew = xDimNew * yDimNew * zDimNew; + const xyzDimNew = xDimNew * yDimNew * zDimNew; const bytesPerVoxel = this.m_bytesPerVoxel; const bufSizeBytes = xyzDimNew * bytesPerVoxel; const datArrayNew = new Uint8Array(xyzDimNew * bytesPerVoxel); @@ -134,8 +115,10 @@ class Volume extends React.Component { const ONE = 1; const FOUR = 4; - const OFF_0 = 0; const OFF_1 = 1; - const OFF_2 = 2; const OFF_3 = 3; + const OFF_0 = 0; + const OFF_1 = 1; + const OFF_2 = 2; + const OFF_3 = 3; console.log(`Volume info: xyzDim = ${this.m_xDim}*${this.m_yDim}*${this.m_zDim}`); console.log(`Volume info: bpp = ${this.m_bytesPerVoxel}`); @@ -191,7 +174,6 @@ class Volume extends React.Component { render() { return <p>></p>; } - } // end class Volume export default Volume; diff --git a/src/demo/engine/Volume.test.js b/src/engine/Volume.test.js similarity index 77% rename from src/demo/engine/Volume.test.js rename to src/engine/Volume.test.js index c34bd096..91afe71e 100644 --- a/src/demo/engine/Volume.test.js +++ b/src/engine/Volume.test.js @@ -1,3 +1,7 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ // ******************************************************** // Imports @@ -15,7 +19,7 @@ describe('VolumeTests', () => { const _writeInt = (arrBuf, offs, valInt) => { let offsNew = offs; let val = valInt; - for(let i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { const bt = val & 0xff; val >>= 8; arrBuf[offsNew++] = bt; @@ -35,21 +39,20 @@ describe('VolumeTests', () => { const SHIFT_16 = 16; const SHIFT_24 = 24; - const VAL_DWORD = ((VAL_0) | (VAL_1 << SHIFT_8) | (VAL_2 << SHIFT_16) | (VAL_3 << SHIFT_24)); + const VAL_DWORD = VAL_0 | (VAL_1 << SHIFT_8) | (VAL_2 << SHIFT_16) | (VAL_3 << SHIFT_24); // console.log(`test. dword = ${VAL_DWORD.toString(16)}`); _writeInt(bufBytes, 0, VAL_DWORD); // console.log(`test. array0 = ${bufBytes[0].toString(16)}`); // console.log(`test. array1 = ${bufBytes[1].toString(16)}`); // console.log(`test. array2 = ${bufBytes[2].toString(16)}`); // console.log(`test. array3 = ${bufBytes[3].toString(16)}`); - const isOk0 = (bufBytes[0] === VAL_0); - const isOk1 = (bufBytes[1] === VAL_1); - const isOk2 = (bufBytes[2] === VAL_2); - const isOk3 = (bufBytes[3] === VAL_3); + const isOk0 = bufBytes[0] === VAL_0; + const isOk1 = bufBytes[1] === VAL_1; + const isOk2 = bufBytes[2] === VAL_2; + const isOk3 = bufBytes[3] === VAL_3; expect(isOk0).toBeTruthy(); expect(isOk1).toBeTruthy(); expect(isOk2).toBeTruthy(); expect(isOk3).toBeTruthy(); }); - }); diff --git a/src/demo/engine/VolumeRenderer3d.js b/src/engine/VolumeRenderer3d.js similarity index 83% rename from src/demo/engine/VolumeRenderer3d.js rename to src/engine/VolumeRenderer3d.js index 810a01f3..a537b1bf 100644 --- a/src/demo/engine/VolumeRenderer3d.js +++ b/src/engine/VolumeRenderer3d.js @@ -1,29 +1,8 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** - * 3D volume/isosurface rendering engine - * @module app/scripts/engine/VolumeRenderer3d + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 */ - import * as THREE from 'three'; -// import swal from 'sweetalert'; import GlSelector from './GlSelector'; import OrbitControl from './orbitcontrol'; @@ -36,16 +15,10 @@ import MaterialRenderToTexture from './gfx/matrendertotexture'; import MaterialInterpolation from './gfx/matinterpolation'; import MaterialVolumeRender from './gfx/matvolumerender'; import VolumeFilter3D from './volumeFilter3d'; -import RoiPalette from './loaders/roipalette'; import TetrahedronGenerator from './actvolume/tetra'; import Graphics23d from './tools23d/graphics23d'; -// import MaterialColor2d from './gfx/matcolor2d'; - - -// import GlCheck from './glcheck'; -// import GeoRender from '../actvolume/georender'; +import { getPalette256 } from './loaders/RoiPalette256'; -/** @constant {number} SCENE_3D_BACKGROUND_COLOR - backgroudn color for 3d window */ const SCENE_3D_BACKGROUND_COLOR = 0x0; const VOLUME_COLOR1_MIN_R = 0.1; const VOLUME_COLOR1_MIN_G = 0.0; @@ -65,15 +38,12 @@ const VOLUME_COLOR2_MAX_B = 0.3; const STEP_SIZE1 = 0.0025; const STEP_SIZE2 = 0.0033; const STEP_SIZE3 = 0.0025; -//const STEP_SIZE3 = 0.0039; const STEP_SIZE4 = 0.0029; const OPACITY_SCALE = 175.0; -//const MIN_FPS = 10; // Special values to check frame buffer const CHECK_MODE_NOT_CHECKED = 0; const CHECK_MODE_RESULT_OK = 1; -// const CHECK_MODE_RESULT_BAD = 2; // When scene is ready (how much materials are created via arrow functions) const SCENE_READY_COUNTER_OK = 5; @@ -84,7 +54,6 @@ const SCENE_TYPE_SPHERE = 1; /** Class Graphics3d is used for 3d render */ export default class VolumeRenderer3d { - /** * Initialize render * @param (object) props - object container for various properties @@ -148,8 +117,10 @@ export default class VolumeRenderer3d { this.isWebGL2 = glSelector.useWebGL2(); this.canvas3d = glSelector.getCanvas(); this.renderer = new THREE.WebGLRenderer({ - antialias: false, canvas: this.canvas3d, - preserveDrawingBuffer: true, context: this.context + antialias: false, + canvas: this.canvas3d, + preserveDrawingBuffer: true, + context: this.context, }); this.renderer.autoClearStencil = false; this.renderer.autoClearColor = false; @@ -181,12 +152,9 @@ export default class VolumeRenderer3d { // the cutting plane and the direction vector onto the light source // this.orbitControl = new OrbitControl(root3dContainer, this.camera, this.scene, this.meshSphere, () => { this.orbitControl = new OrbitControl(this.renderer.domElement, this.camera, this.scene, this.mesh, () => { - if (true) { // if (this.checkFrameBufferMode === CHECK_MODE_RESULT_OK) { - this.updateCutPlanes(); - this.updateLightDir(); - //this.updateMeshSphere(); - } + this.updateCutPlanes(); + this.updateLightDir(); }); //this.orbitControl.addCallbacks(); @@ -197,9 +165,9 @@ export default class VolumeRenderer3d { this.renderer.gammaOutput = true; this.RENDER_STATE = { - ENABLED : 0, - ONCE : 1, - DISABLED : 2 + ENABLED: 0, + ONCE: 1, + DISABLED: 2, }; this.renderState = this.RENDER_STATE.ENABLED; @@ -239,7 +207,6 @@ export default class VolumeRenderer3d { y: 1.0, z: 1.0, }; - } setFileDataType(curFileDataType) { @@ -247,8 +214,8 @@ export default class VolumeRenderer3d { } /** - * Special scene with sphere: remove old before adding new one - */ + * Special scene with sphere: remove old before adding new one + */ removeSphereFromSphereScene() { if (this.meshSphere !== null) { this.sceneSphere.remove(this.meshSphere); @@ -258,8 +225,8 @@ export default class VolumeRenderer3d { } /** - * Special scene with sphere: add new generated Three js geometry (sphere) - */ + * Special scene with sphere: add new generated Three js geometry (sphere) + */ addSphereToSphereScene() { const gen = new TetrahedronGenerator(); const vRadius = new THREE.Vector3(0.5, 0.5, 0.5); @@ -311,11 +278,11 @@ export default class VolumeRenderer3d { } /** - * Special scene with sphere: copy rotated (by mouse) orientation from - * main mesh to sphere mesh - */ + * Special scene with sphere: copy rotated (by mouse) orientation from + * main mesh to sphere mesh + */ updateMeshSphere() { - /* + /* if (this.meshSphere !== null) { const pos = this.mesh.position; const quat = this.mesh.quaternion; @@ -330,7 +297,7 @@ export default class VolumeRenderer3d { * Returns true if the maderial for VolumeRender is set */ isVolumeLoaded() { - return (this.matVolumeRender !== null); + return this.matVolumeRender !== null; } fov2Tan(fov) { @@ -365,7 +332,7 @@ export default class VolumeRenderer3d { // screen shot should contain the principal area of interest (a centered square touching screen sides) const areaOfInterestSize = Math.min(this.windowWidth, this.windowHeight); - const areaOfInterestTanFov2 = originalTanFov2 * areaOfInterestSize / this.windowHeight; + const areaOfInterestTanFov2 = (originalTanFov2 * areaOfInterestSize) / this.windowHeight; // set appropriate camera aspect & FOV const shotAspect = width / height; @@ -407,8 +374,7 @@ export default class VolumeRenderer3d { this.Tool23D = isTool23D; if (this.Tool23D) { this.graphics23d = new Graphics23d(this.scene23D, this.windowWidth, this.windowHeight); - } - else { + } else { this.graphics23d = null; } } @@ -600,44 +566,82 @@ export default class VolumeRenderer3d { setTransferFuncVec3(values, colorFlag) { if (this.matRenderToTexture !== null) { if (colorFlag === 0) { - this.matRenderToTexture.uniforms.t_function1min.value = - new THREE.Vector4(VOLUME_COLOR1_MIN_R, VOLUME_COLOR1_MIN_G, VOLUME_COLOR1_MIN_B, values[0]); + this.matRenderToTexture.uniforms.t_function1min.value = new THREE.Vector4( + VOLUME_COLOR1_MIN_R, + VOLUME_COLOR1_MIN_G, + VOLUME_COLOR1_MIN_B, + values[0] + ); } else { - this.matRenderToTexture.uniforms.t_function1min.value = - new THREE.Vector4(VOLUME_COLOR3_MIN_R, VOLUME_COLOR3_MIN_G, VOLUME_COLOR3_MIN_B, values[0]); + this.matRenderToTexture.uniforms.t_function1min.value = new THREE.Vector4( + VOLUME_COLOR3_MIN_R, + VOLUME_COLOR3_MIN_G, + VOLUME_COLOR3_MIN_B, + values[0] + ); } this.matRenderToTexture.uniforms.t_function1min.needsUpdate = true; - this.matRenderToTexture.uniforms.t_function1max.value = - new THREE.Vector4(VOLUME_COLOR1_MAX_R, VOLUME_COLOR1_MAX_G, VOLUME_COLOR1_MAX_B, values[1]); + this.matRenderToTexture.uniforms.t_function1max.value = new THREE.Vector4( + VOLUME_COLOR1_MAX_R, + VOLUME_COLOR1_MAX_G, + VOLUME_COLOR1_MAX_B, + values[1] + ); this.matRenderToTexture.uniforms.t_function1max.needsUpdate = true; - this.matRenderToTexture.uniforms.t_function2min.value = - new THREE.Vector4(VOLUME_COLOR2_MIN_R, VOLUME_COLOR2_MIN_G, VOLUME_COLOR2_MIN_B, values[2]); + this.matRenderToTexture.uniforms.t_function2min.value = new THREE.Vector4( + VOLUME_COLOR2_MIN_R, + VOLUME_COLOR2_MIN_G, + VOLUME_COLOR2_MIN_B, + values[2] + ); this.matRenderToTexture.uniforms.t_function2min.needsUpdate = true; - this.matRenderToTexture.uniforms.t_function2max.value = - new THREE.Vector4(VOLUME_COLOR2_MAX_R, VOLUME_COLOR2_MAX_G, VOLUME_COLOR2_MAX_B, values[2]); + this.matRenderToTexture.uniforms.t_function2max.value = new THREE.Vector4( + VOLUME_COLOR2_MAX_R, + VOLUME_COLOR2_MAX_G, + VOLUME_COLOR2_MAX_B, + values[2] + ); this.matRenderToTexture.uniforms.t_function2max.needsUpdate = true; - this.matRenderToTexture.uniforms.stepSize.value = - new THREE.Vector4(STEP_SIZE1, STEP_SIZE2, STEP_SIZE3, STEP_SIZE4); + this.matRenderToTexture.uniforms.stepSize.value = new THREE.Vector4(STEP_SIZE1, STEP_SIZE2, STEP_SIZE3, STEP_SIZE4); this.matRenderToTexture.uniforms.stepSize.needsUpdate = true; if (colorFlag === 0) { - this.matVolumeRender.uniforms.t_function1min.value = - new THREE.Vector4(VOLUME_COLOR1_MIN_R, VOLUME_COLOR1_MIN_G, VOLUME_COLOR1_MIN_B, values[0]); + this.matVolumeRender.uniforms.t_function1min.value = new THREE.Vector4( + VOLUME_COLOR1_MIN_R, + VOLUME_COLOR1_MIN_G, + VOLUME_COLOR1_MIN_B, + values[0] + ); } else { - this.matVolumeRender.uniforms.t_function1min.value = - new THREE.Vector4(VOLUME_COLOR3_MIN_R, VOLUME_COLOR3_MIN_G, VOLUME_COLOR3_MIN_B, values[0]); + this.matVolumeRender.uniforms.t_function1min.value = new THREE.Vector4( + VOLUME_COLOR3_MIN_R, + VOLUME_COLOR3_MIN_G, + VOLUME_COLOR3_MIN_B, + values[0] + ); } this.matVolumeRender.uniforms.t_function1min.needsUpdate = true; - this.matVolumeRender.uniforms.t_function1max.value = - new THREE.Vector4(VOLUME_COLOR1_MAX_R, VOLUME_COLOR1_MAX_G, VOLUME_COLOR1_MAX_B, values[1]); + this.matVolumeRender.uniforms.t_function1max.value = new THREE.Vector4( + VOLUME_COLOR1_MAX_R, + VOLUME_COLOR1_MAX_G, + VOLUME_COLOR1_MAX_B, + values[1] + ); this.matVolumeRender.uniforms.t_function1max.needsUpdate = true; - this.matVolumeRender.uniforms.t_function2min.value = - new THREE.Vector4(VOLUME_COLOR2_MIN_R, VOLUME_COLOR2_MIN_G, VOLUME_COLOR2_MIN_B, values[2]); + this.matVolumeRender.uniforms.t_function2min.value = new THREE.Vector4( + VOLUME_COLOR2_MIN_R, + VOLUME_COLOR2_MIN_G, + VOLUME_COLOR2_MIN_B, + values[2] + ); this.matVolumeRender.uniforms.t_function2min.needsUpdate = true; - this.matVolumeRender.uniforms.t_function2max.value = - new THREE.Vector4(VOLUME_COLOR2_MAX_R, VOLUME_COLOR2_MAX_G, VOLUME_COLOR2_MAX_B, values[2]); + this.matVolumeRender.uniforms.t_function2max.value = new THREE.Vector4( + VOLUME_COLOR2_MAX_R, + VOLUME_COLOR2_MAX_G, + VOLUME_COLOR2_MAX_B, + values[2] + ); this.matVolumeRender.uniforms.t_function2max.needsUpdate = true; - this.matVolumeRender.uniforms.stepSize.value = - new THREE.Vector4(STEP_SIZE1, STEP_SIZE2, STEP_SIZE3, STEP_SIZE4); + this.matVolumeRender.uniforms.stepSize.value = new THREE.Vector4(STEP_SIZE1, STEP_SIZE2, STEP_SIZE3, STEP_SIZE4); this.matVolumeRender.uniforms.stepSize.needsUpdate = true; } } @@ -698,11 +702,11 @@ export default class VolumeRenderer3d { const vy = this.geometrySphere.getAttribute('position').getY(i); const vz = this.geometrySphere.getAttribute('position').getZ(i); // eslint-disable-next-line - uvw[i * VAL_3 + 0] = -vx / this.vBoxVirt.x;// / this.vBoxVirt.x; //-(vx + this.geo_offset1.x) * this.geo_scale.x + this.geo_offset2.x; + uvw[i * VAL_3 + 0] = -vx / this.vBoxVirt.x; // / this.vBoxVirt.x; //-(vx + this.geo_offset1.x) * this.geo_scale.x + this.geo_offset2.x; // eslint-disable-next-line - uvw[i * VAL_3 + 1] = +vy / this.vBoxVirt.y;// / this.vBoxVirt.y; //(vy + this.geo_offset1.y) * this.geo_scale.y + this.geo_offset2.y; + uvw[i * VAL_3 + 1] = +vy / this.vBoxVirt.y; // / this.vBoxVirt.y; //(vy + this.geo_offset1.y) * this.geo_scale.y + this.geo_offset2.y; // eslint-disable-next-line - uvw[i * VAL_3 + 2] = +vz / this.vBoxVirt.z;// / this.vBoxVirt.z; //(vz + this.geo_offset1.z) * this.geo_scale.z + this.geo_offset2.z; + uvw[i * VAL_3 + 2] = +vz / this.vBoxVirt.z; // / this.vBoxVirt.z; //(vz + this.geo_offset1.z) * this.geo_scale.z + this.geo_offset2.z; } this.geometrySphere.addAttribute('uvw', new THREE.BufferAttribute(uvw, VAL_3)); this.geometrySphere.getAttribute('uvw').needsUpdate = true; @@ -712,7 +716,9 @@ export default class VolumeRenderer3d { if (NEED_FACE_VERTEX_UVW) { this.geometrySphere.faceVertexUvs = []; const numVertices = this.geometrySphere.vertices.count; - const OFF_0 = 0, OFF_1 = 1, OFF_2 = 2; + const OFF_0 = 0, + OFF_1 = 1, + OFF_2 = 2; const uvw = new Float32Array(numVertices * VAL_3); let j = 0; for (let i = 0; i < numVertices; i++, j += VAL_3) { @@ -771,7 +777,6 @@ export default class VolumeRenderer3d { uvw[i * VAL_3 + 1] = v.y; // eslint-disable-next-line uvw[i * VAL_3 + 2] = v.z; - } this.planeGeometry.addAttribute('uvw', new THREE.BufferAttribute(uvw, VAL_3)); this.planeGeometry.getAttribute('uvw').needsUpdate = true; @@ -797,12 +802,12 @@ export default class VolumeRenderer3d { * @param (bool) isRoiVolume) - is roi volume */ initWithVolume(volume, box, nonEmptyBoxMin, nonEmptyBoxMax, isRoiVolume, isFULL3D) { - let sideMax = (box.x > box.y) ? box.x : box.y; - sideMax = (box.z > sideMax) ? box.z : sideMax; + let sideMax = box.x > box.y ? box.x : box.y; + sideMax = box.z > sideMax ? box.z : sideMax; this.vBoxVirt.x = box.x / sideMax; this.vBoxVirt.y = box.y / sideMax; this.vBoxVirt.z = box.z / sideMax; - this.isoThreshold = this.curFileDataType.thresholdIsosurf; + this.isoThreshold = this.curFileDataType.thresholdIsosurf; this.volume = volume; this.nonEmptyBoxMin = nonEmptyBoxMin; this.nonEmptyBoxMax = nonEmptyBoxMax; @@ -862,7 +867,7 @@ export default class VolumeRenderer3d { this.camera.position.set(0.0, 0.0, 1.5); // eslint-disable-next-line this.camera.lookAt(new THREE.Vector3(0.0, 0.0, 0.0)); - // Create 3D texture + // Create 3D texture const xDim = this.volume.m_xDim; const yDim = this.volume.m_yDim; const zDim = this.volume.m_zDim; @@ -874,8 +879,7 @@ export default class VolumeRenderer3d { this.isRoiVolume = isRoiVolume; this.roiPalette = null; if (isRoiVolume === true) { - const palette = new RoiPalette(); - this.roiPalette = palette.getPalette256(); + this.roiPalette = getPalette256(); const BYTES_PER_COLOR = 4; const MAGIC_COLOR = 250; const OFFS_0 = 0; @@ -929,14 +933,13 @@ export default class VolumeRenderer3d { // Create Render Target for front face render //this.ffTexture = new THREE.WebGLRenderTarget(this.windowWidth * window.devicePixelRatio, //this.windowHeight * window.devicePixelRatio, { - this.ffTexture = new THREE.WebGLRenderTarget(this.windowWidth, - this.windowHeight, { - minFilter: THREE.LinearFilter, - magFilter: THREE.LinearFilter, - format: THREE.RGBAFormat, - type: THREE.FloatType, - depthBuffer: true, - }); + this.ffTexture = new THREE.WebGLRenderTarget(this.windowWidth, this.windowHeight, { + minFilter: THREE.LinearFilter, + magFilter: THREE.LinearFilter, + format: THREE.RGBAFormat, + type: THREE.FloatType, + depthBuffer: true, + }); this.bufferFFTextureCPU = new Float32Array(VAL_4 * this.windowWidth * this.windowHeight); if (this.renderfTexture) { @@ -948,14 +951,13 @@ export default class VolumeRenderer3d { this.ySmallTexSize = Math.floor(this.windowHeight / VAL_3); //this.renderToTexture = new THREE.WebGLRenderTarget((this.windowWidth * window.devicePixelRatio) / VAL_3, //(this.windowHeight * window.devicePixelRatio) / VAL_3, { - this.renderToTexture = new THREE.WebGLRenderTarget(this.xSmallTexSize, - this.ySmallTexSize, { - minFilter: THREE.NearestFilter, - magFilter: THREE.NearestFilter, - format: THREE.RGBAFormat, - type: THREE.FloatType, - depthBuffer: true, - }); + this.renderToTexture = new THREE.WebGLRenderTarget(this.xSmallTexSize, this.ySmallTexSize, { + minFilter: THREE.NearestFilter, + magFilter: THREE.NearestFilter, + format: THREE.RGBAFormat, + type: THREE.FloatType, + depthBuffer: true, + }); this.bufferRenderToTextureCPU = new Float32Array(VAL_4 * this.xSmallTexSize * this.ySmallTexSize); } else { console.log('cant create float texture'); @@ -997,7 +999,6 @@ export default class VolumeRenderer3d { this.orbitControl.setMesh(this.mesh); this.orbitControl.setWireMesh(this.meshSphere); - // Create material for volume render to texture const offsets = []; const nOffs = 64; @@ -1008,31 +1009,48 @@ export default class VolumeRenderer3d { // eslint-disable-next-line const y = Math.random() * 2 - 1; // eslint-disable-next-line -// const z = Math.random() * 2 - 1; + // const z = Math.random() * 2 - 1; const z = -Math.random(); offsets.push(new THREE.Vector3(x, y, z)); } this.matRenderToTextureThreeGS = new MaterialRenderToTexture(); this.matRenderToTextureThreeGS.m_uniforms.colorMap1D.value = this.colorMapTexture; - this.matRenderToTextureThreeGS.create(this.texTF, this.volTexture, - null, this.texVolumeAO, this.bfTexture.texture, this.ffTexture.texture, offsets, + this.matRenderToTextureThreeGS.create( + this.texTF, + this.volTexture, + null, + this.texVolumeAO, + this.bfTexture.texture, + this.ffTexture.texture, + offsets, //this.volTextureMask, this.texVolumeAO, this.bfTexture.texture, this.ffTexture.texture, offsets, (mat) => { - mat.uniforms.t_function1min.value = - new THREE.Vector4(VOLUME_COLOR1_MIN_R, VOLUME_COLOR1_MIN_G, VOLUME_COLOR1_MIN_B, - this.curFileDataType.thresholdTissue1); - mat.uniforms.t_function1max.value = - new THREE.Vector4(VOLUME_COLOR1_MAX_R, VOLUME_COLOR1_MAX_G, VOLUME_COLOR1_MAX_B, - this.curFileDataType.thresholdTissue2); - mat.uniforms.t_function2min.value = - new THREE.Vector4(VOLUME_COLOR2_MIN_R, VOLUME_COLOR2_MIN_G, VOLUME_COLOR2_MIN_B, - this.curFileDataType.thresholdIsosurf); - mat.uniforms.t_function2max.value = - new THREE.Vector4(VOLUME_COLOR2_MAX_R, VOLUME_COLOR2_MAX_G, VOLUME_COLOR2_MAX_B, - this.curFileDataType.thresholdIsosurf); - mat.uniforms.stepSize.value = - new THREE.Vector4(STEP_SIZE1, STEP_SIZE2, STEP_SIZE3, STEP_SIZE4); - mat.uniforms.texSize.value = xDim;//this.engine2d.m_volumeHeader.m_pixelWidth; + mat.uniforms.t_function1min.value = new THREE.Vector4( + VOLUME_COLOR1_MIN_R, + VOLUME_COLOR1_MIN_G, + VOLUME_COLOR1_MIN_B, + this.curFileDataType.thresholdTissue1 + ); + mat.uniforms.t_function1max.value = new THREE.Vector4( + VOLUME_COLOR1_MAX_R, + VOLUME_COLOR1_MAX_G, + VOLUME_COLOR1_MAX_B, + this.curFileDataType.thresholdTissue2 + ); + mat.uniforms.t_function2min.value = new THREE.Vector4( + VOLUME_COLOR2_MIN_R, + VOLUME_COLOR2_MIN_G, + VOLUME_COLOR2_MIN_B, + this.curFileDataType.thresholdIsosurf + ); + mat.uniforms.t_function2max.value = new THREE.Vector4( + VOLUME_COLOR2_MAX_R, + VOLUME_COLOR2_MAX_G, + VOLUME_COLOR2_MAX_B, + this.curFileDataType.thresholdIsosurf + ); + mat.uniforms.stepSize.value = new THREE.Vector4(STEP_SIZE1, STEP_SIZE2, STEP_SIZE3, STEP_SIZE4); + mat.uniforms.texSize.value = xDim; //this.engine2d.m_volumeHeader.m_pixelWidth; mat.uniforms.isoThreshold.value = this.curFileDataType.thresholdIsosurf; mat.uniforms.brightness3D.value = this.curFileDataType.brightness; mat.uniforms.opacityBarrier.value = OPACITY_SCALE * this.curFileDataType.opacityTissue; @@ -1041,18 +1059,21 @@ export default class VolumeRenderer3d { mat.uniforms.xDim.value = xDim; mat.uniforms.yDim.value = yDim; - mat.uniforms.lightDir.value = new THREE.Vector3(this.curFileDataType.lightDirComp, - this.curFileDataType.lightDirComp, this.curFileDataType.lightDirComp); + mat.uniforms.lightDir.value = new THREE.Vector3( + this.curFileDataType.lightDirComp, + this.curFileDataType.lightDirComp, + this.curFileDataType.lightDirComp + ); mat.uniforms.needsUpdate = true; this.matRenderToTexture = mat; this.sceneReadyCounter++; - }); + } + ); // Create material for interpolation matIntetpl = new MaterialInterpolation(); const VAL_3 = 3.0; - matIntetpl.m_uniforms.isoSurfTexel.value = new THREE.Vector2(VAL_3 / this.windowWidth, - VAL_3 / this.windowHeight); + matIntetpl.m_uniforms.isoSurfTexel.value = new THREE.Vector2(VAL_3 / this.windowWidth, VAL_3 / this.windowHeight); matIntetpl.create(this.renderToTexture.texture, (mat) => { mat.uniforms.needsUpdate = true; //this.matInterpolation = mat; @@ -1061,27 +1082,44 @@ export default class VolumeRenderer3d { // Create material for main pass of volume render this.matSkullThreeGS = new MaterialVolumeRender(); - this.matSkullThreeGS.m_uniforms.isoSurfTexel.value = new THREE.Vector2(VAL_3 / this.windowWidth, - VAL_3 / this.windowHeight); + this.matSkullThreeGS.m_uniforms.isoSurfTexel.value = new THREE.Vector2(VAL_3 / this.windowWidth, VAL_3 / this.windowHeight); this.matSkullThreeGS.m_uniforms.colorMap1D.value = this.colorMapTexture; - this.matSkullThreeGS.create(this.texTF, this.volTexture, - null, this.texVolumeAO, this.bfTexture.texture, this.ffTexture.texture, + this.matSkullThreeGS.create( + this.texTF, + this.volTexture, + null, + this.texVolumeAO, + this.bfTexture.texture, + this.ffTexture.texture, //this.volTextureMask, this.texVolumeAO, this.bfTexture.texture, this.ffTexture.texture, - this.renderToTexture.texture, offsets, (mat) => { - mat.uniforms.t_function1min.value = - new THREE.Vector4(VOLUME_COLOR1_MIN_R, VOLUME_COLOR1_MIN_G, VOLUME_COLOR1_MIN_B, - this.curFileDataType.thresholdTissue1); - mat.uniforms.t_function1max.value = - new THREE.Vector4(VOLUME_COLOR1_MAX_R, VOLUME_COLOR1_MAX_G, VOLUME_COLOR1_MAX_B, - this.curFileDataType.thresholdTissue2); - mat.uniforms.t_function2min.value = - new THREE.Vector4(VOLUME_COLOR2_MIN_R, VOLUME_COLOR2_MIN_G, VOLUME_COLOR2_MIN_B, - this.curFileDataType.thresholdIsosurf); - mat.uniforms.t_function2max.value = - new THREE.Vector4(VOLUME_COLOR2_MAX_R, VOLUME_COLOR2_MAX_G, VOLUME_COLOR2_MAX_B, - this.curFileDataType.thresholdIsosurf); - mat.uniforms.stepSize.value = - new THREE.Vector4(STEP_SIZE1, STEP_SIZE2, STEP_SIZE3, STEP_SIZE4); + this.renderToTexture.texture, + offsets, + (mat) => { + mat.uniforms.t_function1min.value = new THREE.Vector4( + VOLUME_COLOR1_MIN_R, + VOLUME_COLOR1_MIN_G, + VOLUME_COLOR1_MIN_B, + this.curFileDataType.thresholdTissue1 + ); + mat.uniforms.t_function1max.value = new THREE.Vector4( + VOLUME_COLOR1_MAX_R, + VOLUME_COLOR1_MAX_G, + VOLUME_COLOR1_MAX_B, + this.curFileDataType.thresholdTissue2 + ); + mat.uniforms.t_function2min.value = new THREE.Vector4( + VOLUME_COLOR2_MIN_R, + VOLUME_COLOR2_MIN_G, + VOLUME_COLOR2_MIN_B, + this.curFileDataType.thresholdIsosurf + ); + mat.uniforms.t_function2max.value = new THREE.Vector4( + VOLUME_COLOR2_MAX_R, + VOLUME_COLOR2_MAX_G, + VOLUME_COLOR2_MAX_B, + this.curFileDataType.thresholdIsosurf + ); + mat.uniforms.stepSize.value = new THREE.Vector4(STEP_SIZE1, STEP_SIZE2, STEP_SIZE3, STEP_SIZE4); mat.uniforms.texSize.value = xDim; mat.uniforms.isoThreshold.value = this.curFileDataType.thresholdIsosurf; mat.uniforms.brightness3D.value = this.curFileDataType.brightness; @@ -1091,20 +1129,24 @@ export default class VolumeRenderer3d { mat.uniforms.yDim.value = yDim; mat.uniforms.opacityBarrier.value = OPACITY_SCALE * this.curFileDataType.opacityTissue; - mat.uniforms.lightDir.value = new THREE.Vector3(this.curFileDataType.lightDirComp, - this.curFileDataType.lightDirComp, this.curFileDataType.lightDirComp); + mat.uniforms.lightDir.value = new THREE.Vector3( + this.curFileDataType.lightDirComp, + this.curFileDataType.lightDirComp, + this.curFileDataType.lightDirComp + ); mat.uniforms.needsUpdate = true; this.scene.add(this.mesh); this.matVolumeRender = mat; if (isFULL3D) { - this.switchToFullVolumeRender() + this.switchToFullVolumeRender(); } else { - this.switchToVolumeRender(); + this.switchToVolumeRender(); } this.mesh.material = this.matVolumeRender; this.meshSphere.material = this.matVolumeRender; this.sceneReadyCounter++; - }); + } + ); //this.tools23d.set2dToolType(toolType); //matSkullThreeGS.m_uniforms.texVolumeMask.value = this.volTextureMask; } // callbackCreateCubeVolume @@ -1132,7 +1174,8 @@ export default class VolumeRenderer3d { */ updateSelectedRoiMap(selectedROIs) { this.volumeUpdater.updateSelectedRoiMap(selectedROIs); - } /** + } + /** * Rotate Cut Plane (Rotation is inverse to the object) */ @@ -1203,8 +1246,7 @@ export default class VolumeRenderer3d { if (this.sceneReadyCounter !== SCENE_READY_COUNTER_OK) { return false; } - const matReady = (this.matVolumeRender !== null) && (this.matBF !== null) && - (this.matFF !== null) && (this.matRenderToTexture !== null); + const matReady = this.matVolumeRender !== null && this.matBF !== null && this.matFF !== null && this.matRenderToTexture !== null; if (!matReady) { return false; } @@ -1221,8 +1263,7 @@ export default class VolumeRenderer3d { if (!this.isReadyToRender()) { return; } - const matReady = (this.matVolumeRender !== null) && (this.matBF !== null) && - (this.matFF !== null) && (this.matRenderToTexture !== null); + const matReady = this.matVolumeRender !== null && this.matBF !== null && this.matFF !== null && this.matRenderToTexture !== null; if (!matReady) { // do nothing } else { @@ -1236,7 +1277,7 @@ export default class VolumeRenderer3d { this.updateLightDir(); this.updateClipPlaneGeometry(); this.updateCutPlanes(); - + this.renderer.setRenderTarget(this.bfTexture); this.renderer.clear(); this.renderer.state.buffers.depth.setClear(0); @@ -1265,15 +1306,14 @@ export default class VolumeRenderer3d { this.scene.overrideMaterial = this.matRenderToTexture; this.renderer.render(this.scene, this.camera, this.renderToTexture); if (this.isEraseMode && !this.lockEraserBuffersUpdating) { - glC.readPixels(0, 0, this.xSmallTexSize, this.ySmallTexSize, glC.RGBA, glC.FLOAT, - this.bufferRenderToTextureCPU); + glC.readPixels(0, 0, this.xSmallTexSize, this.ySmallTexSize, glC.RGBA, glC.FLOAT, this.bufferRenderToTextureCPU); } // get a reference to the internal WebGL rendering context this.scene.overrideMaterial = null; this.renderer.render(this.scene, this.camera); // Render wireframe mesh this.renderer.autoClearDepth = false; - + //this.matWireFrame //this.renderer.clear(); if (this.Tool23D) { @@ -1306,22 +1346,22 @@ export default class VolumeRenderer3d { } /** - * Get object's vertex (3d) projection on screen, using current object transformation - * - * param vPos(THREE.Vector3) - sphere vertex of object - * param vProjScreen(THREE.Vector2) - screen projection of vertex above - * return z coordinate of projection on screen. If > 0, then visible - */ + * Get object's vertex (3d) projection on screen, using current object transformation + * + * param vPos(THREE.Vector3) - sphere vertex of object + * param vProjScreen(THREE.Vector2) - screen projection of vertex above + * return z coordinate of projection on screen. If > 0, then visible + */ getVertexProjectionToScreen(vPos, vProjScreen) { const vProj = vPos.clone(); vProj.applyMatrix4(this.meshSphere.matrixWorld); vProj.project(this.camera); const W_HALF = this.windowWidth * 0.5; const H_HALF = this.windowHeight * 0.5; - const xProj = W_HALF + (W_HALF * vProj.x); + const xProj = W_HALF + W_HALF * vProj.x; // it should be H_HALF - (... // but we have y axis up in mouse coord system - const yProj = H_HALF + (H_HALF * vProj.y); + const yProj = H_HALF + H_HALF * vProj.y; vProjScreen.x = xProj; vProjScreen.y = yProj; @@ -1394,13 +1434,12 @@ export default class VolumeRenderer3d { this.renderState = this.RENDER_STATE.ENABLED; if (!(this.isEraseMode && this.eraserMouseDown && this.eraserStart)) { this.orbitControl.onMouseMove(xx, yy); - } - else { + } else { this.volumeUpdater.eraser.eraseStart(xx, yy, this.windowWidth, this.matVolumeRender.uniforms.isoThreshold.value, false); } } - onMouseUp( xx, yy ) { + onMouseUp(xx, yy) { if (this.Tool23D) { this.graphics23d.onMouseUp(xx / this.windowWidth, yy / this.windowHeight); return; @@ -1415,15 +1454,12 @@ export default class VolumeRenderer3d { this.renderState = this.RENDER_STATE.ONCE; } - onMouseWheel(e) { - //const e = window.event || event; // old IE support - const delta = Math.max(-1, Math.min(1, (e.deltaY || -e.detail))); - // console.log(`mouse wheel event . delta = ${delta}`); - this.orbitControl.onZoom(-delta); + onMouseWheel({ deltaY }) { + const delta = deltaY < 0 ? 1 : -1; + this.orbitControl.onZoom(delta * 2 ** -5); if (this.checkFrameBufferMode !== CHECK_MODE_RESULT_OK) { return; } this.renderState = this.RENDER_STATE.ONCE; - // e.preventDefault(); } } // class Graphics3d diff --git a/src/demo/engine/VolumeSet.js b/src/engine/VolumeSet.js similarity index 85% rename from src/demo/engine/VolumeSet.js rename to src/engine/VolumeSet.js index 57590376..30b0e1a2 100644 --- a/src/demo/engine/VolumeSet.js +++ b/src/engine/VolumeSet.js @@ -1,10 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview VolumeSet * @author Epam * @version 1.0.0 */ - // ******************************************************** // Imports // ******************************************************** @@ -22,9 +26,9 @@ import LoaderHdr from './loaders/LoaderHdr'; // Const // ******************************************************** -/** - * Class representing a volume set - * Typically set contains only 1 volume, but for some Dicom folders it can be more then 1 +/** + * Class representing a volume set + * Typically set contains only 1 volume, but for some Dicom folders it can be more then 1 * See Volume class as an element of volume set */ class VolumeSet extends React.Component { @@ -61,11 +65,11 @@ class VolumeSet extends React.Component { /** * Add volume to set - * + * * @param {Volume} vol - added volume */ addVolume(vol) { - console.assert(vol instanceof Volume, "VolumeSet.addVolume: arg must be Volume"); + console.assert(vol instanceof Volume, 'VolumeSet.addVolume: arg must be Volume'); // this.m_volumes[this.m_numVolumes] = vol; this.m_volumes.push(vol); this.m_numVolumes++; @@ -73,7 +77,7 @@ class VolumeSet extends React.Component { /** * Get number of volumes in st - * + * * @return {number} Amount of volumes on set */ getNumVolumes() { @@ -86,10 +90,10 @@ class VolumeSet extends React.Component { * @return {Volume} volume is set or null */ getVolume(idx) { - console.assert(Number.isInteger(idx), "VolumeSet.getVolume: arg must be number"); - console.assert(idx < this.m_numVolumes, "index of volume should be in range"); - console.assert(idx >= 0, "index of volume should be non negative"); - if ((idx < 0) || (idx >= this.m_numVolumes)) { + console.assert(Number.isInteger(idx), 'VolumeSet.getVolume: arg must be number'); + console.assert(idx < this.m_numVolumes, 'index of volume should be in range'); + console.assert(idx >= 0, 'index of volume should be non negative'); + if (idx < 0 || idx >= this.m_numVolumes) { return null; } return this.m_volumes[idx]; @@ -105,20 +109,20 @@ class VolumeSet extends React.Component { // ******************************************** /** * Read KTX from local file buffer - * - * @param {char array} arrBuf - * @param {func} callbackProgress - * @param {func} callbackComplete + * + * @param {char array} arrBuf + * @param {func} callbackProgress + * @param {func} callbackComplete */ readFromKtx(arrBuf, callbackProgress, callbackComplete) { console.assert(arrBuf != null); - console.assert(arrBuf.constructor.name === "ArrayBuffer", "Should be ArrayBuf in arrBuf"); + console.assert(arrBuf.constructor.name === 'ArrayBuffer', 'Should be ArrayBuf in arrBuf'); const loader = new LoaderKtx(); const vol = this.getVolume(0); const ret = loader.readFromBuffer(vol, arrBuf, callbackProgress, callbackComplete); return ret; } - + readFromKtxUrl(strUrl, callbackProgress, callbackComplete) { const loader = new LoaderKtx(); const vol = this.getVolume(0); @@ -165,7 +169,6 @@ class VolumeSet extends React.Component { const ret = loader.readFromBuffer(indexFile, fileName, ratioLoaded, arrBuf, callbackProgress, callbackComplete); return ret; } - } // end VolumeSet export default VolumeSet; diff --git a/src/demo/engine/VolumeSet.test.js b/src/engine/VolumeSet.test.js similarity index 87% rename from src/demo/engine/VolumeSet.test.js rename to src/engine/VolumeSet.test.js index 14235b02..411847b6 100644 --- a/src/demo/engine/VolumeSet.test.js +++ b/src/engine/VolumeSet.test.js @@ -1,3 +1,7 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ // ******************************************************** // Imports @@ -17,7 +21,7 @@ describe('VolumeSetTests', () => { const _writeInt = (arrBuf, offs, valInt) => { let offsNew = offs; let val = valInt; - for(let i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { const bt = val & 0xff; val >>= 8; arrBuf[offsNew++] = bt; @@ -37,17 +41,17 @@ describe('VolumeSetTests', () => { const SHIFT_16 = 16; const SHIFT_24 = 24; - const VAL_DWORD = ((VAL_0) | (VAL_1 << SHIFT_8) | (VAL_2 << SHIFT_16) | (VAL_3 << SHIFT_24)); + const VAL_DWORD = VAL_0 | (VAL_1 << SHIFT_8) | (VAL_2 << SHIFT_16) | (VAL_3 << SHIFT_24); // console.log(`test. dword = ${VAL_DWORD.toString(16)}`); _writeInt(bufBytes, 0, VAL_DWORD); // console.log(`test. array0 = ${bufBytes[0].toString(16)}`); // console.log(`test. array1 = ${bufBytes[1].toString(16)}`); // console.log(`test. array2 = ${bufBytes[2].toString(16)}`); // console.log(`test. array3 = ${bufBytes[3].toString(16)}`); - const isOk0 = (bufBytes[0] === VAL_0); - const isOk1 = (bufBytes[1] === VAL_1); - const isOk2 = (bufBytes[2] === VAL_2); - const isOk3 = (bufBytes[3] === VAL_3); + const isOk0 = bufBytes[0] === VAL_0; + const isOk1 = bufBytes[1] === VAL_1; + const isOk2 = bufBytes[2] === VAL_2; + const isOk3 = bufBytes[3] === VAL_3; expect(isOk0).toBeTruthy(); expect(isOk1).toBeTruthy(); expect(isOk2).toBeTruthy(); @@ -62,7 +66,7 @@ describe('VolumeSetTests', () => { const callbackProgress = undefined; const callbackComplete = undefined; const volSet = new VolumeSet(); - volSet.addVolume(new Volume() ); + volSet.addVolume(new Volume()); const readOk = volSet.readFromKtx(bufTest, callbackProgress, callbackComplete); expect(readOk === true).toBeFalsy(); }); @@ -72,7 +76,7 @@ describe('VolumeSetTests', () => { let i; let iDst = 0; // write header - const arrayHeaderSign = [0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A]; + const arrayHeaderSign = [0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a]; const lenHeaderSign = arrayHeaderSign.length; for (i = 0; i < lenHeaderSign; i++) { @@ -84,7 +88,7 @@ describe('VolumeSetTests', () => { const callbackProgress = undefined; const callbackComplete = undefined; const volSet = new VolumeSet(); - volSet.addVolume(new Volume() ); + volSet.addVolume(new Volume()); const readOk = volSet.readFromKtx(bufTest, callbackProgress, callbackComplete); expect(readOk === true).toBeFalsy(); }); @@ -94,7 +98,7 @@ describe('VolumeSetTests', () => { let i; let iDst = 0; // write header - const arrayHeaderSign = [0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A]; + const arrayHeaderSign = [0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a]; const lenHeaderSign = arrayHeaderSign.length; for (i = 0; i < lenHeaderSign; i++) { @@ -114,7 +118,7 @@ describe('VolumeSetTests', () => { const callbackProgress = undefined; const callbackComplete = undefined; const volSet = new VolumeSet(); - volSet.addVolume(new Volume() ); + volSet.addVolume(new Volume()); const readOk = volSet.readFromKtx(bufTest, callbackProgress, callbackComplete); expect(readOk === true).toBeFalsy(); }); @@ -125,7 +129,7 @@ describe('VolumeSetTests', () => { let i; let iDst = 0; // write header - const arrayHeaderSign = [0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A]; + const arrayHeaderSign = [0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a]; const lenHeaderSign = arrayHeaderSign.length; for (i = 0; i < lenHeaderSign; i++) { @@ -153,7 +157,7 @@ describe('VolumeSetTests', () => { const callbackProgress = undefined; const callbackComplete = undefined; const volSet = new VolumeSet(); - volSet.addVolume(new Volume() ); + volSet.addVolume(new Volume()); const readOk = volSet.readFromKtx(bufTest, callbackProgress, callbackComplete); // console.log(`Test. Vol dim = ${vol.m_xDim} * ${vol.m_yDim} * ${vol.m_zDim} `); expect(readOk === true).toBeFalsy(); @@ -165,7 +169,7 @@ describe('VolumeSetTests', () => { let i; let iDst = 0; // write header - const arrayHeaderSign = [0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A]; + const arrayHeaderSign = [0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a]; const lenHeaderSign = arrayHeaderSign.length; for (i = 0; i < lenHeaderSign; i++) { @@ -206,19 +210,18 @@ describe('VolumeSetTests', () => { // write data for (i = 0; i < DTSIZE; i++) { - bufTest[iDst++] = (i & 0xff); + bufTest[iDst++] = i & 0xff; } const callbackProgress = undefined; const callbackComplete = undefined; const volSet = new VolumeSet(); - volSet.addVolume(new Volume() ); + volSet.addVolume(new Volume()); const readOk = volSet.readFromKtx(bufTest, callbackProgress, callbackComplete); // console.log(`Test. Vol dim = ${vol.m_xDim} * ${vol.m_yDim} * ${vol.m_zDim} `); expect(readOk === LoadResult.SUCCESS).toBeTruthy(); }); - // it('testCreateSingleVolume', () => { const volumeSet = new VolumeSet(); @@ -235,6 +238,5 @@ describe('VolumeSetTests', () => { expect(volFrom == volume).toBeTruthy(); }); // - it('testCreateTwoVolumes', () => { - }); + it('testCreateTwoVolumes', () => {}); }); diff --git a/src/engine/actvolume/actvol.js b/src/engine/actvolume/actvol.js new file mode 100644 index 00000000..d3f5179f --- /dev/null +++ b/src/engine/actvolume/actvol.js @@ -0,0 +1,1332 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import * as THREE from 'three'; +import TetrahedronGenerator from './tetra'; +import GeoRender from './georender'; +import LaplasianSmoother from './lapsmooth'; +import VolumeGenerator from './volgen'; +import VolumeTools from '../loaders/voltools'; + +// Minimum volume size (for volume scale down: increase performance) +const X_MAX_DIM = 256; +const Y_MAX_DIM = 256; +const Z_MAX_DIM = 256; + +const AV_NUM_COLORS = 256; + +const AV_STATE_NA = -1; +const AV_STATE_NOT_STARTED = 0; +const AV_STATE_PREPARE_GAUSS = 1; +const AV_STATE_PREPARE_UNIFORMITY = 2; +const AV_STATE_UPDATE_GEO = 3; +const AV_STATE_FINISHED = 4; + +const AV_METHOD_NORMALS = 1; +const AV_METHOD_UNIFORMITY = 2; +const AV_METHOD_COLOR_KOEFS = 4; +const AV_METHOD_ALL = 0xffff; + +/** + * Class ActiveVolume perform skull detection and removal + * @class ActiveVolume + */ +export default class ActiveVolume { + constructor() { + this.m_state = AV_STATE_NA; + this.m_pixelsSrc = null; + this.m_xDim = 0; + this.m_yDim = 0; + this.m_zDim = 0; + this.m_imageGauss = null; + this.m_imageUniformity = null; + this.m_verticesNew = null; + this.m_lapSmoother = null; + this.m_imageSrc = null; + this.m_imageGrad = null; + this.m_gaussStage = -1; + this.m_uniformityStage = -1; + this.m_geoStage = -1; + this.m_histogram = new Int32Array(AV_NUM_COLORS); + this.m_colorProbability = new Float32Array(AV_NUM_COLORS); + this.m_colorKoefs = new Float32Array(AV_NUM_COLORS); + for (let i = 0; i < AV_NUM_COLORS; i++) { + this.m_histogram[i] = 0; + this.m_colorProbability[i] = 0.0; + this.m_colorKoefs[i] = 0.0; + } + this.m_sphereCenter = null; + this.m_sphereRadius = null; + this.m_indexMinColor = -1; + // debug counter to save geo + this.m_updateCounter = 0; + // for display 3d geo + this.m_geoRender = null; + this.m_xScale = 1; + this.m_yScale = 1; + this.m_zScale = 1; + } + + save() { + const numPixels = this.m_xDim * this.m_yDim * this.m_zDim; + let volTexDst = new Uint8Array(numPixels); + // create clipped volume + + let i; + for (i = 0; i < numPixels; i++) { + volTexDst[i] = 0; + } + const WITH_FILL = true; + const resBoolFill = VolumeGenerator.generateFromFaces(this.m_xDim, this.m_yDim, this.m_zDim, volTexDst, this.m_geoRender, WITH_FILL); + + if (resBoolFill) { + console.log('perform clip of source volume by generated mask ...'); + const DECREASE_NON_VIS = 6; + for (i = 0; i < numPixels; i++) { + if (volTexDst[i] === 0) { + this.m_pixelsSrc[i] = Math.floor(this.m_pixelsSrc[i] / DECREASE_NON_VIS); + } + } + } else { + console.log(`generateFromFaces returned ${resBoolFill} !`); + } + volTexDst = null; + } + + /** + * + * @param {*} xDim + * @param {*} yDim + * @param {*} zDim + * @param {*} volTexSrc + * @param {*} volTexDst + * @param {*} createType + * @param {*} needLog + */ + skullRemoveStart(xDim, yDim, zDim, volTexSrc, volTexDst, createType, needLog) { + const TOO_MUCH_SIZE = 8192; + if (createType !== ActiveVolume.REMOVE_SKULL && createType !== ActiveVolume.CREATE_MASK) { + console.log('skullRemoveStart: wrong argument createType'); + } + if (xDim >= TOO_MUCH_SIZE || yDim >= TOO_MUCH_SIZE || zDim >= TOO_MUCH_SIZE) { + console.log(`Too bad volume dimension: ${xDim} * ${yDim} * ${zDim}`); + return -1; + } + if (xDim <= 1 || yDim <= 1 || zDim <= 1) { + console.log(`Too bad volume dimension: ${xDim} * ${yDim} * ${zDim}`); + return -1; + } + const volSizeSrc = volTexSrc.length; + const numPixSrc = xDim * yDim * zDim; + if (volSizeSrc !== numPixSrc) { + console.log(`skullRemoveStart: bad vol size = ${volSizeSrc}, expected ${numPixSrc}`); + return -1; + } + const okCreate = this.create(xDim, yDim, zDim, volTexSrc); + if (okCreate !== 1) { + return okCreate; + } + const genTetra = new TetrahedronGenerator(); + const vRadius = new THREE.Vector3(0.5, 0.5, 0.5); + const NUM_SUBDIVIDES = 3; + const okCreateTetra = genTetra.create(vRadius, NUM_SUBDIVIDES); + if (okCreateTetra < 1) { + return okCreateTetra; + } + const geoRender = new GeoRender(); + const errGeo = geoRender.createFromTetrahedronGenerator(genTetra); + const GEO_OK = 1; + if (errGeo !== GEO_OK) { + const ERR_CREATE_GEO = -3; + return ERR_CREATE_GEO; + } + + // get half from volume dimension + const xDim2 = Math.floor((this.m_xDim - 1) * 0.5); + const yDim2 = Math.floor((this.m_yDim - 1) * 0.5); + const zDim2 = Math.floor((this.m_zDim - 1) * 0.5); + + // scale geo render vertices + const numVertices = geoRender.getNumVertices(); + const vertices = geoRender.getVertices(); + const COORDS_IN_VERTEX = 4; + const NUM_0 = 0; + const NUM_1 = 1; + const NUM_2 = 2; + for (let i = 0, i4 = 0; i < numVertices; i++, i4 += COORDS_IN_VERTEX) { + vertices[i4 + NUM_0] = xDim2 + xDim2 * vertices[i4 + NUM_0]; + vertices[i4 + NUM_1] = yDim2 + yDim2 * vertices[i4 + NUM_1]; + vertices[i4 + NUM_2] = zDim2 + zDim2 * vertices[i4 + NUM_2]; + } // for (i) all vertices + + // save render geo to obj file + const NEED_SAVE_INITIAL_GEO = false; + if (NEED_SAVE_INITIAL_GEO) { + const TEST_SAVE_INIT_GEO_FILE_NAME = 'geo_init.obj'; + geoRender.saveGeoToObjFile(TEST_SAVE_INIT_GEO_FILE_NAME); + } + + // Test save bounding sphere + const NEED_SAVE_BOUND_SPHERE = false; + if (NEED_SAVE_BOUND_SPHERE) { + const vMin = new THREE.Vector3(); + const vMax = new THREE.Vector3(); + ActiveVolume.getBoundingBox(this.m_xDim, this.m_yDim, this.m_zDim, this.m_pixelsSrc, vMin, vMax); + const geoSphere = new GeoRender(); + const vCenter = new THREE.Vector3(); + const vRad = new THREE.Vector3(); + vCenter.x = (vMin.x + vMax.x) * 0.5; + vCenter.y = (vMin.y + vMax.y) * 0.5; + vCenter.z = (vMin.z + vMax.z) * 0.5; + vRad.x = (vMax.x - vMin.x) * 0.5; + vRad.y = (vMax.y - vMin.y) * 0.5; + vRad.z = (vMax.z - vMin.z) * 0.5; + + const NUM_SEGM_HOR = 16; + const NUM_SEGM_VER = 8; + geoSphere.createFromEllipse(vCenter, vRad, NUM_SEGM_HOR, NUM_SEGM_VER); + const TEST_SAVE_BSPHERE_GEO_FILE_NAME = 'geo_bsph.obj'; + geoSphere.saveGeoToObjFile(TEST_SAVE_BSPHERE_GEO_FILE_NAME); + } + let numPredSteps = this.getPredictedStepsForActiveVolumeUpdate(); + const SOME_ADD_STEPS = 12; + numPredSteps += SOME_ADD_STEPS; + + const strTypeArr = ['REMOVE_SKULL', 'CREATE_MASK']; + const strType = strTypeArr[createType]; + console.log(`skullRemoveStart. Will be ${numPredSteps} updates approximately. In ${strType} mode `); + + this.m_updateCounter = 0; + this.m_isFinished = false; + this.m_numPredSteps = numPredSteps; + this.m_createType = createType; + this.m_volTexSrc = volTexSrc; + this.m_volTexDst = volTexDst; + this.m_needLog = needLog; + + return geoRender; + } + + skullRemoveUpdate(geoRender) { + const isLoopComplete = this.m_updateCounter >= this.m_numPredSteps || this.m_isFinished; + if (isLoopComplete) { + return true; + } + this.updateGeo(geoRender, AV_METHOD_ALL); + this.m_isFinished = this.m_state === AV_STATE_FINISHED; + this.m_updateCounter++; + return false; + } + + skullRemoveStop(geoRender) { + // save geo render after all modification iterations + const NEED_SAVE_FINAL_GEO_RENDER = false; + if (NEED_SAVE_FINAL_GEO_RENDER) { + this.finalizeUpdatesGeo(geoRender, NEED_SAVE_FINAL_GEO_RENDER); + } + const NUM_2 = 2; + + // Save smoothed image into file + const NEED_SAVE_NONCLIPPED_SLICE_BMP = false; + if (NEED_SAVE_NONCLIPPED_SLICE_BMP) { + const TEST_SAVE_VOL_FILE_NAME = 'test_nonclipped_slice.bmp'; + const zSlice = Math.floor(this.m_zDim / NUM_2); + ActiveVolume.saveVolumeSliceToFile(this.m_pixelsSrc, this.m_xDim, this.m_yDim, this.m_zDim, zSlice, TEST_SAVE_VOL_FILE_NAME); + } + + if (this.m_createType === ActiveVolume.REMOVE_SKULL) { + const numPixels = this.m_xDim * this.m_yDim * this.m_zDim; + const volMask = new Uint8Array(numPixels); + + // create volume mask. 255: visible part, 0 - invisible + const WITH_FILL = 1; + const resFill = VolumeGenerator.generateFromFaces(this.m_xDim, this.m_yDim, this.m_zDim, volMask, geoRender, WITH_FILL); + if (resFill < 0) { + console.log(`generateFromFaces returned ${resFill} !`); + } + // apply volMask to volSrc + for (let i = 0; i < numPixels; i++) { + this.m_volTexDst[i] = volMask[i] !== 0 ? this.m_volTexSrc[i] : 0; + } + } else if (this.m_createType === ActiveVolume.CREATE_MASK) { + // create volume mask. 255: visible part, 0 - invisible + const WITH_FILL = 1; + const resFill = VolumeGenerator.generateFromFaces(this.m_xDim, this.m_yDim, this.m_zDim, this.m_volTexDst, geoRender, WITH_FILL); + if (resFill < 0) { + console.log(`generateFromFaces returned ${resFill} !`); + } + } + + // save result for deep debug + const NEED_SAVE_CLIPPED_SLICE_BMP = false; + if (this.m_needLog && NEED_SAVE_CLIPPED_SLICE_BMP) { + const TEST_SLICE_SAVE_FILE_NAME = 'test_clipped_slice.bmp'; + const zSlice = Math.floor(this.m_zDim / NUM_2); + ActiveVolume.saveVolumeSliceToFile(this.m_volTexDst, this.m_xDim, this.m_yDim, this.m_zDim, zSlice, TEST_SLICE_SAVE_FILE_NAME); + } + + return +1; + } + + static getBoundingBox(xDim, yDim, zDim, volTexSrc, vMin, vMax) { + const MIN_VIS_COLOR = 50; + let x, y, z; + vMax.set(0.0, 0.0, 0.0); + vMin.set(xDim, yDim, zDim); + let ind = 0; + for (z = 0; z < zDim; z++) { + for (y = 0; y < yDim; y++) { + for (x = 0; x < xDim; x++) { + const val = volTexSrc[ind]; + ind++; + if (val < MIN_VIS_COLOR) { + continue; + } + // update bbox + vMin.x = x < vMin.x ? x : vMin.x; + vMin.y = y < vMin.y ? y : vMin.y; + vMin.z = z < vMin.z ? z : vMin.z; + vMax.x = x > vMax.x ? x : vMax.x; + vMax.y = y > vMax.y ? y : vMax.y; + vMax.z = z > vMax.z ? z : vMax.z; + } // for (x) + } // for (y) + } // for (z) + } + + /** + * Save volume slice to BMP file. Only for deep debug + * @param {array} pixelsSrc array of source voxels in volume + * @param {number} xDim Volume dimension on x + * @param {number} yDim Volume dimension on y + * @param {number} zDim Volume dimension on z + * @param {number} zSlice index of slice in volume + * @param {string } fileName save file name + */ + static saveVolumeSliceToFile(pixelsSrc, xDim, yDim, zDim, zSlice, fileName) { + const SIZE_HEADER = 14; + const SIZE_INFO = 40; + const COMPS_IN_COLOR = 3; + const numPixels = xDim * yDim; + let pixStride = COMPS_IN_COLOR * xDim; + pixStride = (pixStride + COMPS_IN_COLOR) & ~COMPS_IN_COLOR; + const totalBufSize = SIZE_HEADER + SIZE_INFO + numPixels * COMPS_IN_COLOR; + const buf = new Uint8Array(totalBufSize); + for (let j = 0; j < totalBufSize; j++) { + buf[j] = 0; + } + const BYTE_MASK = 255; + const BITS_IN_BYTE = 8; + // write header + const BYTES_IN_DWORD = 4; + + let i = 0; + // bfType[16] + buf[i++] = 0x42; + buf[i++] = 0x4d; + // bfSize[32] + let bfSize = SIZE_HEADER + SIZE_INFO + pixStride * yDim; + buf[i++] = bfSize & BYTE_MASK; + bfSize >>= BITS_IN_BYTE; + buf[i++] = bfSize & BYTE_MASK; + bfSize >>= BITS_IN_BYTE; + buf[i++] = bfSize & BYTE_MASK; + bfSize >>= BITS_IN_BYTE; + buf[i++] = bfSize & BYTE_MASK; + // bfReserved1 + bfReserved2 + i += BYTES_IN_DWORD; + // bfOffBits[32] + let bfOffBits = SIZE_HEADER + SIZE_INFO; + buf[i++] = bfOffBits & BYTE_MASK; + bfOffBits >>= BITS_IN_BYTE; + buf[i++] = bfOffBits & BYTE_MASK; + bfOffBits >>= BITS_IN_BYTE; + buf[i++] = bfOffBits & BYTE_MASK; + bfOffBits >>= BITS_IN_BYTE; + buf[i++] = bfOffBits & BYTE_MASK; + + // write info + + // biSize[32] + let biSize = SIZE_INFO; + buf[i++] = biSize & BYTE_MASK; + biSize >>= BITS_IN_BYTE; + buf[i++] = biSize & BYTE_MASK; + biSize >>= BITS_IN_BYTE; + buf[i++] = biSize & BYTE_MASK; + biSize >>= BITS_IN_BYTE; + buf[i++] = biSize & BYTE_MASK; + // biWidth[32] + let biWidth = xDim; + buf[i++] = biWidth & BYTE_MASK; + biWidth >>= BITS_IN_BYTE; + buf[i++] = biWidth & BYTE_MASK; + biWidth >>= BITS_IN_BYTE; + buf[i++] = biWidth & BYTE_MASK; + biWidth >>= BITS_IN_BYTE; + buf[i++] = biWidth & BYTE_MASK; + // biHeight[32] + let biHeight = yDim; + buf[i++] = biHeight & BYTE_MASK; + biHeight >>= BITS_IN_BYTE; + buf[i++] = biHeight & BYTE_MASK; + biHeight >>= BITS_IN_BYTE; + buf[i++] = biHeight & BYTE_MASK; + biHeight >>= BITS_IN_BYTE; + buf[i++] = biHeight & BYTE_MASK; + // biPlanes[16] + buf[i++] = 1; + buf[i++] = 0; + // biBitCount[16] + buf[i++] = 24; + buf[i++] = 0; + // biCompression[32] + i += BYTES_IN_DWORD; + // biSizeImage[32] + let biSizeImage = pixStride * yDim; + buf[i++] = biSizeImage & BYTE_MASK; + biSizeImage >>= BITS_IN_BYTE; + buf[i++] = biSizeImage & BYTE_MASK; + biSizeImage >>= BITS_IN_BYTE; + buf[i++] = biSizeImage & BYTE_MASK; + biSizeImage >>= BITS_IN_BYTE; + buf[i++] = biSizeImage & BYTE_MASK; + // biXPelsPerMeter[32] + i += BYTES_IN_DWORD; + // biYPelsPerMeter[32] + i += BYTES_IN_DWORD; + // biClrUsed[32] + i += BYTES_IN_DWORD; + // biClrImportant[32] + i += BYTES_IN_DWORD; + + let j; + // get max volume + const offSlice = zSlice * xDim * yDim; + let valMax = 0; + for (j = 0; j < numPixels; j++) { + const valGrey = pixelsSrc[offSlice + j]; + valMax = valGrey > valMax ? valGrey : valMax; + } // for (j) + console.log(`saveVolumeSlice. valMax = ${valMax}`); + + // write pixels + const MAX_COLOR = 255; + for (j = 0; j < numPixels; j++) { + const valGrey = Math.floor((pixelsSrc[offSlice + j] * MAX_COLOR) / valMax); + // write rgb components + buf[i++] = valGrey; + buf[i++] = valGrey; + buf[i++] = valGrey; + } // for (j) + + // write buffer to file + const blob = new Blob([buf], { type: 'application/octet-stream' }); + const url = URL.createObjectURL(blob); + const linkGen = document.createElement('a'); + linkGen.setAttribute('href', url); + linkGen.setAttribute('download', fileName); + const eventGen = document.createEvent('MouseEvents'); + eventGen.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null); + linkGen.dispatchEvent(eventGen); + } + + getPredictedStepsForActiveVolumeUpdate() { + const TWO = 2; + const hx = this.m_xDim; + const hy = this.m_yDim; + const hz = this.m_zDim; + const xyMax = hx > hy ? hx : hy; + const xyzMax = xyMax > hz ? xyMax : hz; + const SCAN_RAD = 4; + const stepsByRad = xyzMax - SCAN_RAD; + const SOME_ADD_STEPS = 4; + const stepsAll = stepsByRad + TWO * ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES + SOME_ADD_STEPS; + return stepsAll; + } + + /** + * Create members for iterations later + * @return {number} 1, if success. <0 if failed + */ + create(xDim, yDim, zDim, volTexSrc) { + if (xDim > X_MAX_DIM || yDim > Y_MAX_DIM || zDim > Z_MAX_DIM) { + // scale down twice or 4 + this.m_xScale = Math.floor(xDim / X_MAX_DIM); + this.m_yScale = Math.floor(yDim / Y_MAX_DIM); + this.m_zScale = Math.floor(zDim / Z_MAX_DIM); + let maxScale = this.m_xScale > this.m_yScale ? this.m_xScale : this.m_yScale; + maxScale = this.m_zScale > maxScale ? this.m_zScale : maxScale; + const TWO = 2; + if (maxScale <= 1) { + this.m_xScale = this.m_yScale = this.m_zScale = TWO; + } + this.m_xScale = this.m_xScale >= 1 ? this.m_xScale : 1; + this.m_yScale = this.m_yScale >= 1 ? this.m_yScale : 1; + this.m_zScale = this.m_zScale >= 1 ? this.m_zScale : 1; + + const xScaled = Math.floor(xDim / this.m_xScale); + const yScaled = Math.floor(yDim / this.m_yScale); + const zScaled = Math.floor(zDim / this.m_zScale); + const numPixelsScaled = xScaled * yScaled * zScaled; + const pixelsScaled = new Uint8Array(numPixelsScaled); + VolumeTools.scaleDown(volTexSrc, xDim, yDim, zDim, pixelsScaled, this.m_xScale, this.m_yScale, this.m_zScale); + this.m_pixelsSrc = pixelsScaled; + this.m_wasAllocated = true; + this.m_xDim = xScaled; + this.m_yDim = yScaled; + this.m_zDim = zScaled; + console.log(`ActiveVolume. Scaled down to ${xScaled} * ${yScaled} * ${zScaled}`); + } else { + this.m_xDim = xDim; + this.m_yDim = yDim; + this.m_zDim = zDim; + this.m_pixelsSrc = volTexSrc; + this.m_wasAllocated = false; + } + + this.m_state = AV_STATE_NOT_STARTED; + const numPixels = this.m_xDim * this.m_yDim * this.m_zDim; + this.m_imageGauss = new Float32Array(numPixels); + this.m_imageUniformity = new Float32Array(numPixels); + this.m_verticesNew = null; + // add checks + if (this.m_pixelsSrc.length !== numPixels) { + // console.log(`ActiveVolume.create: Bad vol.expect data len=${numPixels},actual len=${volTexSrc.length}`); + return 0; + } + return 1; + } + + /** + * Make special unifoirmity image for whole volume + */ + makeUniformityImage(pixelsSrc, xDim, yDim, zDim, zStart, zEnd, pixelsGrad, pixelsDst, koefAlpha) { + // radius neighbours + const TWICE = 2; + const RAD_UNI = 1; + const DIA_UNI = 1 + TWICE * RAD_UNI; + + const SCALE_ALL_ELEMS = 1.0 / (DIA_UNI * DIA_UNI * DIA_UNI); + // let maxLen = 0.0; + let cx, cy, cz; + + const zs = zStart > RAD_UNI ? zStart : RAD_UNI; + const ze = zEnd < zDim - RAD_UNI ? zEnd : zDim - RAD_UNI; + + for (cz = zs; cz < ze; cz++) { + const czOff = cz * xDim * yDim; + for (cy = RAD_UNI; cy < yDim - RAD_UNI; cy++) { + const cyOff = cy * xDim; + for (cx = RAD_UNI; cx < xDim - RAD_UNI; cx++) { + let sumDx = 0.0; + let sumDy = 0.0; + let sumDz = 0.0; + let dx, dy, dz; + + for (dz = -RAD_UNI; dz <= +RAD_UNI; dz++) { + const z = cz + dz; + const zOff = z * xDim * yDim; + for (dy = -RAD_UNI; dy <= +RAD_UNI; dy++) { + const y = cy + dy; + const yOff = y * xDim; + for (dx = -RAD_UNI; dx <= +RAD_UNI; dx++) { + const x = cx + dx; + const offSrc = x + yOff + zOff; + // if ((offSrc < 0) || (offSrc >= numPixelsVol)) { + // console.log('!!! Out of array'); + // } + const val = pixelsSrc[offSrc]; + sumDx += val * dx; + sumDy += val * dy; + sumDz += val * dz; + } // for (dx) + } // for (dy) + } // for (dz) + + sumDx *= SCALE_ALL_ELEMS; + sumDy *= SCALE_ALL_ELEMS; + sumDz *= SCALE_ALL_ELEMS; + + // maxLen = (gradLen > maxLen) ? gradLen : maxLen; + + const gradLen = Math.sqrt(sumDx * sumDx + sumDy * sumDy + sumDz * sumDz); + pixelsGrad[cx + cyOff + czOff] = gradLen; + pixelsDst[cx + cyOff + czOff] = Math.exp(-koefAlpha * gradLen); + } // for (cx) + } // for (cy) + } // for (cz) + // console.log(`makeUniformityImage done for z = ${zs} to ${ze}`); + } + + /** + * Start image smoothimg by Gauss convolution + */ + startImageSmooth() { + const numPixels = this.m_xDim * this.m_yDim * this.m_zDim; + let i; + for (i = 0; i < numPixels; i++) { + this.m_imageGauss[i] = 0.0; + this.m_imageUniformity[i] = 0.0; + } + this.m_imageSrc = new Float32Array(numPixels); + this.m_imageGrad = new Float32Array(numPixels); + for (i = 0; i < numPixels; i++) { + this.m_imageGrad[i] = 0.0; + const val = this.m_pixelsSrc[i]; + this.m_imageSrc[i] = val; + } + return 1; + } + + /** + * Stop volume smothing by Gauss + */ + stopImageSmooth() { + this.m_imageGrad = null; + this.m_imageSrc = null; + } + + applyPartGaussSmooth(zStart, zEnd, rad, sigma) { + const TWICE = 2; + const dia = 1 + TWICE * rad; + // fill gauss matrix + const THREE_DIMS = 3.0; + const koef = 1.0 / (THREE_DIMS * sigma * sigma); + let dx, dy, dz; + let j = 0; + if (zStart === 0) { + const GAUSS_MAX_RAD = 9; + const GAUSS_MAX_DIA = 1 + TWICE * GAUSS_MAX_RAD; + this.m_gaussMatrix = new Float32Array(GAUSS_MAX_DIA * GAUSS_MAX_DIA * GAUSS_MAX_DIA); + let wSum = 0.0; + for (dz = -rad; dz <= +rad; dz++) { + const fz = dz / rad; + for (dy = -rad; dy <= +rad; dy++) { + const fy = dy / rad; + for (dx = -rad; dx <= +rad; dx++) { + const fx = dx / rad; + const dist2 = fx * fx + fy * fy + fz * fz; + const weight = Math.exp(-1.0 * dist2 * koef); + this.m_gaussMatrix[j++] = weight; + wSum += weight; + } + } + } // for (dz) + // normalize weights + const numGaussElems = dia * dia * dia; + const gScale = 1.0 / wSum; + for (j = 0; j < numGaussElems; j++) { + this.m_gaussMatrix[j] *= gScale; + } + const numPixels = this.m_xDim * this.m_yDim * this.m_zDim; + for (j = 0; j < numPixels; j++) { + this.m_imageGauss[j] = this.m_imageSrc[j]; + } + } + // apply gauss matrix to source image + const zs = zStart > rad ? zStart : rad; + const ze = zEnd < this.m_zDim - rad ? zEnd : this.m_zDim - rad; + let cx, cy, cz; + for (cz = zs; cz < ze; cz++) { + const czOff = cz * this.m_xDim * this.m_yDim; + for (cy = rad; cy < this.m_yDim - rad; cy++) { + const cyOff = cy * this.m_xDim; + for (cx = rad; cx < this.m_xDim - rad; cx++) { + let sum = 0.0; + j = 0; + for (dz = -rad; dz <= +rad; dz++) { + const z = cz + dz; + const zOff = z * this.m_xDim * this.m_yDim; + for (dy = -rad; dy <= +rad; dy++) { + const y = cy + dy; + const yOff = y * this.m_xDim; + for (dx = -rad; dx <= +rad; dx++) { + const x = cx + dx; + const weight = this.m_gaussMatrix[j++]; + const val = this.m_imageSrc[x + yOff + zOff]; + sum += val * weight; + } // for (dx) + } // for (dy) + } // for (dz) + this.m_imageGauss[cx + cyOff + czOff] = sum; + // this.m_imageGauss[cx + cyOff + czOff] = 0.0; + } // for (cx) + } // for (cy) + } // for (cz) + } + + /** + * Smooth step + */ + static smoothStep(minRange, maxRange, arg) { + let t = (arg - minRange) / (maxRange - minRange); + t = t > 0.0 ? t : 0.0; + t = t < 1.0 ? t : 1.0; + const NUM_2 = 2.0; + const NUM_3 = 3.0; + const res = t * t * (NUM_3 - NUM_2 * t); + return res; + } + + /** + * Smooth 1d float array + */ + static smoothArray(values, numValues, gaussRad, gaussSigma) { + const dst = new Float32Array(AV_NUM_COLORS); + const mult = 1.0 / (gaussSigma * gaussSigma); + for (let ci = 0; ci < numValues; ci++) { + let sum = 0.0; + let sumWeight = 0.0; + for (let di = -gaussRad; di <= +gaussRad; di++) { + let i = ci + di; + i = i >= 0 ? i : 0; + i = i < numValues ? i : numValues - 1; + const t = di / gaussRad; + const weight = 1.0 / Math.exp(t * t * mult); + sumWeight += weight; + sum += values[i] * weight; + } + const valSmoothed = sum / sumWeight; + dst[ci] = valSmoothed; + } + // copy back + for (let i = 0; i < numValues; i++) { + values[i] = dst[i]; + } + } + + /** + * Get histogram from gaussian smoothed image + * and detect "dark" color range + */ + getHistogram() { + const MAX_COLOR = 255; + + let i; + // clear histogram + for (i = 0; i < AV_NUM_COLORS; i++) { + this.m_histogram[i] = 0; + } + + const TWO = 2; + // scan central image part + const SCAN_RANGE = 4; + const zMin = Math.floor(this.m_zDim / TWO - SCAN_RANGE); + const zMax = Math.floor(this.m_zDim / TWO + SCAN_RANGE); + const yMin = Math.floor(this.m_yDim / TWO - SCAN_RANGE); + const yMax = Math.floor(this.m_yDim / TWO + SCAN_RANGE); + + let x, y, z; + let numPixels = 0; + for (z = zMin; z < zMax; z++) { + const zOff = z * this.m_xDim * this.m_yDim; + for (y = yMin; y < yMax; y++) { + const yOff = y * this.m_xDim; + for (x = 0; x < this.m_xDim; x++) { + const off = x + yOff + zOff; + let val = this.m_imageGauss[off]; + val = val < MAX_COLOR ? val : MAX_COLOR; + this.m_histogram[Math.floor(val)]++; + numPixels++; + } // for (x) + } // for (y) + } // for (z) + // get probabilities of each color in histogram + for (i = 0; i < AV_NUM_COLORS; i++) { + const h = this.m_histogram[i]; + this.m_colorProbability[i] = h / numPixels; + } + + // smooth prob + const GAUSS_RAD = 5; + const GAUSS_SIGMA = 1.6; + ActiveVolume.smoothArray(this.m_colorProbability, AV_NUM_COLORS, GAUSS_RAD, GAUSS_SIGMA); + + // + // Histogram looks like this + // Brain + // + // +-----------------------> + // *** ******** + // * ** **** * + // * * * * * + // * * * * + // * * + // * + // * + // * + // * + + // Lungs + // +-----------------------> + // ***** ********** + // * * * + // * * * + // ** * * + // * * + // * * + // * * + // * + // + + // Find las local maximum: this is most frequent bright (white) color intensity + let j; + let indBrightColor = -1; + const DIST_DETECT_LOC_MAX = 9; + for (i = AV_NUM_COLORS - DIST_DETECT_LOC_MAX; i > DIST_DETECT_LOC_MAX; i--) { + let isLocMax = 1; + let isLarger = 0; + for (j = i - DIST_DETECT_LOC_MAX; j <= i + DIST_DETECT_LOC_MAX; j++) { + if (this.m_colorProbability[i] > this.m_colorProbability[j]) { + isLarger = 1; + } + if (this.m_colorProbability[i] < this.m_colorProbability[j]) { + isLocMax = 0; + break; + } + } // for (j) around i + if (isLocMax && isLarger) { + indBrightColor = i; + break; + } + } + if (indBrightColor === -1) { + console.log('Bright color cant be detected !'); + } + // console.log(`indBrightColor = ${indBrightColor}`); + + // Find first local maximum + let indDarkColor = -1; + for (i = 0; i < indBrightColor; i++) { + let isLocMax = true; + let isLarger = false; + const indScanMin = i - DIST_DETECT_LOC_MAX >= 0 ? i - DIST_DETECT_LOC_MAX : 0; + const indScanMax = i + DIST_DETECT_LOC_MAX <= MAX_COLOR ? i + DIST_DETECT_LOC_MAX : MAX_COLOR; + for (j = indScanMin; j <= indScanMax; j++) { + if (this.m_colorProbability[i] > this.m_colorProbability[j]) { + isLarger = true; + } + if (this.m_colorProbability[i] < this.m_colorProbability[j]) { + isLocMax = false; + break; + } + } // for (j) around i + if (isLocMax && isLarger) { + indDarkColor = i; + break; + } + } // for (i) ind dark color + if (indDarkColor === -1) { + console.log('indDarkColor should not be -1'); + } + if (indDarkColor >= indBrightColor) { + console.log('indDarkColor should not less then indBrightColor'); + } + // console.log(`indDarkColor = ${indDarkColor}`); + + // Half of bright color is barrier to detect "black" / "white" change + const indBrightHalf = Math.floor(indBrightColor / TWO); + + // clear histogram + for (i = 0; i < AV_NUM_COLORS; i++) { + this.m_histogram[i] = 0; + } + + // Get histogram of part image + numPixels = 0; + for (z = zMin; z < zMax; z++) { + const zOff = z * this.m_xDim * this.m_yDim; + for (y = yMin; y < yMax; y++) { + const yOff = y * this.m_xDim; + let isExitFromBrightZoneDetected = false; + let numPixelsDarkZone = 0; + for (x = 0; x < this.m_xDim - 1; x++) { + const off = x + yOff + zOff; + const valCur = Math.floor(this.m_imageGauss[off + 0]); + const valNex = Math.floor(this.m_imageGauss[off + 1]); + const isCurGreat = valCur > indBrightHalf ? 1 : 0; + const isNexLess = valNex <= indBrightHalf ? 1 : 0; + if ((isCurGreat & isNexLess) !== 0) { + isExitFromBrightZoneDetected = true; + continue; + } + if (isExitFromBrightZoneDetected) { + const TOO_MUCH_BRIGHT_ZONE = 40; + if (numPixelsDarkZone > TOO_MUCH_BRIGHT_ZONE) { + break; + } + if (isCurGreat) { + break; + } + numPixelsDarkZone++; + const valOrig = Math.floor(this.m_pixelsSrc[off + 0]); + this.m_histogram[valOrig]++; + numPixels++; + } // if was exit from bright zone + } // for (x) + } // for (y) + } // for (z) + + // get probabilities of each color in histogram + for (i = 0; i < AV_NUM_COLORS; i++) { + const h = this.m_histogram[i]; + this.m_colorProbability[i] = h / numPixels; + } + + // smooth prob + const GAUSS_RAD_FOR_LOC = 8; + const GAUSS_SIGMA_FOR_LOC = 2.4; + ActiveVolume.smoothArray(this.m_colorProbability, AV_NUM_COLORS, GAUSS_RAD_FOR_LOC, GAUSS_SIGMA_FOR_LOC); + + // Find first local maximum + indDarkColor = -1; + for (i = 0; i < indBrightColor; i++) { + let isLocMax = true; + let isLarger = false; + const indScanMin = i - DIST_DETECT_LOC_MAX >= 0 ? i - DIST_DETECT_LOC_MAX : 0; + const indScanMax = i + DIST_DETECT_LOC_MAX <= MAX_COLOR ? i + DIST_DETECT_LOC_MAX : MAX_COLOR; + for (j = indScanMin; j <= indScanMax; j++) { + if (this.m_colorProbability[i] > this.m_colorProbability[j]) { + isLarger = true; + } + if (this.m_colorProbability[i] < this.m_colorProbability[j]) { + isLocMax = false; + break; + } + } // for (j) around i + if (isLocMax && isLarger) { + indDarkColor = i; + break; + } + } // for (i) bright color + // console.log(`indDarkColor = ${indDarkColor}`); + + // Find next local min + let indDarkColorMax = -1; + for (i = indDarkColor + 1; i < indBrightColor; i++) { + let isLocMin = true; + let isLess = false; + const indScanMin = i - DIST_DETECT_LOC_MAX >= 0 ? i - DIST_DETECT_LOC_MAX : 0; + const indScanMax = i + DIST_DETECT_LOC_MAX <= MAX_COLOR ? i + DIST_DETECT_LOC_MAX : MAX_COLOR; + for (j = indScanMin; j <= indScanMax; j++) { + if (this.m_colorProbability[i] < this.m_colorProbability[j]) { + isLess = 1; + } + if (this.m_colorProbability[i] > this.m_colorProbability[j]) { + isLocMin = false; + break; + } + } // for (j) around i + if (isLocMin && isLess) { + indDarkColorMax = i; + break; + } + } + if (indDarkColorMax <= indDarkColor) { + console.log('indDarkColorMax should be more indDarkColor!'); + } + + if (indDarkColorMax >= indBrightColor) { + console.log('indDarkColorMax should be less indBrightColor!'); + } + console.log(`ActiveVolume. Dark colors range is [${indDarkColor}, ${indDarkColorMax}]`); + + // Make smooth step function for range [indDarkColor .. indDarkColorMax] + for (i = 0; i < AV_NUM_COLORS; i++) { + this.m_colorProbability[i] = ActiveVolume.smoothStep(indDarkColor, indDarkColorMax, i); + } + // Debug here + indDarkColorMax++; + return 1; + } + + resetStateForGeoUpdates() { + this.m_geoStage = 0; + this.m_state = AV_STATE_UPDATE_GEO; + this.m_geoRender.createNormalsForGeometry(); + } + + resetStateToStartUpdates() { + this.m_geoStage = 0; + this.m_gaussStage = 0; + this.m_state = AV_STATE_NOT_STARTED; + } + + /** + * Update render geo + * @param {object} geo RederGeo to modify + * @param {number} method Method + * @return {number} 1, if success. < 0, if failed + */ + updateGeo(geo, method) { + if (geo === 'undefined') { + console.log('ActiveVolume. updateGeo: geo undefined'); + const FAIL_UNDEF = -1; + return FAIL_UNDEF; + } + if (geo === null) { + console.log('ActiveVolume. updateGeo: geo null'); + const FAIL_NULL = -2; + return FAIL_NULL; + } + + if (this.m_state === AV_STATE_FINISHED) { + return 1; + } + if (this.m_state === AV_STATE_NOT_STARTED) { + // first update + const okCreateNormals = geo.createNormalsForGeometry(); + if (okCreateNormals !== 1) { + console.log('geo.createNormalsForGeometry returned fail'); + return okCreateNormals; + } + + this.startImageSmooth(); + this.m_gaussStage = 0; + this.m_state = AV_STATE_PREPARE_GAUSS; + } + if (this.m_state === AV_STATE_PREPARE_GAUSS) { + const GAUSS_RAD = 2; + const GAUSS_SIGMA = 1.8; + const zStart = Math.floor((this.m_zDim * (this.m_gaussStage + 0)) / ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES); + const zEnd = Math.floor((this.m_zDim * (this.m_gaussStage + 1)) / ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES); + this.applyPartGaussSmooth(zStart, zEnd, GAUSS_RAD, GAUSS_SIGMA); + + this.m_gaussStage++; + if (this.m_gaussStage >= ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES) { + this.m_state = AV_STATE_PREPARE_UNIFORMITY; + this.m_uniformityStage = 0; + console.log('UpdateGeo. AV_STATE_PREPARE_UNIFORMITY.'); + return 1; + } + } + if (this.m_state === AV_STATE_PREPARE_UNIFORMITY) { + const zStart = Math.floor((this.m_zDim * (this.m_uniformityStage + 0)) / ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES); + const zEnd = Math.floor((this.m_zDim * (this.m_uniformityStage + 1)) / ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES); + const KOEF_UNIFORMITY = 0.07; + this.makeUniformityImage( + this.m_imageGauss, + this.m_xDim, + this.m_yDim, + this.m_zDim, + zStart, + zEnd, + this.m_imageGrad, + this.m_imageUniformity, + KOEF_UNIFORMITY + ); + this.m_uniformityStage++; + if (this.m_uniformityStage >= ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES) { + // DEBUG save + const DEBUG_SAVE_UNI = false; + if (DEBUG_SAVE_UNI) { + const TEST_SAVE_UNI_FILE_NAME = 'uni.bmp'; + const TWO = 2; + const zSlice = this.m_zDim / TWO; + ActiveVolume.saveVolumeSliceToFile( + this.m_imageUniformity, + this.m_xDim, + this.m_yDim, + this.m_zDim, + zSlice, + TEST_SAVE_UNI_FILE_NAME + ); + } + + // finally get image histogram + // console.log('UpdateGeo. getHistogram...'); + this.getHistogram(); + this.stopImageSmooth(); + this.m_geoStage = 0; + this.m_state = AV_STATE_UPDATE_GEO; + // console.log('UpdateGeo. AV_STATE_UPDATE_GEO.'); + return 1; + } + } + + if (this.m_state === AV_STATE_UPDATE_GEO) { + if (this.m_verticesNew === null) { + const numVertices = geo.getNumVertices(); + const COORDS_IN_VERTREX = 4; + this.m_verticesNew = new Float32Array(numVertices * COORDS_IN_VERTREX); + } + + const updateNormals = (method & AV_METHOD_NORMALS) !== 0; + const updateUniformity = (method & AV_METHOD_UNIFORMITY) !== 0; + const updateColorKoefs = (method & AV_METHOD_COLOR_KOEFS) !== 0; + + const SPEED_NORMALS = 1.1; + if (updateNormals && !updateUniformity) { + this.updateGeoByVertexNormals(geo, SPEED_NORMALS); + } + if (updateNormals && updateUniformity && !updateColorKoefs) { + this.updateGeoByVertexNormalsAndUniformity(geo, SPEED_NORMALS); + } + if (updateNormals && updateUniformity && updateColorKoefs) { + const isFinished = this.updateGeoNormalsUniformityColors(geo, SPEED_NORMALS); + if (isFinished) { + console.log(`updateGeoNormalsUniformityColors is FINISHED. m_geoStage = ${this.m_geoStage}`); + this.m_state = AV_STATE_FINISHED; + } + } + this.m_geoStage++; + } // if state is update geo + return 1; + } + + getAveUniformityForGeoVertices(geo) { + let i, i4; + const numVertices = geo.getNumVertices(); + const vertices = geo.getVertices(); + const xyDim = this.m_xDim * this.m_yDim; + let uniAve = 0.0; + const NUM_COMPS_VERTEX = 4; + const OFF_0 = 0; + const OFF_1 = 1; + const OFF_2 = 2; + for (i = 0, i4 = 0; i < numVertices; i++, i4 += NUM_COMPS_VERTEX) { + // pixel coordinate in the volume + const x = Math.floor(vertices[i4 + OFF_0]); + const y = Math.floor(vertices[i4 + OFF_1]); + const z = Math.floor(vertices[i4 + OFF_2]); + + const off = x + y * this.m_xDim + z * xyDim; + const uni = this.m_imageUniformity[off]; + uniAve += uni; + } + uniAve /= numVertices; + return uniAve; + } + + finalizeUpdatesGeo(geo, inDebugMode) { + if (inDebugMode) { + console.log(`geoUpdates are finished in ${this.m_updateCounter} steps`); + const FILE_NAME_GEO = 'geo_final.obj'; + geo.saveGeoToObjFile(FILE_NAME_GEO); + } + } + + /** + * Update geometry with normals, uniformity map and colors distribution + * @param {object} geo RederGeo to modify + * @param {number} normalSpeed speed for increase geo size + */ + updateGeoNormalsUniformityColors(geo, normalSpeed) { + const numVertices = geo.getNumVertices(); + // float array + const vertices = geo.getVertices(); + // THREE.Vector3 array + const normals = geo.getNormals(); + const numTriangles = geo.getNumTriangles(); + const indices = geo.getIndices(); + + // perform laplasian smoother + // ... + if (this.m_lapSmoother === null) { + this.m_lapSmoother = new LaplasianSmoother(); + } + + this.m_lapSmoother.performSmoothStep(numVertices, vertices, numTriangles, indices, this.m_verticesNew); + + const DEEP_DEBUG = false; + + // use smoothed vertices to update geo + const NUM_COMPS_VERTEX = 4; + const OFF_0 = 0; + const OFF_1 = 1; + const OFF_2 = 2; + let i, i4; + + // when sphere touch edges, this definately means iterations end + let sphereTouchEdge = false; + // if too much matched, than stop iterations + // let numMatchedToColor = 0; + + for (i = 0, i4 = 0; i < numVertices; i++, i4 += NUM_COMPS_VERTEX) { + let vx = vertices[i4 + OFF_0]; + let vy = vertices[i4 + OFF_1]; + let vz = vertices[i4 + OFF_2]; + const vn = normals[i]; + + // pixel coordinate in the volume + let x = Math.floor(vx); + let y = Math.floor(vy); + let z = Math.floor(vz); + + if (DEEP_DEBUG && i === 0) { + console.log(`v = ${vx}, ${vy}, ${vz}. int xyz = ${x},${y},${z}`); + console.log(`vn = ${vn.x}, ${vn.y}, ${vn.z}`); + } + + if (x >= this.m_xDim) { + sphereTouchEdge = true; + x = this.m_xDim - 1; + } + if (y >= this.m_yDim) { + sphereTouchEdge = true; + y = this.m_yDim - 1; + } + if (z >= this.m_zDim) { + sphereTouchEdge = true; + z = this.m_zDim - 1; + } + if (x < 0) { + sphereTouchEdge = true; + x = 0; + } + if (y < 0) { + sphereTouchEdge = true; + y = 0; + } + if (z < 0) { + sphereTouchEdge = true; + z = 0; + } + + const xyDim = this.m_xDim * this.m_yDim; + const off = x + y * this.m_xDim + z * xyDim; + const uni = this.m_imageUniformity[off]; + const valGaussCur = this.m_imageGauss[off]; + + if (DEEP_DEBUG && i === 0) { + console.log(`uni = ${uni}, valGaussCur = ${valGaussCur}`); + } + + let compSum = uni; + // predict next position + const NEXT_STEP = 2.5; + let nx = Math.floor(vx + vn.x * NEXT_STEP); + let ny = Math.floor(vy + vn.y * NEXT_STEP); + let nz = Math.floor(vz + vn.z * NEXT_STEP); + + if (DEEP_DEBUG && i === 0) { + console.log(`nx = ${nx}, ny = ${ny}, nz = ${nz}`); + } + if (nx < 0 || ny < 0 || nz < 0 || nx >= this.m_xDim || ny >= this.m_yDim || nz >= this.m_zDim) { + sphereTouchEdge = true; + } + nx = nx >= 0 ? nx : 0; + ny = ny >= 0 ? ny : 0; + nz = nz >= 0 ? nz : 0; + nx = nx < this.m_xDim ? nx : this.m_xDim - 1; + ny = ny < this.m_yDim ? ny : this.m_yDim - 1; + nz = nz < this.m_zDim ? nz : this.m_zDim - 1; + + const nextOff = nx + ny * this.m_xDim + nz * xyDim; + const valGaussNext = this.m_imageGauss[nextOff]; + const KOEF_GAUSS_DEC_MULT = 0.3; + if (valGaussNext > valGaussCur) { + compSum *= KOEF_GAUSS_DEC_MULT; + } + + if (DEEP_DEBUG && i === 0) { + console.log(`valGaussNext = ${valGaussNext}`); + } + + // use colors + const koef = this.m_colorProbability[Math.floor(valGaussCur)]; + compSum *= koef; + const COLOR_MATCH = 0.9; + const isColorMatch = koef <= COLOR_MATCH; + // numMatchedToColor += (isColorMatch) ? 1 : 0; + + if (DEEP_DEBUG && i === 0) { + console.log(`koef = ${koef}, isColorMatch = ${isColorMatch}`); + } + + const vAddSmooth = new THREE.Vector3(); + vAddSmooth.x = this.m_verticesNew[i4 + OFF_0] - vx; + vAddSmooth.y = this.m_verticesNew[i4 + OFF_1] - vy; + vAddSmooth.z = this.m_verticesNew[i4 + OFF_2] - vz; + vAddSmooth.normalize(); + vAddSmooth.multiplyScalar(normalSpeed); + + const vAddGeo = new THREE.Vector3(); + vAddGeo.x = vn.x * compSum * normalSpeed; + vAddGeo.y = vn.y * compSum * normalSpeed; + vAddGeo.z = vn.z * compSum * normalSpeed; + + if (DEEP_DEBUG && i === 0) { + console.log(`vAddSmooth = ${vAddSmooth.x}, ${vAddSmooth.y}, ${vAddSmooth.z}`); + console.log(`vAddGeo = ${vAddGeo.x}, ${vAddGeo.y}, ${vAddGeo.z}`); + } + + const KOEF_ADD_SMOOTH = 0.3; + const KOEF_ADD_GEO = 1.0 - KOEF_ADD_SMOOTH; + + if (isColorMatch) { + // do nothing + } else { + const vNew = new THREE.Vector3(); + vNew.x = vx + vAddGeo.x * KOEF_ADD_GEO + vAddSmooth.x * KOEF_ADD_SMOOTH; + vNew.y = vy + vAddGeo.y * KOEF_ADD_GEO + vAddSmooth.y * KOEF_ADD_SMOOTH; + vNew.z = vz + vAddGeo.z * KOEF_ADD_GEO + vAddSmooth.z * KOEF_ADD_SMOOTH; + + vx = vNew.x; + vy = vNew.y; + vz = vNew.z; + } + + this.m_verticesNew[i4 + OFF_0] = vx; + this.m_verticesNew[i4 + OFF_1] = vy; + this.m_verticesNew[i4 + OFF_2] = vz; + } // for i + + // debug + // if (numMatchedToColor > 0) { + // console.log(`numMatchedToColor = ${numMatchedToColor}. geoStage = ${this.m_geoStage}`); + // } + + // copy back + let errAve = 0.0; + for (i = 0, i4 = 0; i < numVertices; i++, i4 += NUM_COMPS_VERTEX) { + // estimate error of modification + const dx = this.m_verticesNew[i4 + OFF_0] - vertices[i4 + OFF_0]; + const dy = this.m_verticesNew[i4 + OFF_1] - vertices[i4 + OFF_1]; + const dz = this.m_verticesNew[i4 + OFF_2] - vertices[i4 + OFF_2]; + const err = dx * dx + dy * dy + dz * dz; + errAve += err; + + vertices[i4 + OFF_0] = this.m_verticesNew[i4 + OFF_0]; + vertices[i4 + OFF_1] = this.m_verticesNew[i4 + OFF_1]; + vertices[i4 + OFF_2] = this.m_verticesNew[i4 + OFF_2]; + } + errAve /= numVertices; + errAve = Math.sqrt(errAve); + const DIF_VERTICES_LIMIT = 0.12; + if (errAve < DIF_VERTICES_LIMIT) { + this.finalizeUpdatesGeo(geo, DEEP_DEBUG); + return true; + } + const aveUni = this.getAveUniformityForGeoVertices(geo); + const MIN_POSSIBLE_UNIFORMITY = 0.6; + if (aveUni < MIN_POSSIBLE_UNIFORMITY) { + this.finalizeUpdatesGeo(geo, DEEP_DEBUG); + return true; + } + if (sphereTouchEdge) { + this.finalizeUpdatesGeo(geo, DEEP_DEBUG); + return true; + } + + const DEEP_ERR_DEBUG = false; + if (DEEP_ERR_DEBUG) { + const VERTICES_UNIFORMITY = 1024; + console.log(`Iters errAve = ${errAve} < ${DIF_VERTICES_LIMIT}. aveUni = ${aveUni} < ${VERTICES_UNIFORMITY}`); + } + return false; + } // updateGeoNormalsUniformityColors +} // class ActiveVolume + +/** Output flags */ +ActiveVolume.REMOVE_SKULL = 0; +ActiveVolume.CREATE_MASK = 1; + +/** Sphere evolve direction */ +ActiveVolume.SPHERE_EVOLVE_FROM_INSIDE = 0; +ActiveVolume.SPHERE_EVOLVE_FROM_OUTSIDE = 1; + +/** num iteration stages */ +ActiveVolume.ACT_VOL_NUM_SMOOTH_STAGES = 64; diff --git a/src/demo/engine/actvolume/floodfill.js b/src/engine/actvolume/floodfill.js similarity index 76% rename from src/demo/engine/actvolume/floodfill.js rename to src/engine/actvolume/floodfill.js index 71700d33..9892acd4 100644 --- a/src/demo/engine/actvolume/floodfill.js +++ b/src/engine/actvolume/floodfill.js @@ -1,34 +1,20 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Flood fill 3d volume -* @module lib/scripts/actvolume/floodfill -*/ + * Flood fill 3d volume + * @module lib/scripts/actvolume/floodfill + */ // absolute imports import * as THREE from 'three'; /** -* Class FloodFillTool used to fill areas in 3d -* @class FloodFillTool -*/ + * Class FloodFillTool used to fill areas in 3d + * @class FloodFillTool + */ export default class FloodFillTool { constructoir() { this.m_stack3d = []; @@ -77,7 +63,7 @@ export default class FloodFillTool { } stack3dEIsEmpty() { - return (this.m_indexStack3d <= 0); + return this.m_indexStack3d <= 0; } detectSeedPoint3d(xDim, yDim, zDim, pixels, vaSeedPoints, maxSeedPoints) { @@ -107,12 +93,12 @@ export default class FloodFillTool { let xR = -1; let x; for (x = 0; x < xDim - 1; x++) { - const isStartInside = (pixels[x + yOff + zOff] > 0) && (pixels[x + 1 + yOff + zOff] === 0); - const isEndInside = (pixels[x + yOff + zOff] === 0) && (pixels[x + 1 + yOff + zOff] > 0); + const isStartInside = pixels[x + yOff + zOff] > 0 && pixels[x + 1 + yOff + zOff] === 0; + const isEndInside = pixels[x + yOff + zOff] === 0 && pixels[x + 1 + yOff + zOff] > 0; if (isStartInside) { xL = x; } - if (isEndInside && (xL >= 0)) { + if (isEndInside && xL >= 0) { xR = x + 1; const xSegmentLen = xR - xL + 1; if (xSegmentLen > 1) { @@ -153,12 +139,12 @@ export default class FloodFillTool { const zOff = z * xyDim; // get leftmost - for (x = vTaken.x; (x >= 0) && (pixels[x + yOff + zOff] === 0);) { + for (x = vTaken.x; x >= 0 && pixels[x + yOff + zOff] === 0; ) { x--; } const xL = x + 1; // get rightmost - for (x = vTaken.x; (x < xDim) && (pixels[x + yOff + zOff] === 0);) { + for (x = vTaken.x; x < xDim && pixels[x + yOff + zOff] === 0; ) { x++; } const xR = x - 1; @@ -173,7 +159,7 @@ export default class FloodFillTool { this.m_numFilled3d++; // check line y less - if ((y > 0) && (pixels[x + yOff - xDim + zOff] !== setYLess)) { + if (y > 0 && pixels[x + yOff - xDim + zOff] !== setYLess) { setYLess = VIS - setYLess; if (setYLess === 0) { // V3d vPu(x, y - 1, z); @@ -186,7 +172,7 @@ export default class FloodFillTool { } // if (y less pint has another vis state // check line above - if ((y < yDim - 1) && (pixels[x + yOff + xDim + zOff] !== setYMore)) { + if (y < yDim - 1 && pixels[x + yOff + xDim + zOff] !== setYMore) { setYMore = VIS - setYMore; if (setYMore === 0) { // V3d vPu(x, y + 1, z); @@ -199,7 +185,7 @@ export default class FloodFillTool { } // if (y more point has another vis state // check line z less - if ((z > 0) && (pixels[x + yOff + zOff - xyDim] !== setZLess)) { + if (z > 0 && pixels[x + yOff + zOff - xyDim] !== setZLess) { setZLess = VIS - setZLess; if (setZLess === 0) { // V3d vPu(x, y, z - 1); @@ -212,7 +198,7 @@ export default class FloodFillTool { } // if (z less pint has another vis state // check line z more - if ((z < zDim - 1) && (pixels[x + yOff + zOff + xyDim] !== setZMore)) { + if (z < zDim - 1 && pixels[x + yOff + zOff + xyDim] !== setZMore) { setZMore = VIS - setZMore; if (setZMore === 0) { // V3d vPu(x, y, z + 1); @@ -228,5 +214,4 @@ export default class FloodFillTool { this.destroyStack3d(); return 1; } - } // class diff --git a/src/demo/engine/actvolume/georender.js b/src/engine/actvolume/georender.js similarity index 91% rename from src/demo/engine/actvolume/georender.js rename to src/engine/actvolume/georender.js index 2e4835ae..71396f19 100644 --- a/src/demo/engine/actvolume/georender.js +++ b/src/engine/actvolume/georender.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Geometry for render -* @module lib/scripts/actvolume/georender -*/ + * Geometry for render + * @module lib/scripts/actvolume/georender + */ // absolute imports import * as THREE from 'three'; @@ -39,9 +25,9 @@ const GEO_ERROR_OK = 1; // const GEO_ERROR_BAD_FACE_VERT_INDEX = -8; /** -* Class GeoRender for render geometry -* @class GeoRender -*/ + * Class GeoRender for render geometry + * @class GeoRender + */ export default class GeoRender { constructor() { this.m_numVertices = 0; @@ -144,7 +130,7 @@ export default class GeoRender { const ANGLE_QUATER = M_PI * 0.5 * LIT_BIT_LESS_ONE; for (j = 0; j <= numSegmentsVert; j++) { const tv = j / numSegmentsVert; - const angleVert = -(ANGLE_QUATER) + tv * (ANGLE_QUATER * OFF_2); + const angleVert = -ANGLE_QUATER + tv * (ANGLE_QUATER * OFF_2); for (i = 0; i < numSegmentsHor; i++) { const th = i / numSegmentsHor; const angleHor = th * M_PI * OFF_2; @@ -203,8 +189,8 @@ export default class GeoRender { } /** - * Save render geometry into given file (OBJ type) - */ + * Save render geometry into given file (OBJ type) + */ saveGeoToObjFile(fileName) { let strOut = '# Render geometry save\n'; const numVertices = this.m_numVertices; @@ -266,8 +252,8 @@ export default class GeoRender { } // saveGeoToObjFile /** - * Calculate vertices normals, based on triangle normals - */ + * Calculate vertices normals, based on triangle normals + */ createNormalsForGeometry() { this.m_normals = new Array(this.m_numVertices); for (let i = 0; i < this.m_numVertices; i++) { diff --git a/src/demo/engine/actvolume/lapsmooth.js b/src/engine/actvolume/lapsmooth.js similarity index 69% rename from src/demo/engine/actvolume/lapsmooth.js rename to src/engine/actvolume/lapsmooth.js index 891f3eb8..a67f36b6 100644 --- a/src/demo/engine/actvolume/lapsmooth.js +++ b/src/engine/actvolume/lapsmooth.js @@ -1,35 +1,21 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Laplasian smoother -* @module lib/scripts/actvolume/alpsmooth -* @note refernces to articles: -* G.Taubin, "A Signal Processing Approach To Fair Surface Design" -* Y.Ohtake, A.Belyaev, I.Bogaevski, "Polyhedral Surface Smoothing with Simultaneous Mesh Regularization" -* A.Belyaev, Y.Ohtake, "A Comparison of Mesh Smoothing Methods" -* -* Future enchancement -* Advanced mesh smoothing, better then Laplasian smoothing -* H.Yagou, Y.Ohtake, A.Belyaev, "Mesh Smoothing via Mean and Median Filtering Applied to Face Normals" -* -*/ + * Laplasian smoother + * @module lib/scripts/actvolume/alpsmooth + * @note refernces to articles: + * G.Taubin, "A Signal Processing Approach To Fair Surface Design" + * Y.Ohtake, A.Belyaev, I.Bogaevski, "Polyhedral Surface Smoothing with Simultaneous Mesh Regularization" + * A.Belyaev, Y.Ohtake, "A Comparison of Mesh Smoothing Methods" + * + * Future enchancement + * Advanced mesh smoothing, better then Laplasian smoothing + * H.Yagou, Y.Ohtake, A.Belyaev, "Mesh Smoothing via Mean and Median Filtering Applied to Face Normals" + * + */ // absolute imports import * as THREE from 'three'; @@ -40,16 +26,15 @@ import * as THREE from 'three'; const LAPSMOOTH_NUM_NEIBS = 16; const INVALID_INDEX = -1; - /** -* Class LaplasianSmoother perform simple laplasian smoothing -* @class LaplasianSmoother -*/ + * Class LaplasianSmoother perform simple laplasian smoothing + * @class LaplasianSmoother + */ export default class LaplasianSmoother { /** - * Init all internal data - * @constructs ActiveVolume - */ + * Init all internal data + * @constructs ActiveVolume + */ constructor() { this.m_vertNeib = null; } @@ -91,7 +76,7 @@ export default class LaplasianSmoother { vAve.y += vertSrc4[vertOffset + OFF_1]; vAve.z += vertSrc4[vertOffset + OFF_2]; numNeibs++; - } // for (k) all possible neighbours + } // for (k) all possible neighbours // check is this isolated vertex: no one triangle share thios vertex if (numNeibs === 0) { @@ -103,11 +88,11 @@ export default class LaplasianSmoother { const vCur = new THREE.Vector3(vertSrc4[i4 + OFF_0], vertSrc4[i4 + OFF_1], vertSrc4[i4 + OFF_2]); const vNew = new THREE.Vector3(); - const RATIO_CUR = 0.3; + const RATIO_CUR = 0.3; - vNew.x = vCur.x * (1.0 - RATIO_CUR) + vAve.x * (RATIO_CUR); - vNew.y = vCur.y * (1.0 - RATIO_CUR) + vAve.y * (RATIO_CUR); - vNew.z = vCur.z * (1.0 - RATIO_CUR) + vAve.z * (RATIO_CUR); + vNew.x = vCur.x * (1.0 - RATIO_CUR) + vAve.x * RATIO_CUR; + vNew.y = vCur.y * (1.0 - RATIO_CUR) + vAve.y * RATIO_CUR; + vNew.z = vCur.z * (1.0 - RATIO_CUR) + vAve.z * RATIO_CUR; const dist = vNew.distanceTo(vCur); distAve += dist; @@ -115,8 +100,7 @@ export default class LaplasianSmoother { vertDst[i4 + OFF_0] = vNew.x; vertDst[i4 + OFF_1] = vNew.y; vertDst[i4 + OFF_2] = vNew.z; - - } // for (i) + } // for (i) distAve /= numVertices; // enlarge model @@ -162,7 +146,7 @@ export default class LaplasianSmoother { const idx = indFrom * LAPSMOOTH_NUM_NEIBS; let i; let found = false; - for (i = 0; (i < LAPSMOOTH_NUM_NEIBS) && !found; i++) { + for (i = 0; i < LAPSMOOTH_NUM_NEIBS && !found; i++) { if (this.m_vertNeib[idx + i] === INVALID_INDEX) { break; } @@ -175,7 +159,7 @@ export default class LaplasianSmoother { } // add new link - for (i = 0; (i < LAPSMOOTH_NUM_NEIBS); i++) { + for (i = 0; i < LAPSMOOTH_NUM_NEIBS; i++) { if (this.m_vertNeib[idx + i] === INVALID_INDEX) { break; } diff --git a/src/demo/engine/actvolume/lungsfill/floodfill.js b/src/engine/actvolume/lungsfill/floodfill.js similarity index 56% rename from src/demo/engine/actvolume/lungsfill/floodfill.js rename to src/engine/actvolume/lungsfill/floodfill.js index 9bf9e9ae..96b16c22 100644 --- a/src/demo/engine/actvolume/lungsfill/floodfill.js +++ b/src/engine/actvolume/lungsfill/floodfill.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Flood fill -* @module lib/scripts/lungsfill/floodfill -*/ + * Flood fill + * @module lib/scripts/lungsfill/floodfill + */ // absolute imports // import * as THREE from 'three'; @@ -36,30 +22,27 @@ under the License. // **************************************************************************** /** -* Class FloodFill perform 3d flood fill -* @class FloodFill -*/ + * Class FloodFill perform 3d flood fill + * @class FloodFill + */ export default class FloodFill { /** - * Init all internal data - * @constructs FloodFill - */ + * Init all internal data + * @constructs FloodFill + */ constructor() { this.m_xDim = 0; this.m_yDim = 0; this.m_zDim = 0; - this.m_stack3d = null; - this.m_maxStack3d = 0; - this.m_indexStack3d = 0; this.m_numFilled3d = 0; } static isVisible(pixels, offset, threshold) { const VIS = 255; - return (pixels[offset] <= threshold) ? 0 : VIS; + return pixels[offset] <= threshold ? 0 : VIS; } - floodFill3dThreshold(xDim, yDim, zDim, pixelsDst, vSeed, threshold) { + floodFill3dThreshold(xDim, yDim, zDim, pixelsDst, vSeed, threshold) { const xyDim = xDim * yDim; const stack = []; const VIS = 255; @@ -71,7 +54,7 @@ export default class FloodFill { } // Decrement highest pixels to reserve special mask value (255) // if it was 255, becomes 254 - stack.push({ 'x':vSeed.x, 'y':vSeed.y, 'z':vSeed.z }); + stack.push({ x: vSeed.x, y: vSeed.y, z: vSeed.z }); while (stack.length !== 0) { const vTaken = stack.pop(); let x; @@ -84,13 +67,13 @@ export default class FloodFill { // get leftmost let xL = 0; - for (x = vTaken.x; (x >= 0) && !FloodFill.isVisible(pixelsDst, x + yOff + zOff, threshold); x--) { + for (x = vTaken.x; x >= 0 && !FloodFill.isVisible(pixelsDst, x + yOff + zOff, threshold); x--) { xL = x + 1; } xL = x + 1; // get rightmost let xR = 0; - for (x = vTaken.x; (x < xDim) && !FloodFill.isVisible(pixelsDst, x + yOff + zOff, threshold); x++) { + for (x = vTaken.x; x < xDim && !FloodFill.isVisible(pixelsDst, x + yOff + zOff, threshold); x++) { xR = x - 1; } xR = x - 1; @@ -105,41 +88,40 @@ export default class FloodFill { this.m_numFilled3d++; // check line y less - if ((y > 0) && (FloodFill.isVisible(pixelsDst, x + yOff + zOff - xDim, threshold) !== setYLess)) { + if (y > 0 && FloodFill.isVisible(pixelsDst, x + yOff + zOff - xDim, threshold) !== setYLess) { setYLess = VIS - setYLess; if (setYLess === 0) { - stack.push({ 'x': x, 'y': (y - 1), 'z': z }); + stack.push({ x: x, y: y - 1, z: z }); } // if need to push } // if (y less pint has another vis state // check line above - if ((y < yDim - 1) && (FloodFill.isVisible(pixelsDst, x + yOff + zOff + xDim, threshold) !== setYMore)) { + if (y < yDim - 1 && FloodFill.isVisible(pixelsDst, x + yOff + zOff + xDim, threshold) !== setYMore) { setYMore = VIS - setYMore; if (setYMore === 0) { - stack.push({ 'x': x, 'y': (y + 1), 'z': z }); + stack.push({ x: x, y: y + 1, z: z }); } // if need to push } // if (y more point has another vis state // check line z less //if ((z > 0) && (FloodFill.isVisible(pixelsDst, x + yOff + zOff - xyDim, threshold) !== setZLess)) { - if ((z > 3) && (FloodFill.isVisible(pixelsDst, x + yOff + zOff - xyDim, threshold) !== setZLess)) { + if (z > 3 && FloodFill.isVisible(pixelsDst, x + yOff + zOff - xyDim, threshold) !== setZLess) { setZLess = VIS - setZLess; if (setZLess === 0) { - stack.push({ 'x': x, 'y': y, 'z': z - 1 }); + stack.push({ x: x, y: y, z: z - 1 }); } // if need to push } // if (z less pint has another vis state // check line z more //if ((z < zDim - 1) && (FloodFill.isVisible(pixelsDst, x + yOff + zOff + xyDim, threshold) !== setZMore)) { - if ((z < zDim - 1 - 3) && (FloodFill.isVisible(pixelsDst, x + yOff + zOff + xyDim, threshold) !== setZMore)) { + if (z < zDim - 1 - 3 && FloodFill.isVisible(pixelsDst, x + yOff + zOff + xyDim, threshold) !== setZMore) { setZMore = VIS - setZMore; if (setZMore === 0) { - stack.push({ 'x': x, 'y': y, 'z': z + 1 }); + stack.push({ x: x, y: y, z: z + 1 }); } // if need to push } // if (z more) } // for (x) scanned hor line } // while stack is not empty return 1; } // end of floodFill3dThreshold - } // end FloodFill diff --git a/src/demo/engine/actvolume/lungsfill/seedPoints.js b/src/engine/actvolume/lungsfill/seedPoints.js similarity index 87% rename from src/demo/engine/actvolume/lungsfill/seedPoints.js rename to src/engine/actvolume/lungsfill/seedPoints.js index 1043f660..14e80330 100644 --- a/src/demo/engine/actvolume/lungsfill/seedPoints.js +++ b/src/engine/actvolume/lungsfill/seedPoints.js @@ -1,17 +1,22 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** -* Lungs fill tool -* @module lib/scripts/actvolume/lungsfill/seedPoints -*/ + * Lungs fill tool + * @module lib/scripts/actvolume/lungsfill/seedPoints + */ const TOO_MIN_VAL = 40; /** -* Class seedPoints perform find seed points for lungs selection (segmentation) -* @class seedPoints -*/ + * Class seedPoints perform find seed points for lungs selection (segmentation) + * @class seedPoints + */ export default class SeedPoints { /** - * Init all internal data - * @constructs SeedPoints - */ + * Init all internal data + * @constructs SeedPoints + */ constructor(volume, xDim, yDim, zDim) { this.m_xDim = xDim; this.m_yDim = yDim; @@ -23,7 +28,8 @@ export default class SeedPoints { const TWO = 2; const zCenter = Math.floor(this.m_zDim / TWO); const yCenter = Math.floor(this.m_yDim / TWO); - let yMin = -1, yMax = -1; + let yMin = -1, + yMax = -1; const zOff = zCenter * this.m_xDim * this.m_yDim; let yOff = -1; @@ -37,10 +43,10 @@ export default class SeedPoints { yOff = y * this.m_xDim; let numWhitePixels = 0; for (x = 0; x < this.m_xDim; x++) { - numWhitePixels += (this.m_volTexSrc[x + yOff + zOff] > TOO_MIN_VAL) ? 1 : 0; + numWhitePixels += this.m_volTexSrc[x + yOff + zOff] > TOO_MIN_VAL ? 1 : 0; } // how much percents of non-black pixels can be in line - const isBlackLine = (numWhitePixels / this.m_xDim < MIN_LINE_RATIO) ? 1 : 0; + const isBlackLine = numWhitePixels / this.m_xDim < MIN_LINE_RATIO ? 1 : 0; if (!isBlackLine) { break; } @@ -51,10 +57,10 @@ export default class SeedPoints { yOff = y * this.m_xDim; let numWhitePixels = 0; for (x = 0; x < this.m_xDim; x++) { - numWhitePixels += (this.m_volTexSrc[x + yOff + zOff] > TOO_MIN_VAL) ? 1 : 0; + numWhitePixels += this.m_volTexSrc[x + yOff + zOff] > TOO_MIN_VAL ? 1 : 0; } // how much percetns non-black pixels can be in line - const isBlackLine = (numWhitePixels / this.m_xDim < MIN_LINE_RATIO) ? 1 : 0; + const isBlackLine = numWhitePixels / this.m_xDim < MIN_LINE_RATIO ? 1 : 0; if (!isBlackLine) { break; } @@ -75,7 +81,7 @@ export default class SeedPoints { const NUM_COLORS = 8; const histogram = new Float32Array(NUM_COLORS); let goodHistogramDetected = false; - for (y = yMin; (y <= yMax) && !goodHistogramDetected; y++) { + for (y = yMin; y <= yMax && !goodHistogramDetected; y++) { // clear histogram for (x = 0; x < NUM_COLORS; x++) { histogram[x] = 0; @@ -149,7 +155,7 @@ export default class SeedPoints { const NUM_7 = 7; const NUM_512 = 512; - const sizeBlackAreaMin = Math.floor(this.m_xDim * NUM_7 / NUM_512); + const sizeBlackAreaMin = Math.floor((this.m_xDim * NUM_7) / NUM_512); // for each point scan in 4 directions to find white barrier @@ -162,9 +168,9 @@ export default class SeedPoints { let cx, cy; const offZ = 2 * this.m_xDim * this.m_yDim; - for (cy = yMin; (cy < yMax) && !holeFound; cy++) { + for (cy = yMin; cy < yMax && !holeFound; cy++) { const cyOff = cy * this.m_xDim; - for (cx = xMin; (cx < xMax) && !holeFound; cx++) { + for (cx = xMin; cx < xMax && !holeFound; cx++) { const val = pixelsSrc[cx + cyOff + offZ]; if (val >= VAL_BLACK_BARRIER) { continue; @@ -241,7 +247,7 @@ export default class SeedPoints { break; } // if 4 barriers } // for (cx) - } // for (cy) + } // for (cy) if (!holeFound) { return 1; } else { diff --git a/src/engine/actvolume/pointlink.js b/src/engine/actvolume/pointlink.js new file mode 100644 index 00000000..58f64992 --- /dev/null +++ b/src/engine/actvolume/pointlink.js @@ -0,0 +1,30 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Simple point link + * @module lib/scripts/actvolume/pointlink + */ + +// absolute imports +import * as THREE from 'three'; + +// relative imports +// import PointLink from './pointlink'; + +/** + * Class PointLink define link entry + * @class PointLink + */ +export default class PointLink { + /** + * Init all internal data + * @constructs PointLink + */ + constructor() { + this.m_point = new THREE.Vector3(); + this.m_next = null; + } +} diff --git a/src/demo/engine/actvolume/pointset.js b/src/engine/actvolume/pointset.js similarity index 55% rename from src/demo/engine/actvolume/pointset.js rename to src/engine/actvolume/pointset.js index 909a1ee7..d70d39ec 100644 --- a/src/demo/engine/actvolume/pointset.js +++ b/src/engine/actvolume/pointset.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Simple point set with voxelization -* @module lib/scripts/actvolume/pointset -*/ + * Simple point set with voxelization + * @module lib/scripts/actvolume/pointset + */ // absolute imports // import TetrahedronGenerator from 'tetra'; @@ -29,25 +15,25 @@ under the License. import PointLink from './pointlink'; const PSET_NUM_VOXELS = 16; -const PSET_NUM_LINKS = (PSET_NUM_VOXELS * PSET_NUM_VOXELS * PSET_NUM_VOXELS); +const PSET_NUM_LINKS = PSET_NUM_VOXELS * PSET_NUM_VOXELS * PSET_NUM_VOXELS; /** -* Class PointSet define set of 3d points -* @class PointSet -*/ + * Class PointSet define set of 3d points + * @class PointSet + */ export default class PointSet { /** - * Init all internal data - * @constructs PointSet - */ + * Init all internal data + * @constructs PointSet + */ constructor(numPoints) { this.create(numPoints); } /** - * create points set, not initialized - * @param {number} numPoints Number of points in set estimated - */ + * create points set, not initialized + * @param {number} numPoints Number of points in set estimated + */ create(numPoints) { this.m_numPoints = 0; this.m_numAllocatedPoints = numPoints; @@ -79,11 +65,11 @@ export default class PointSet { } /** - * Add point to set - * @param {number} x coordinate x - * @param {number} y coordinate y - * @param {number} z coordinate z - */ + * Add point to set + * @param {number} x coordinate x + * @param {number} y coordinate y + * @param {number} z coordinate z + */ addPoint(x, y, z) { const iSlow = this.findPointSlow(x, y, z); // check if exist @@ -102,5 +88,4 @@ export default class PointSet { this.m_numPoints++; return index; } // addPoint - } diff --git a/src/demo/engine/actvolume/setvolume.js b/src/engine/actvolume/setvolume.js similarity index 90% rename from src/demo/engine/actvolume/setvolume.js rename to src/engine/actvolume/setvolume.js index 08e2f209..26089b0f 100644 --- a/src/demo/engine/actvolume/setvolume.js +++ b/src/engine/actvolume/setvolume.js @@ -1,3 +1,7 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 3D volume processing engine: blur, contrast filter @@ -45,7 +49,7 @@ export default class VolumeFilter3d { const yVolOff = yVol * this.xDim; for (let x = 0; x < this.xDim; x++) { const xVol = x; - const offSrc = (xVol + yVolOff + zVolOff); + const offSrc = xVol + yVolOff + zVolOff; let valInt = this.arrPixels[offSrc + 0]; const offDst = offSrc; if (this.zDim > 5 && (z === 0 || z === this.zDim - 1)) { @@ -78,10 +82,10 @@ export default class VolumeFilter3d { // Fill initial rgba array for (let yTile = 0; yTile < this.zDimSqrt; yTile++) { - const yTileOff = (yTile * this.yDim) * this.xTex; + const yTileOff = yTile * this.yDim * this.xTex; for (let xTile = 0; xTile < this.zDimSqrt; xTile++) { const xTileOff = xTile * this.xDim; - const zVol = xTile + (yTile * this.zDimSqrt); + const zVol = xTile + yTile * this.zDimSqrt; if (zVol >= this.zDim) { break; } @@ -95,7 +99,7 @@ export default class VolumeFilter3d { const offSrc = (xVol + yVolOff + zVolOff) * BID; const valInt = this.arrPixels[offSrc + 0]; const valRoi = this.arrPixels[offSrc + OFF3]; - const offDst = yTileOff + xTileOff + (y * this.xTex) + x; + const offDst = yTileOff + xTileOff + y * this.xTex + x; this.bufferR[offDst + OFF0] = valRoi; this.bufferTextureCPU[BID * offDst + OFF0] = valInt; this.bufferTextureCPU[BID * offDst + OFF1] = valInt; @@ -104,7 +108,6 @@ export default class VolumeFilter3d { // 255.0 * zVol * (x + y) / ( this.zDimSqrt * this.zDimSqrt * (this.xDim + this.yDim)); this.bufferTextureCPU[BID * offDst + OFF3] = valInt; this.bufferRoi[offDst + OFF0] = valRoi; - } } } @@ -156,9 +159,9 @@ export default class VolumeFilter3d { if (this.isWebGL2 === 0) { const yTile = Math.floor(mainZ / this.zDimSqrt); const xTile = mainZ - this.zDimSqrt * yTile; - const yTileOff = (yTile * this.yDim) * this.xTex; + const yTileOff = yTile * this.yDim * this.xTex; const xTileOff = xTile * this.xDim; - return yTileOff + (mainY * this.xTex) + xTileOff + mainX; + return yTileOff + mainY * this.xTex + xTileOff + mainX; } else { return mainX + mainY * this.xTex + mainZ * this.xTex * this.yTex; } @@ -170,16 +173,16 @@ export default class VolumeFilter3d { if (this.isWebGL2 === 0) { const yTile = Math.floor(pointZ / this.zDimSqrt); const xTile = pointZ - this.zDimSqrt * yTile; - const yTileOff = (yTile * this.yDim) * this.xTex; + const yTileOff = yTile * this.yDim * this.xTex; const xTileOff = xTile * this.xDim; - offDst = yTileOff + (pointY * this.xTex) + xTileOff + pointX; + offDst = yTileOff + pointY * this.xTex + xTileOff + pointX; } else { offDst = pointX + pointY * this.xDim + pointZ * this.xDim * this.yDim; } let intensityPoint = this.bufferTextureCPU[offDst]; - if ((this.bufferMask[offDst] === 0) && (!undoFlag)) { + if (this.bufferMask[offDst] === 0 && !undoFlag) { intensityPoint = 0; - } else if ((this.bufferMask[offDst] === full) && (undoFlag)) { + } else if (this.bufferMask[offDst] === full && undoFlag) { intensityPoint = 0; } return intensityPoint; @@ -193,9 +196,9 @@ export default class VolumeFilter3d { if (this.isWebGL2 === 0) { const yTile = Math.floor(mainZ / this.zDimSqrt); const xTile = mainZ - this.zDimSqrt * yTile; - const yTileOff = (yTile * this.yDim) * this.xTex; + const yTileOff = yTile * this.yDim * this.xTex; const xTileOff = xTile * this.xDim; - offDst = yTileOff + (mainY * this.xTex) + xTileOff + mainX; + offDst = yTileOff + mainY * this.xTex + xTileOff + mainX; } else { offDst = mainX + mainY * this.xDim + mainZ * this.xDim * this.xDim; } @@ -329,16 +332,15 @@ export default class VolumeFilter3d { } let rtFormat = THREE.RGBAFormat; if (this.isWebGL2 === 1) { - rtFormat = THREE.RGBAFormat;// can we use ALPHA? + rtFormat = THREE.RGBAFormat; // can we use ALPHA? } - this.bufferTexture = new THREE.WebGLRenderTarget(this.xDim, - this.yDim, { - minFilter: THREE.LinearFilter, - magFilter: THREE.LinearFilter, - format: rtFormat, - type: THREE.UnsignedByteType, - depthBuffer: false, - }); + this.bufferTexture = new THREE.WebGLRenderTarget(this.xDim, this.yDim, { + minFilter: THREE.LinearFilter, + magFilter: THREE.LinearFilter, + format: rtFormat, + type: THREE.UnsignedByteType, + depthBuffer: false, + }); if (this.origVolumeTex) { this.origVolumeTex.dispose(); @@ -355,8 +357,8 @@ export default class VolumeFilter3d { this.origVolumeTex.wrapS = THREE.ClampToEdgeWrapping; this.origVolumeTex.wrapT = THREE.ClampToEdgeWrapping; - this.origVolumeTex.magFilter = THREE.NearestFilter;//THREE.LinearFilter; - this.origVolumeTex.minFilter = THREE.NearestFilter;//THREE.LinearFilter; + this.origVolumeTex.magFilter = THREE.NearestFilter; //THREE.LinearFilter; + this.origVolumeTex.minFilter = THREE.NearestFilter; //THREE.LinearFilter; this.origVolumeTex.needsUpdate = true; if (this.origVolumeTex) { diff --git a/src/demo/engine/actvolume/tetra.js b/src/engine/actvolume/tetra.js similarity index 84% rename from src/demo/engine/actvolume/tetra.js rename to src/engine/actvolume/tetra.js index c3ab261f..672deb25 100644 --- a/src/demo/engine/actvolume/tetra.js +++ b/src/engine/actvolume/tetra.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Tetrahedron generator -* @module lib/scripts/actvolume/tetra -*/ + * Tetrahedron generator + * @module lib/scripts/actvolume/tetra + */ // absolute imports import * as THREE from 'three'; @@ -34,24 +20,24 @@ const NUM_VERTICES_TETRA = 12; const NUM_TRIANGLES_TETRA = 20; /** -* Class TetrahedronGenerator builds good sphere-looked tri mesh -* @class TetrahedronGenerator -*/ + * Class TetrahedronGenerator builds good sphere-looked tri mesh + * @class TetrahedronGenerator + */ export default class TetrahedronGenerator { /** - * Init all internal data - * @constructs TetrahedronGenerator - */ + * Init all internal data + * @constructs TetrahedronGenerator + */ constructor() { this.m_pointSet = null; this.m_triangleSet = null; } /** - * Create triangle mesh structure - * @param {number} vRadiusEllipse Ellipse radius - * @param {number} numSubdividesOfOrigTetra number of sub divides - */ + * Create triangle mesh structure + * @param {number} vRadiusEllipse Ellipse radius + * @param {number} numSubdividesOfOrigTetra number of sub divides + */ create(vRadiusEllipse, numSubdividesOfOrigTetra) { // console.log(`vRadiusEllipse = ${vRadiusEllipse}`); // console.log(`numSubdividesOfOrigTetra = ${numSubdividesOfOrigTetra}`); @@ -61,25 +47,47 @@ export default class TetrahedronGenerator { // { 0.0f, Z, X },{ 0.0f, Z, -X },{ 0.0f, -Z, X },{ 0.0f, -Z, -X }, // { Z, X, 0.0f },{ -Z, X, 0.0f },{ Z, -X, 0.0f },{ -Z, -X, 0.0f } const vdata = [ - -X, 0.0, +Z, - +X, 0.0, +Z, - -X, 0.0, -Z, - +X, 0.0, -Z, - 0.0, +Z, +X, - 0.0, +Z, -X, - 0.0, -Z, +X, - 0.0, -Z, -X, - +Z, +X, 0.0, - -Z, +X, 0.0, - +Z, -X, 0.0, - -Z, -X, 0.0, + -X, + 0.0, + +Z, + +X, + 0.0, + +Z, + -X, + 0.0, + -Z, + +X, + 0.0, + -Z, + 0.0, + +Z, + +X, + 0.0, + +Z, + -X, + 0.0, + -Z, + +X, + 0.0, + -Z, + -X, + +Z, + +X, + 0.0, + -Z, + +X, + 0.0, + +Z, + -X, + 0.0, + -Z, + -X, + 0.0, ]; /*eslint-disable no-magic-numbers*/ const tindices = [ - 0, 4, 1, 0, 9, 4, 9, 5, 4, 4, 5, 8, 4, 8, 1, - 8, 10, 1, 8, 3, 10, 5, 3, 8, 5, 2, 3, 2, 7, 3, - 7, 10, 3, 7, 6, 10, 7, 11, 6, 11, 0, 6, 0, 1, 6, - 6, 1, 10, 9, 0, 11, 9, 11, 2, 9, 2, 5, 7, 2, 11 + 0, 4, 1, 0, 9, 4, 9, 5, 4, 4, 5, 8, 4, 8, 1, 8, 10, 1, 8, 3, 10, 5, 3, 8, 5, 2, 3, 2, 7, 3, 7, 10, 3, 7, 6, 10, 7, 11, 6, 11, 0, 6, 0, + 1, 6, 6, 1, 10, 9, 0, 11, 9, 11, 2, 9, 2, 5, 7, 2, 11, ]; this.m_pointSet = new PointSet(NUM_VERTICES_TETRA); let i3 = 0; @@ -134,10 +142,10 @@ export default class TetrahedronGenerator { } /** - * Save tetrahedron geometry into given file (PLY type) - * see PLY format description here: - * https://en.wikipedia.org/wiki/PLY_(file_format) - */ + * Save tetrahedron geometry into given file (PLY type) + * see PLY format description here: + * https://en.wikipedia.org/wiki/PLY_(file_format) + */ saveGeoToPlyFile(fileName) { let strOut = 'ply\nformat ascii 1.0\ncomment tetrahedron mesh\n'; const numVertices = this.m_pointSet.m_numPoints; @@ -191,8 +199,8 @@ export default class TetrahedronGenerator { } // saveGeoToPlyFile /** - * Save tetrahedron geometry into given file (OBJ type) - */ + * Save tetrahedron geometry into given file (OBJ type) + */ saveGeoToObjFile(fileName) { let strOut = '# Tetrahedron test geo\n'; const numVertices = this.m_pointSet.m_numPoints; @@ -248,9 +256,9 @@ export default class TetrahedronGenerator { } // saveGeoToObjFile /* - * Sub divide source mesh - * @param {number} numSubdividesOfOrigTetra number of sub divides - */ + * Sub divide source mesh + * @param {number} numSubdividesOfOrigTetra number of sub divides + */ subDivideMesh(numSubdividesOfOrigTetra) { if (numSubdividesOfOrigTetra === 0) { return 1; @@ -346,5 +354,4 @@ export default class TetrahedronGenerator { } return 1; } - } diff --git a/src/engine/actvolume/triangleset.js b/src/engine/actvolume/triangleset.js new file mode 100644 index 00000000..61712154 --- /dev/null +++ b/src/engine/actvolume/triangleset.js @@ -0,0 +1,62 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Triangle set + * @module lib/scripts/actvolume/triangleset + */ + +// absolute imports +// import TetrahedronGenerator from 'tetra'; + +// relative imports +import TriangleIndices from './triindices'; + +/** + * Class TriangleSet define set of trinagles + * @class TriangleSet + */ +export default class TriangleSet { + /** + * Init all internal data + * @constructs TriangleSet + */ + constructor(numTriangles) { + this.create(numTriangles); + } // constructor + + create(numTriangles) { + this.m_numTriangles = 0; + this.m_numAllocatedTriangles = numTriangles; + this.m_triangles = new Array(numTriangles); + const STRANGE_VALUE = -1; + for (let i = 0; i < numTriangles; i++) { + this.m_triangles[i] = new TriangleIndices(STRANGE_VALUE, STRANGE_VALUE, STRANGE_VALUE); + } + } // create + + /** + * Get number of triangles + * @return {number} + */ + getNumTriangles() { + return this.m_numTriangles; + } + + /** + * Add triangle to set + * @return 1, if success + */ + addTriangle(ia, ib, ic) { + if (this.m_numTriangles >= this.m_numAllocatedTriangles) { + return -1; + } + this.m_triangles[this.m_numTriangles].m_indices[0] = ia; + this.m_triangles[this.m_numTriangles].m_indices[1] = ib; + this.m_triangles[this.m_numTriangles].m_indices[2] = ic; + this.m_numTriangles++; + return 1; + } +} diff --git a/src/engine/actvolume/trianglesingle.js b/src/engine/actvolume/trianglesingle.js new file mode 100644 index 00000000..7aad0dd4 --- /dev/null +++ b/src/engine/actvolume/trianglesingle.js @@ -0,0 +1,26 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Single triagle + * @module lib/scripts/actvolume/trianglesingle + */ + +// absolute imports +import * as THREE from 'three'; + +// relative imports + +/** + * Class TriangleSingle is one triangle + * @class TriangleSingle + */ +export default class TriangleSingle { + constructor() { + this.va = new THREE.Vector3(); + this.vb = new THREE.Vector3(); + this.vc = new THREE.Vector3(); + } +} diff --git a/src/engine/actvolume/trianglestack.js b/src/engine/actvolume/trianglestack.js new file mode 100644 index 00000000..b9d1611f --- /dev/null +++ b/src/engine/actvolume/trianglestack.js @@ -0,0 +1,88 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Triagle stack + * @module lib/scripts/actvolume/trianglestack + */ + +// relative imports +import TriangleSingle from './trianglesingle'; + +/** + * Class TriangleStack builds stack for triangles + * @class TriangleStack + */ +export default class TriangleStack { + constructor() { + this.m_numAllocated = 0; + this.m_numStacked = 0; + this.m_stack = null; + } + + /* + * Create triangle stack + * @param {number} depthLevel number of triangles in stack + */ + create(depthLevel) { + const ESTIM = 20; + const MUL_INCREMENT = 4; + let numTiEstimate = ESTIM; + for (let i = 0; i < depthLevel; i++) { + numTiEstimate *= MUL_INCREMENT; + } + this.m_numAllocated = numTiEstimate; + this.m_stack = new Array(this.m_numAllocated); + for (let i = 0; i < this.m_numAllocated; i++) { + this.m_stack[i] = new TriangleSingle(); + } + this.m_numStacked = 0; + } // create + + /* + * Get stack depth + * @return {number} number of triangles in stack + */ + getStackDepth() { + return this.m_numStacked; + } + + /* + * Chech is stack empty + * @return {boolean} true, if empty + */ + isEmpty() { + return this.m_numStacked === 0; + } + + /* + * Push triangle onto stack + * @param {object} va triangle a (THREE.Vector3) + * @param {object} vb triangle b (THREE.Vector3) + * @param {object} vc triangle c (THREE.Vector3) + */ + push(va, vb, vc) { + if (this.m_numStacked >= this.m_numAllocated) { + return -1; + } + this.m_stack[this.m_numStacked].va = va; + this.m_stack[this.m_numStacked].vb = vb; + this.m_stack[this.m_numStacked].vc = vc; + this.m_numStacked++; + return 1; + } // push triangle + + /* + * Pop triangle from stack + * @return {object} TriangleSingle object + */ + pop() { + if (this.m_numStacked <= 0) { + return null; + } + this.m_numStacked--; + return this.m_stack[this.m_numStacked]; + } // pop triangle +} diff --git a/src/engine/actvolume/triindices.js b/src/engine/actvolume/triindices.js new file mode 100644 index 00000000..9346f08e --- /dev/null +++ b/src/engine/actvolume/triindices.js @@ -0,0 +1,33 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Triangle indices + * @module lib/scripts/actvolume/triindices + */ + +// absolute imports +// import TetrahedronGenerator from 'tetra'; + +// relative imports +// import TriangleIndices from './triindices'; + +/** + * Class TriangleIndices define 3 indices of triangle + * @class TriangleIndices + */ +export default class TriangleIndices { + /** + * Init all internal data + * @constructs TriangleIndices + */ + constructor(ia, ib, ic) { + const NUM_VERTS_IN_TRIANGLE = 3; + this.m_indices = new Int32Array(NUM_VERTS_IN_TRIANGLE); + this.m_indices[0] = ia; + this.m_indices[1] = ib; + this.m_indices[2] = ic; + } +} // TriangleIndices diff --git a/src/demo/engine/actvolume/volclip.js b/src/engine/actvolume/volclip.js similarity index 77% rename from src/demo/engine/actvolume/volclip.js rename to src/engine/actvolume/volclip.js index 4f24829a..738237ce 100644 --- a/src/demo/engine/actvolume/volclip.js +++ b/src/engine/actvolume/volclip.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* 3d volume clipping -* @module lib/scripts/actvolume/volclip -*/ + * 3d volume clipping + * @module lib/scripts/actvolume/volclip + */ // absolute imports import * as THREE from 'three'; @@ -30,9 +16,9 @@ import ActiveVolume from './actvol'; // const const NUM_VOXELS_DEG = 5; -const NUM_VOXELS_SIDE = (1 << NUM_VOXELS_DEG); -const NUM_VOXELS_MASK = (NUM_VOXELS_SIDE - 1); -const NUM_VOXELS_ALL = (NUM_VOXELS_SIDE * NUM_VOXELS_SIDE * NUM_VOXELS_SIDE); +const NUM_VOXELS_SIDE = 1 << NUM_VOXELS_DEG; +const NUM_VOXELS_MASK = NUM_VOXELS_SIDE - 1; +const NUM_VOXELS_ALL = NUM_VOXELS_SIDE * NUM_VOXELS_SIDE * NUM_VOXELS_SIDE; const MAX_INTERSECTIONS_PER_LINE = 16; @@ -47,14 +33,13 @@ function compareV3fOnX(va, vb) { } /** -* Class VolumeClipper perform volume clip by non convex geo -* @class VolumeClipper -*/ + * Class VolumeClipper perform volume clip by non convex geo + * @class VolumeClipper + */ export default class VolumeClipper { - static addIntersectionToArray(vaIntersections, numIntersections, maxIntersections, vIntPoint) { let found = false; - for (let i = 0; (i < numIntersections) && !found; i++) { + for (let i = 0; i < numIntersections && !found; i++) { const dist = vIntPoint.distanceToSquared(vaIntersections[i]); const MIN_VAL = 1.0e-12; if (dist * dist < MIN_VAL) { @@ -84,7 +69,7 @@ export default class VolumeClipper { // int *voxList = triVoxelList + numTrianglesInVoxelApprox * voxInd; let i; let isFound = false; - for (i = 0; (i < numTrianglesInVoxelApprox) && !isFound; i++) { + for (i = 0; i < numTrianglesInVoxelApprox && !isFound; i++) { if (triVoxelList[i + offList] === -1) { break; } @@ -104,12 +89,11 @@ export default class VolumeClipper { } /** - * - * Find intersection of ray (looking in x direction) and triangle - * return null, if no intersection. or Vector3 object - */ + * + * Find intersection of ray (looking in x direction) and triangle + * return null, if no intersection. or Vector3 object + */ static getIntersectXRayTri(vRayStart, va, vb, vc) { - // get triangle normal const vAB = new THREE.Vector3(); const vBC = new THREE.Vector3(); @@ -146,16 +130,22 @@ export default class VolumeClipper { const p2 = new THREE.Vector3(0.0, 0.0, 0.0); const p = new THREE.Vector3(0.0, 0.0, 0.0); - p1.set((vb.x - va.x) * xAxis.x + (vb.y - va.y) * xAxis.y + (vb.z - va.z) * xAxis.z, + p1.set( + (vb.x - va.x) * xAxis.x + (vb.y - va.y) * xAxis.y + (vb.z - va.z) * xAxis.z, (vb.x - va.x) * yAxis.x + (vb.y - va.y) * yAxis.y + (vb.z - va.z) * yAxis.z, - 0.0); - p2.set((vc.x - va.x) * xAxis.x + (vc.y - va.y) * xAxis.y + (vc.z - va.z) * xAxis.z, + 0.0 + ); + p2.set( + (vc.x - va.x) * xAxis.x + (vc.y - va.y) * xAxis.y + (vc.z - va.z) * xAxis.z, (vc.x - va.x) * yAxis.x + (vc.y - va.y) * yAxis.y + (vc.z - va.z) * yAxis.z, - 0.0); + 0.0 + ); - p.set((vInter.x - va.x) * xAxis.x + (vInter.y - va.y) * xAxis.y + (vInter.z - va.z) * xAxis.z, + p.set( + (vInter.x - va.x) * xAxis.x + (vInter.y - va.y) * xAxis.y + (vInter.z - va.z) * xAxis.z, (vInter.x - va.x) * yAxis.x + (vInter.y - va.y) * yAxis.y + (vInter.z - va.z) * yAxis.z, - 0.0); + 0.0 + ); // check point s in inside triangle a, b, c // @@ -168,22 +158,22 @@ export default class VolumeClipper { const beta = koefArea * (p0.x * p1.y - p0.y * p1.x + (p0.y - p1.y) * p.x + (p1.x - p0.x) * p.y); const gama = 1.0 - alfa - beta; const TOO_SMALL = 1.0e-7; - if ((alfa > -TOO_SMALL) && (beta > -TOO_SMALL) && (gama > -TOO_SMALL)) { + if (alfa > -TOO_SMALL && beta > -TOO_SMALL && gama > -TOO_SMALL) { return vInter; } return null; } /** - * Clip volumetric texture with given non-convex geometry (triangle mesh) - * @param {array} volTexSrc source volume texture - * @param {number} xDim Dimension on x - * @param {number} yDim Dimension on y - * @param {number} zDim Dimension on z - * @param {array} volTexDst destination volumetric texture (output) - * @param {object} geo geometry, used for clipping - * @param {number} CreateType How to clip: remove skull or create brain mask - */ + * Clip volumetric texture with given non-convex geometry (triangle mesh) + * @param {array} volTexSrc source volume texture + * @param {number} xDim Dimension on x + * @param {number} yDim Dimension on y + * @param {number} zDim Dimension on z + * @param {array} volTexDst destination volumetric texture (output) + * @param {object} geo geometry, used for clipping + * @param {number} CreateType How to clip: remove skull or create brain mask + */ static clipVolumeByNonConvexGeo(volTexSrc, xDim, yDim, zDim, volTexDst, geo, createType) { let i, i4; @@ -214,8 +204,8 @@ export default class VolumeClipper { for (i = 0, i4 = 0; i < numVertices; i++, i4 += NUM_COMPS_IN_VERTEX) { const v = new THREE.Vector3(vertices[i4 + OFF_0], vertices[i4 + OFF_1], vertices[i4 + OFF_2]); const dist = v.distanceTo(vCentroid); - radiusMin = (dist < radiusMin) ? dist : radiusMin; - radiusMax = (dist > radiusMax) ? dist : radiusMax; + radiusMin = dist < radiusMin ? dist : radiusMin; + radiusMax = dist > radiusMax ? dist : radiusMax; } // console.log(`clipVolumeByNonConvexGeo. rad min, max = ${radiusMin}, ${radiusMax}`); const verts = new Array(numVertices); @@ -246,7 +236,7 @@ export default class VolumeClipper { // assert(ix < NUM_VOXELS_SIDE); // assert(iy < NUM_VOXELS_SIDE); // assert(iz < NUM_VOXELS_SIDE); - vertVoxels[i] = ix + (iy * NUM_VOXELS_SIDE) + (iz * NUM_VOXELS_SIDE * NUM_VOXELS_SIDE); + vertVoxels[i] = ix + iy * NUM_VOXELS_SIDE + iz * NUM_VOXELS_SIDE * NUM_VOXELS_SIDE; } let i3; @@ -260,9 +250,12 @@ export default class VolumeClipper { indTri[OFF_0] = indices[i3 + OFF_0]; indTri[OFF_1] = indices[i3 + OFF_1]; indTri[OFF_2] = indices[i3 + OFF_2]; - const va = new THREE.Vector3(); va.set(verts[indTri[OFF_0]].x, verts[indTri[OFF_0]].y, verts[indTri[OFF_0]].z); - const vb = new THREE.Vector3(); vb.set(verts[indTri[OFF_1]].x, verts[indTri[OFF_1]].y, verts[indTri[OFF_1]].z); - const vc = new THREE.Vector3(); vc.set(verts[indTri[OFF_2]].x, verts[indTri[OFF_2]].y, verts[indTri[OFF_2]].z); + const va = new THREE.Vector3(); + va.set(verts[indTri[OFF_0]].x, verts[indTri[OFF_0]].y, verts[indTri[OFF_0]].z); + const vb = new THREE.Vector3(); + vb.set(verts[indTri[OFF_1]].x, verts[indTri[OFF_1]].y, verts[indTri[OFF_1]].z); + const vc = new THREE.Vector3(); + vc.set(verts[indTri[OFF_2]].x, verts[indTri[OFF_2]].y, verts[indTri[OFF_2]].z); let dist; dist = va.distanceTo(vb); distAve += dist; @@ -270,7 +263,7 @@ export default class VolumeClipper { distAve += dist; } const TWO = 2.0; - distAve /= (TWO * NUM_TRIS_FOR_APPROX_LEN); + distAve /= TWO * NUM_TRIS_FOR_APPROX_LEN; const xVoxLen = Math.floor(0 + xDim / NUM_VOXELS_SIDE); const yVoxLen = Math.floor(0 + yDim / NUM_VOXELS_SIDE); const zVoxLen = Math.floor(0 + zDim / NUM_VOXELS_SIDE); @@ -309,16 +302,22 @@ export default class VolumeClipper { voxTri[OFF_0] = new THREE.Vector3(); voxTri[OFF_1] = new THREE.Vector3(); voxTri[OFF_2] = new THREE.Vector3(); - voxTri[0].x = voxTriInd[0] & NUM_VOXELS_MASK; voxTriInd[0] >>= NUM_VOXELS_DEG; - voxTri[0].y = voxTriInd[0] & NUM_VOXELS_MASK; voxTriInd[0] >>= NUM_VOXELS_DEG; + voxTri[0].x = voxTriInd[0] & NUM_VOXELS_MASK; + voxTriInd[0] >>= NUM_VOXELS_DEG; + voxTri[0].y = voxTriInd[0] & NUM_VOXELS_MASK; + voxTriInd[0] >>= NUM_VOXELS_DEG; voxTri[0].z = voxTriInd[0] & NUM_VOXELS_MASK; - voxTri[1].x = voxTriInd[1] & NUM_VOXELS_MASK; voxTriInd[1] >>= NUM_VOXELS_DEG; - voxTri[1].y = voxTriInd[1] & NUM_VOXELS_MASK; voxTriInd[1] >>= NUM_VOXELS_DEG; + voxTri[1].x = voxTriInd[1] & NUM_VOXELS_MASK; + voxTriInd[1] >>= NUM_VOXELS_DEG; + voxTri[1].y = voxTriInd[1] & NUM_VOXELS_MASK; + voxTriInd[1] >>= NUM_VOXELS_DEG; voxTri[1].z = voxTriInd[1] & NUM_VOXELS_MASK; - voxTri[2].x = voxTriInd[2] & NUM_VOXELS_MASK; voxTriInd[2] >>= NUM_VOXELS_DEG; - voxTri[2].y = voxTriInd[2] & NUM_VOXELS_MASK; voxTriInd[2] >>= NUM_VOXELS_DEG; + voxTri[2].x = voxTriInd[2] & NUM_VOXELS_MASK; + voxTriInd[2] >>= NUM_VOXELS_DEG; + voxTri[2].y = voxTriInd[2] & NUM_VOXELS_MASK; + voxTriInd[2] >>= NUM_VOXELS_DEG; voxTri[2].z = voxTriInd[2] & NUM_VOXELS_MASK; const voxMin = new THREE.Vector3(); @@ -326,23 +325,23 @@ export default class VolumeClipper { voxMin.set(voxTri[0].x, voxTri[0].y, voxTri[0].z); voxMax.set(voxTri[0].x, voxTri[0].y, voxTri[0].z); - voxMin.x = (voxTri[1].x < voxMin.x) ? voxTri[1].x : voxMin.x; - voxMin.x = (voxTri[2].x < voxMin.x) ? voxTri[2].x : voxMin.x; + voxMin.x = voxTri[1].x < voxMin.x ? voxTri[1].x : voxMin.x; + voxMin.x = voxTri[2].x < voxMin.x ? voxTri[2].x : voxMin.x; - voxMin.y = (voxTri[1].y < voxMin.y) ? voxTri[1].y : voxMin.y; - voxMin.y = (voxTri[2].y < voxMin.y) ? voxTri[2].y : voxMin.y; + voxMin.y = voxTri[1].y < voxMin.y ? voxTri[1].y : voxMin.y; + voxMin.y = voxTri[2].y < voxMin.y ? voxTri[2].y : voxMin.y; - voxMin.z = (voxTri[1].z < voxMin.z) ? voxTri[1].z : voxMin.z; - voxMin.z = (voxTri[2].z < voxMin.z) ? voxTri[2].z : voxMin.z; + voxMin.z = voxTri[1].z < voxMin.z ? voxTri[1].z : voxMin.z; + voxMin.z = voxTri[2].z < voxMin.z ? voxTri[2].z : voxMin.z; - voxMax.x = (voxTri[1].x > voxMax.x) ? voxTri[1].x : voxMax.x; - voxMax.x = (voxTri[2].x > voxMax.x) ? voxTri[2].x : voxMax.x; + voxMax.x = voxTri[1].x > voxMax.x ? voxTri[1].x : voxMax.x; + voxMax.x = voxTri[2].x > voxMax.x ? voxTri[2].x : voxMax.x; - voxMax.y = (voxTri[1].y > voxMax.y) ? voxTri[1].y : voxMax.y; - voxMax.y = (voxTri[2].y > voxMax.y) ? voxTri[2].y : voxMax.y; + voxMax.y = voxTri[1].y > voxMax.y ? voxTri[1].y : voxMax.y; + voxMax.y = voxTri[2].y > voxMax.y ? voxTri[2].y : voxMax.y; - voxMax.z = (voxTri[1].z > voxMax.z) ? voxTri[1].z : voxMax.z; - voxMax.z = (voxTri[2].z > voxMax.z) ? voxTri[2].z : voxMax.z; + voxMax.z = voxTri[1].z > voxMax.z ? voxTri[1].z : voxMax.z; + voxMax.z = voxTri[2].z > voxMax.z ? voxTri[2].z : voxMax.z; // convert voxMin (Vector3) into v3d (int components) const vMinX = Math.floor(voxMin.x); @@ -357,10 +356,10 @@ export default class VolumeClipper { for (iy = vMinY; iy <= vMaxY; iy++) { for (ix = vMinX; ix <= vMaxX; ix++) { VolumeClipper.addTriangleToVoxel(triVoxelList, numTrianglesInVoxelApprox, NUM_VOXELS_SIDE, ix, iy, iz, i); - } // for (ix) - } // for (iy) - } // for (iz) - } // for (i) all triangles + } // for (ix) + } // for (iy) + } // for (iz) + } // for (i) all triangles const vaIntersections = new Array(MAX_INTERSECTIONS_PER_LINE); for (i = 0; i < MAX_INTERSECTIONS_PER_LINE; i++) { @@ -401,7 +400,8 @@ export default class VolumeClipper { const dz = z - vCentroid.z; const det = radiusMin * radiusMin - dy * dy - dz * dz; - let ixMin = -1, ixMax = -1; + let ixMin = -1, + ixMax = -1; if (det < 0.0) { // completely out of small circle @@ -428,7 +428,7 @@ export default class VolumeClipper { if (USE_VOXELS_FOR_TRIANGLE_INTERSECTION_SEARCH) { for (let xInd = 0; xInd < NUM_VOXELS_SIDE; xInd++) { - if ((xInd >= ixMin) && (xInd <= ixMax)) { + if (xInd >= ixMin && xInd <= ixMax) { continue; } @@ -456,16 +456,18 @@ export default class VolumeClipper { const vIntersection = VolumeClipper.getIntersectXRayTri(vRayStart, va, vb, vc); if (vIntersection !== null) { const numIntersectsBefore = numIntersections; - numIntersections = VolumeClipper.addIntersectionToArray(vaIntersections, numIntersectsBefore, - MAX_INTERSECTIONS_PER_LINE, vIntersection); + numIntersections = VolumeClipper.addIntersectionToArray( + vaIntersections, + numIntersectsBefore, + MAX_INTERSECTIONS_PER_LINE, + vIntersection + ); if (numIntersections <= 0) { console.log('addIntersectionToArray: array overflow !'); console.log(`!!!! cur line is y = ${y}, z = ${z}`); } - } } // for (j) all triangles - } // for (xInd) all voxels on x // if (USE_VOXELS_FOR_TRIANGLE_INTERSECTION_SEARCH) } else { @@ -484,8 +486,12 @@ export default class VolumeClipper { const vIntersection = VolumeClipper.getIntersectXRayTri(vRayStart, va, vb, vc); if (vIntersection !== null) { const numIntersectsBefore = numIntersections; - numIntersections = VolumeClipper.addIntersectionToArray(vaIntersections, numIntersectsBefore, - MAX_INTERSECTIONS_PER_LINE, vIntersection); + numIntersections = VolumeClipper.addIntersectionToArray( + vaIntersections, + numIntersectsBefore, + MAX_INTERSECTIONS_PER_LINE, + vIntersection + ); } } } @@ -514,7 +520,7 @@ export default class VolumeClipper { const VAL_255 = 255; let indInter = 0; let isVis = 0; - for (x = 0; (x < xDim) && (indInter < numIntersections); x++) { + for (x = 0; x < xDim && indInter < numIntersections; x++) { // change visibility of hor line on the intersection points while (x === Math.floor(vaIntsSlice[indInter].x)) { isVis = VAL_255 - isVis; @@ -534,17 +540,15 @@ export default class VolumeClipper { if (createType === ActiveVolume.CREATE_MASK) { for (; x < xDim; x++) { pixelsDst[x + yzOff] = isVis; - } // for (x) + } // for (x) } else if (createType === ActiveVolume.REMOVE_SKULL) { for (; x < xDim; x++) { pixelsDst[x + yzOff] = pixelsSrc[x + yzOff] & isVis; - } // for (x) + } // for (x) } // if build mask - - } // if (have sorted array of intersections - - } // for (y) - } // for (z) + } // if (have sorted array of intersections + } // for (y) + } // for (z) return 1; } // clipVolumeByNonConvexGeo } diff --git a/src/demo/engine/actvolume/volgen.js b/src/engine/actvolume/volgen.js similarity index 67% rename from src/demo/engine/actvolume/volgen.js rename to src/engine/actvolume/volgen.js index 7c31c21f..5d5f59df 100644 --- a/src/demo/engine/actvolume/volgen.js +++ b/src/engine/actvolume/volgen.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* 3d volume generate from 3d polygon mesh -* @module lib/scripts/actvolume/volgen -*/ + * 3d volume generate from 3d polygon mesh + * @module lib/scripts/actvolume/volgen + */ // absolute imports import * as THREE from 'three'; @@ -29,14 +15,13 @@ import * as THREE from 'three'; import FloodFillTool from './floodfill'; /** -* Class VolumeGenerator create 3d volumes from polygonal triangle mesh -* @class VolumeGenerator -*/ + * Class VolumeGenerator create 3d volumes from polygonal triangle mesh + * @class VolumeGenerator + */ export default class VolumeGenerator { - /** - * verts - array of THREE.Vector3 - */ + * verts - array of THREE.Vector3 + */ static renderTriangle(xDim, yDim, zDim, pixels, verts) { const xyDim = xDim * yDim; @@ -61,8 +46,8 @@ export default class VolumeGenerator { const dist02 = Math.sqrt(v02.x * v02.x + v02.y * v02.y + v02.z * v02.z); const dist12 = Math.sqrt(v12.x * v12.x + v12.y * v12.y + v12.z * v12.z); - let distMax = (dist01 > dist02) ? dist01 : dist02; - distMax = (dist12 > distMax) ? dist12 : distMax; + let distMax = dist01 > dist02 ? dist01 : dist02; + distMax = dist12 > distMax ? dist12 : distMax; const ITERS_ESTIMATE = 1.2; const numIters = Math.floor(distMax * ITERS_ESTIMATE); @@ -103,8 +88,8 @@ export default class VolumeGenerator { let y = Math.floor(v.y); let z = Math.floor(v.z); - if ((x >= 0) && (y >= 0) && (z >= 0) && (x < xDim) && (y < yDim) && (z < zDim)) { - const off = x + (y * xDim) + (z * xyDim); + if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) { + const off = x + y * xDim + z * xyDim; pixels[off] = VIS; } @@ -112,47 +97,47 @@ export default class VolumeGenerator { x = Math.floor(v.x) + 1; y = Math.floor(v.y) + 0; z = Math.floor(v.z) + 0; - if ((x >= 0) && (y >= 0) && (z >= 0) && (x < xDim) && (y < yDim) && (z < zDim)) { - const off = x + (y * xDim) + (z * xyDim); + if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) { + const off = x + y * xDim + z * xyDim; pixels[off] = VIS; } x = Math.floor(v.x) + 0; y = Math.floor(v.y) + 1; z = Math.floor(v.z) + 0; - if ((x >= 0) && (y >= 0) && (z >= 0) && (x < xDim) && (y < yDim) && (z < zDim)) { - const off = x + (y * xDim) + (z * xyDim); + if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) { + const off = x + y * xDim + z * xyDim; pixels[off] = VIS; } x = Math.floor(v.x) + 0; y = Math.floor(v.y) + 0; z = Math.floor(v.z) + 1; - if ((x >= 0) && (y >= 0) && (z >= 0) && (x < xDim) && (y < yDim) && (z < zDim)) { - const off = x + (y * xDim) + (z * xyDim); + if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) { + const off = x + y * xDim + z * xyDim; pixels[off] = VIS; } x = Math.floor(v.x) - 1; y = Math.floor(v.y) + 0; z = Math.floor(v.z) + 0; - if ((x >= 0) && (y >= 0) && (z >= 0) && (x < xDim) && (y < yDim) && (z < zDim)) { - const off = x + (y * xDim) + (z * xyDim); + if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) { + const off = x + y * xDim + z * xyDim; pixels[off] = VIS; } x = Math.floor(v.x) + 0; y = Math.floor(v.y) - 1; z = Math.floor(v.z) + 0; - if ((x >= 0) && (y >= 0) && (z >= 0) && (x < xDim) && (y < yDim) && (z < zDim)) { - const off = x + (y * xDim) + (z * xyDim); + if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) { + const off = x + y * xDim + z * xyDim; pixels[off] = VIS; } x = Math.floor(v.x) + 0; y = Math.floor(v.y) + 0; z = Math.floor(v.z) - 1; - if ((x >= 0) && (y >= 0) && (z >= 0) && (x < xDim) && (y < yDim) && (z < zDim)) { - const off = x + (y * xDim) + (z * xyDim); + if (x >= 0 && y >= 0 && z >= 0 && x < xDim && y < yDim && z < zDim) { + const off = x + y * xDim + z * xyDim; pixels[off] = VIS; } // next v @@ -172,9 +157,9 @@ export default class VolumeGenerator { } /** - * - * return true, if success - */ + * + * return true, if success + */ static generateFromFaces(xDim, yDim, zDim, pixelsDst, geo, withFillInside) { const numTriangles = geo.getNumTriangles(); const indices = geo.getIndices(); // Uint32 array @@ -203,17 +188,17 @@ export default class VolumeGenerator { const ia = indices[i3 + OFF_0]; const ib = indices[i3 + OFF_1]; const ic = indices[i3 + OFF_2]; - vs[OFF_0].x = vertices[(ia * NUM_COMP_VERTEX) + OFF_0]; - vs[OFF_0].y = vertices[(ia * NUM_COMP_VERTEX) + OFF_1]; - vs[OFF_0].z = vertices[(ia * NUM_COMP_VERTEX) + OFF_2]; + vs[OFF_0].x = vertices[ia * NUM_COMP_VERTEX + OFF_0]; + vs[OFF_0].y = vertices[ia * NUM_COMP_VERTEX + OFF_1]; + vs[OFF_0].z = vertices[ia * NUM_COMP_VERTEX + OFF_2]; - vs[OFF_1].x = vertices[(ib * NUM_COMP_VERTEX) + OFF_0]; - vs[OFF_1].y = vertices[(ib * NUM_COMP_VERTEX) + OFF_1]; - vs[OFF_1].z = vertices[(ib * NUM_COMP_VERTEX) + OFF_2]; + vs[OFF_1].x = vertices[ib * NUM_COMP_VERTEX + OFF_0]; + vs[OFF_1].y = vertices[ib * NUM_COMP_VERTEX + OFF_1]; + vs[OFF_1].z = vertices[ib * NUM_COMP_VERTEX + OFF_2]; - vs[OFF_2].x = vertices[(ic * NUM_COMP_VERTEX) + OFF_0]; - vs[OFF_2].y = vertices[(ic * NUM_COMP_VERTEX) + OFF_1]; - vs[OFF_2].z = vertices[(ic * NUM_COMP_VERTEX) + OFF_2]; + vs[OFF_2].x = vertices[ic * NUM_COMP_VERTEX + OFF_0]; + vs[OFF_2].y = vertices[ic * NUM_COMP_VERTEX + OFF_1]; + vs[OFF_2].z = vertices[ic * NUM_COMP_VERTEX + OFF_2]; VolumeGenerator.renderTriangle(xDim, yDim, zDim, pixelsDst, vs); } // for (i) all triangles @@ -245,8 +230,8 @@ export default class VolumeGenerator { const okFill = fillTool.floodFill3d(xDim, yDim, zDim, pixelsFill, vSeed); console.log(`VolGen. Result fill = ${okFill}. numDraws = ${fillTool.m_numFilled3d}`); const VIS = 255; - const OFF_CORNER = 1 + (1 * xDim) + (1 * xDim * yDim); - if ((okFill === 1) && (pixelsFill[OFF_CORNER] !== VIS)) { + const OFF_CORNER = 1 + 1 * xDim + 1 * xDim * yDim; + if (okFill === 1 && pixelsFill[OFF_CORNER] !== VIS) { foundGoodFill = true; break; } @@ -265,4 +250,3 @@ export default class VolumeGenerator { return true; } } - diff --git a/src/demo/engine/ambientTexture.js b/src/engine/ambientTexture.js similarity index 91% rename from src/demo/engine/ambientTexture.js rename to src/engine/ambientTexture.js index ade94ec2..f94b6de1 100644 --- a/src/demo/engine/ambientTexture.js +++ b/src/engine/ambientTexture.js @@ -1,3 +1,8 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + import MaterialAO from './gfx/matAO'; import TetrahedronGenerator from './actvolume/tetra'; import * as THREE from 'three'; @@ -56,14 +61,13 @@ export default class AmbientTexture { this.xDimAO = this.xDim; this.yDimAO = this.yDim; this.zDimAO = this.zDim; - this.bufferTextureAO = new THREE.WebGLRenderTarget(this.xDimAO, - this.yDimAO, { - minFilter: THREE.LinearFilter, - magFilter: THREE.LinearFilter, - format: THREE.RGBAFormat, - type: THREE.UnsignedByteType, - depthBuffer: false, - }); + this.bufferTextureAO = new THREE.WebGLRenderTarget(this.xDimAO, this.yDimAO, { + minFilter: THREE.LinearFilter, + magFilter: THREE.LinearFilter, + format: THREE.RGBAFormat, + type: THREE.UnsignedByteType, + depthBuffer: false, + }); this.ambientVolumeTexCPU = new Uint8Array(this.xDimAO * this.yDimAO * this.zDimAO); if (this.isWebGL2 === 0) { @@ -106,8 +110,7 @@ export default class AmbientTexture { const zOffs = z * this.xDimAO * this.yDimAO; for (let y = 0; y < this.yDimAO; y++) { for (let x = 0; x < this.xDimAO; x++) { - this.ambientVolumeTexCPU[x + y * this.xDimAO + zOffs] = - frameBuf[VAL_4 * (x + y * this.xDimAO)]; //256.0 * k / this.zDim; + this.ambientVolumeTexCPU[x + y * this.xDimAO + zOffs] = frameBuf[VAL_4 * (x + y * this.xDimAO)]; //256.0 * k / this.zDim; } } } diff --git a/src/demo/engine/gfx/matAO.js b/src/engine/gfx/matAO.js similarity index 72% rename from src/demo/engine/gfx/matAO.js rename to src/engine/gfx/matAO.js index f031601d..7b680cfd 100644 --- a/src/demo/engine/gfx/matAO.js +++ b/src/engine/gfx/matAO.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Blur material, used for rendering of blurred volume slices -* @module lib/scripts/gfx/matblur -*/ + * Blur material, used for rendering of blurred volume slices + * @module lib/scripts/gfx/matblur + */ // ****************************************************************** // imports @@ -34,10 +20,9 @@ import AO_FRAGMENT_SHADER from '../shaders/createAO.frag'; /** Class @class MaterialBlur for volume slice blurring */ export default class MaterialAO { - /** Backface material constructor - * @constructor - */ + * @constructor + */ constructor() { this.m_strShaderVertex = ''; this.m_strShaderFragment = ''; @@ -63,8 +48,8 @@ export default class MaterialAO { } /** Backface material constructor - * @return {object} Three.js material with this shader - */ + * @return {object} Three.js material with this shader + */ create(texture, texelSize, vectorsTex, vectorsSize, isoThreshold, callbackMat) { // Init uniforms this.m_uniforms.texVolume.value = texture; @@ -88,7 +73,7 @@ export default class MaterialAO { uniforms: this.m_uniforms, defines: this.m_defines, vertexShader: this.m_strShaderVertex, - fragmentShader: this.m_strShaderFragment + fragmentShader: this.m_strShaderFragment, }); if (callbackMat) { callbackMat(material); diff --git a/src/demo/engine/gfx/matbackface.js b/src/engine/gfx/matbackface.js similarity index 65% rename from src/demo/engine/gfx/matbackface.js rename to src/engine/gfx/matbackface.js index fd73652a..595b3fcf 100644 --- a/src/demo/engine/gfx/matbackface.js +++ b/src/engine/gfx/matbackface.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Backface material, used for cube backface rendering -* @module lib/scripts/gfx/matbackface -*/ + * Backface material, used for cube backface rendering + * @module lib/scripts/gfx/matbackface + */ // ****************************************************************** // imports @@ -35,16 +21,16 @@ import BACK_FACE_FRAGMENT_SHADER from '../shaders/backface.frag'; /** Class @class MaterialBF for volume backface rendering */ export default class MaterialBF { /** Backface material constructor - * @constructor - */ + * @constructor + */ constructor() { this.m_strShaderVertex = ''; this.m_strShaderFragment = ''; } /** Backface material constructor - * @return {object} Three.js material with this shader - */ + * @return {object} Three.js material with this shader + */ create(callbackMat) { // Init uniforms diff --git a/src/demo/engine/gfx/matblur.js b/src/engine/gfx/matblur.js similarity index 70% rename from src/demo/engine/gfx/matblur.js rename to src/engine/gfx/matblur.js index d03dde06..e9a0ee4a 100644 --- a/src/demo/engine/gfx/matblur.js +++ b/src/engine/gfx/matblur.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Blur material, used for rendering of blurred volume slices -* @module lib/scripts/gfx/matblur -*/ + * Blur material, used for rendering of blurred volume slices + * @module lib/scripts/gfx/matblur + */ // ****************************************************************** // imports @@ -35,8 +21,8 @@ import BLUR_FRAGMENT_SHADER from '../shaders/blur.frag'; /** Class @class MaterialBlur for volume slice blurring */ export default class MaterialBlur { /** Backface material constructor - * @constructor - */ + * @constructor + */ constructor() { this.m_strShaderVertex = ''; this.m_strShaderFragment = ''; @@ -56,11 +42,11 @@ export default class MaterialBlur { volumeSizeZ: { type: 'f', value: VOL_SIZE_Z }, xDim: { type: 'f', value: VOL_SIZE_Z }, yDim: { type: 'f', value: VOL_SIZE_Z }, - blurSigma: { type: 'f', value: BLUR_SIGMA }, + blurSigma: { type: 'f', value: BLUR_SIGMA }, contrast: { type: 'f', value: CONTRAST }, brightness: { type: 'f', value: BRIGHTNESS }, curZ: { type: 'f', value: 0.0 }, - save_flag: { type: 'b', value: SAVE_FLAG } + save_flag: { type: 'b', value: SAVE_FLAG }, }; this.m_defines = { renderRoiMap: 0, @@ -69,8 +55,8 @@ export default class MaterialBlur { } /** Backface material constructor - * @return {object} Three.js material with this shader - */ + * @return {object} Three.js material with this shader + */ create(texture, texRoi, texelSize, texRoiColor, texRoiId, callbackMat) { // Init uniforms this.m_uniforms.texVolume.value = texture; @@ -95,7 +81,7 @@ export default class MaterialBlur { uniforms: this.m_uniforms, defines: this.m_defines, vertexShader: this.m_strShaderVertex, - fragmentShader: this.m_strShaderFragment + fragmentShader: this.m_strShaderFragment, }); if (callbackMat) { callbackMat(material); diff --git a/src/demo/engine/gfx/matclipplane.js b/src/engine/gfx/matclipplane.js similarity index 66% rename from src/demo/engine/gfx/matclipplane.js rename to src/engine/gfx/matclipplane.js index eab28630..2ef4ffdc 100644 --- a/src/demo/engine/gfx/matclipplane.js +++ b/src/engine/gfx/matclipplane.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Clipping plane material, used for rendering of near camera plane as a part ray-casting pipeline -* @module lib/scripts/gfx/matcliplane -*/ + * Clipping plane material, used for rendering of near camera plane as a part ray-casting pipeline + * @module lib/scripts/gfx/matcliplane + */ // ****************************************************************** // imports @@ -35,8 +21,8 @@ import CLIP_FRAGMENT_SHADER from '../shaders/clipplane.frag'; /** Class @class MaterialClipPlane for volume clip plane rendering */ export default class MaterialClipPlane { /** ClipPlane material constructor - * @constructor - */ + * @constructor + */ constructor() { this.m_strShaderVertex = ''; this.m_strShaderFragment = ''; @@ -47,8 +33,8 @@ export default class MaterialClipPlane { } /** Frontface material constructor - * @return {object} Three.js material with this shader - */ + * @return {object} Three.js material with this shader + */ create(textureBF, callbackMat) { // Init uniforms this.m_uniforms.texBF.value = textureBF; diff --git a/src/engine/gfx/matcolor2d.js b/src/engine/gfx/matcolor2d.js new file mode 100644 index 00000000..59518411 --- /dev/null +++ b/src/engine/gfx/matcolor2d.js @@ -0,0 +1,52 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Simple 2d mode material wiithout texture and lighting, only ambient color used + * @module lib/scripts/gfx/matcolor2d + */ + +// ****************************************************************** +// imports +// ****************************************************************** + +// absoulte imports +import * as THREE from 'three'; + +/** Class @class MaterialColor2d for create 2d lines, etc */ +export default class MaterialColor2d { + /** Simple material constructor + * @constructor + * @param (float) r - color component(red) in [0..1] + * @param (float) g - color component(green) in [0..1] + * @param (float) b - color component(blue) in [0..1] + */ + constructor() { + this.m_strShaderVertex = ''; + this.m_strShaderFragment = ''; + } + + create() { + this.m_strShaderVertex = ` + void main() { + gl_Position = vec4(position, 1.0); + } + `; + this.m_strShaderFragment = ` + void main() { + gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); + } + `; + const material = new THREE.ShaderMaterial({ + vertexShader: this.m_strShaderVertex, + fragmentShader: this.m_strShaderFragment, + //side: THREE.FrontSide, + wireframe: true, + //depthTest: false + //clipping: false, + }); + return material; + } +} diff --git a/src/engine/gfx/matfrontface.js b/src/engine/gfx/matfrontface.js new file mode 100644 index 00000000..e8512c4a --- /dev/null +++ b/src/engine/gfx/matfrontface.js @@ -0,0 +1,82 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Frontface material, used for cube frontface rendering + * @module lib/scripts/gfx/matfrontface + */ + +// ****************************************************************** +// imports +// ****************************************************************** + +// absoulte imports +import * as THREE from 'three'; +import FRONT_FACE_VERTEX_SHADER from '../shaders/frontface.vert'; +import FRONT_FACE_FRAGMENT_SHADER from '../shaders/frontface.frag'; + +/** Class @class MaterialFF for volume frontface rendering */ +export default class MaterialFF { + /** Frontface material constructor + * @constructor + */ + constructor() { + this.m_strShaderVertex = ''; + this.m_strShaderFragment = ''; + this.m_uniforms = { + texBF: { type: 't', value: null }, + PlaneX: { type: 'v4', value: new THREE.Vector4(-1.0, 0.0, 0.0, 0.5) }, + PlaneY: { type: 'v4', value: new THREE.Vector4(0.0, -1.0, 0.0, 0.5) }, + PlaneZ: { type: 'v4', value: new THREE.Vector4(0.0, 0.0, -1.0, 0.5) }, + }; + } + + /** Frontface material constructor + * @return {object} Three.js material with this shader + */ + create(textureBF, callbackMat) { + // Init uniforms + this.m_uniforms.texBF.value = textureBF; + // create shader loaders + const vertexLoader = new THREE.FileLoader(THREE.DefaultLoadingManager); + vertexLoader.setResponseType('text'); + const fragmentLoader = new THREE.FileLoader(THREE.DefaultLoadingManager); + fragmentLoader.setResponseType('text'); + vertexLoader.load(FRONT_FACE_VERTEX_SHADER, (strVertexSh) => { + this.m_strShaderVertex = strVertexSh; + //console.log(`Load callback success. text = : ${strVertexSh} ...`); + fragmentLoader.load( + FRONT_FACE_FRAGMENT_SHADER, + (strFragmentSh) => { + this.m_strShaderFragment = strFragmentSh; + + const NEED_LOG = false; + if (NEED_LOG) { + const strLoadedVert = JSON.stringify(this.m_strShaderVertex); + console.log(`Readed vertex shader is: ${strLoadedVert} ...`); + const strLoadedFrag = JSON.stringify(this.m_strShaderFragment); + console.log(`Readed fragment shader is: ${strLoadedFrag} ...`); + } + const material = new THREE.ShaderMaterial({ + uniforms: this.m_uniforms, + vertexShader: this.m_strShaderVertex, + fragmentShader: this.m_strShaderFragment, + side: THREE.FrontSide, + depthTest: true, + depthFunc: THREE.LessEqualDepth, + blending: THREE.NoBlending, + }); + if (callbackMat) { + callbackMat(material); + } + }, + /*(strFragmentSh) => {},*/ + (e) => { + console.log('Shader load failed! because of error ' + e.target.status + ', ' + e.target.statusText); + } + ); + }); + } +} diff --git a/src/demo/engine/gfx/matinterpolation.js b/src/engine/gfx/matinterpolation.js similarity index 67% rename from src/demo/engine/gfx/matinterpolation.js rename to src/engine/gfx/matinterpolation.js index 90007cc2..d3bed78d 100644 --- a/src/demo/engine/gfx/matinterpolation.js +++ b/src/engine/gfx/matinterpolation.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Final isosurface rendering material for CT dataset -* @module lib/scripts/gfx/matinterpolation -*/ + * Final isosurface rendering material for CT dataset + * @module lib/scripts/gfx/matinterpolation + */ // ****************************************************************** // imports @@ -34,10 +20,9 @@ import INTERP_FRAGMENT_SHADER from '../shaders/interpolation.frag'; /** Class @class MaterialVolumeRender for create skull volume render shader material */ export default class MaterialInterpolation { - /** Simple material constructor - * @constructor - */ + * @constructor + */ constructor() { this.m_strShaderVertex = ''; this.m_strShaderFragment = ''; @@ -51,8 +36,8 @@ export default class MaterialInterpolation { } /** Simple material constructor - * @return {object} Three.js material with this shader - */ + * @return {object} Three.js material with this shader + */ create(renderTexture, callbackMat) { // Init uniforms this.m_uniforms.texIsoSurface.value = renderTexture; @@ -80,7 +65,7 @@ export default class MaterialInterpolation { defines: this.m_defines, vertexShader: this.m_strShaderVertex, fragmentShader: this.m_strShaderFragment, - side: THREE.BackSide + side: THREE.BackSide, }); if (callbackMat) { callbackMat(material); diff --git a/src/demo/engine/gfx/matrendertotexture.js b/src/engine/gfx/matrendertotexture.js similarity index 78% rename from src/demo/engine/gfx/matrendertotexture.js rename to src/engine/gfx/matrendertotexture.js index b985ee3d..4312a32b 100644 --- a/src/demo/engine/gfx/matrendertotexture.js +++ b/src/engine/gfx/matrendertotexture.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Low resolution isosurface rendering material for CT dataset -* @module lib/scripts/gfx/matrendertotexture -*/ + * Low resolution isosurface rendering material for CT dataset + * @module lib/scripts/gfx/matrendertotexture + */ // ****************************************************************** // imports @@ -33,12 +19,12 @@ import RENDER_TEXTURE_VERTEX_SHADER from '../shaders/rendertotexture.vert'; import RENDER_TEXTURE_FRAGMENT_SHADER from '../shaders/rendertotexture.frag'; /** Class @class MaterialRenderToTexture for -* rough isosurface computation: a ray-casting optimization -*/ + * rough isosurface computation: a ray-casting optimization + */ export default class MaterialRenderToTexture { /** Simple material constructor - * @constructor - */ + * @constructor + */ constructor() { this.m_strShaderVertex = ''; this.m_strShaderFragment = ''; @@ -81,8 +67,8 @@ export default class MaterialRenderToTexture { } /** Simple material constructor - * @return {object} Three.js material with this shader - */ + * @return {object} Three.js material with this shader + */ create(texTF, texVol2d, texVolMask, texVolAO, texBackface, texFrontface, offsets, callbackMat) { // Init uniforms this.m_uniforms.texTF.value = texTF; diff --git a/src/demo/engine/gfx/matscreentexmapping.js b/src/engine/gfx/matscreentexmapping.js similarity index 61% rename from src/demo/engine/gfx/matscreentexmapping.js rename to src/engine/gfx/matscreentexmapping.js index e045b192..25e781ec 100644 --- a/src/demo/engine/gfx/matscreentexmapping.js +++ b/src/engine/gfx/matscreentexmapping.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Material to map texture using screen positions of the fragments -* @module lib/scripts/gfx/matscreentexmapping -*/ + * Material to map texture using screen positions of the fragments + * @module lib/scripts/gfx/matscreentexmapping + */ // ****************************************************************** // imports @@ -34,8 +20,8 @@ import * as THREE from 'three'; */ export default class MaterialScreenTexMap { /** Wireframe material constructor - * @constructor - */ + * @constructor + */ constructor() { this.m_strShaderVertex = ''; this.m_strShaderFragment = ''; @@ -46,8 +32,8 @@ export default class MaterialScreenTexMap { } /** material constructor - * @return {object} Three.js material with this shader - */ + * @return {object} Three.js material with this shader + */ create(texBuffer) { // Init uniforms this.m_uniforms.texBuffer.value = texBuffer; diff --git a/src/demo/engine/gfx/matssao.js b/src/engine/gfx/matssao.js similarity index 75% rename from src/demo/engine/gfx/matssao.js rename to src/engine/gfx/matssao.js index 62e35dc7..f3a236fb 100644 --- a/src/demo/engine/gfx/matssao.js +++ b/src/engine/gfx/matssao.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Screen space ambient occlusion posteffect for the isosurface vr -* @module lib/scripts/gfx/matssao -*/ + * Screen space ambient occlusion posteffect for the isosurface vr + * @module lib/scripts/gfx/matssao + */ // ****************************************************************** // imports @@ -33,13 +19,12 @@ import RENDER_TEXTURE_VERTEX_SHADER from '../shaders/ssao.vert'; import RENDER_TEXTURE_FRAGMENT_SHADER from '../shaders/ssao.frag'; /** Class @class MaterialRenderSSAO for -* ambient occlusion computation -*/ + * ambient occlusion computation + */ export default class MaterialRenderSSAO { - /** Simple material constructor - * @constructor - */ + * @constructor + */ constructor() { this.m_strShaderVertex = ''; this.m_strShaderFragment = ''; @@ -61,8 +46,8 @@ export default class MaterialRenderSSAO { } /** Simple material constructor - * @return {object} Three.js material with this shader - */ + * @return {object} Three.js material with this shader + */ create(texVol2d, texBackface, texFrontface, texIsosurfFrame, texColorFrame, callbackMat) { // Init uniforms this.m_uniforms.texVolume.value = texVol2d; @@ -105,7 +90,7 @@ export default class MaterialRenderSSAO { // defines: this.m_defines, vertexShader: this.m_strShaderVertex, fragmentShader: this.m_strShaderFragment, - side: THREE.BackSide + side: THREE.BackSide, }); if (callbackMat) { callbackMat(material); diff --git a/src/demo/engine/gfx/mattex2d.js b/src/engine/gfx/mattex2d.js similarity index 82% rename from src/demo/engine/gfx/mattex2d.js rename to src/engine/gfx/mattex2d.js index 8ebe48e5..7ac2bc60 100644 --- a/src/demo/engine/gfx/mattex2d.js +++ b/src/engine/gfx/mattex2d.js @@ -1,48 +1,16 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -/** -* 2d texture material, used for 2d edit mode -* @module app/scripts/fgx/shaders/mattex2d -*/ - -// ****************************************************************** -// imports -// ****************************************************************** - -// absoulte imports + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ import * as THREE from 'three'; -// app imports -import RoiPalette from '../loaders/roipalette'; +import { getPalette256 } from '../loaders/RoiPalette256'; const TEX2D_PLANE_X = 0; const TEX2D_PLANE_Y = 1; const TEX2D_PLANE_Z = 2; -/** @class MaterialTex2d to render texture in 2d mode */ - export default class MaterialTex2d { - - /** Simple material constructor - * @constructor - */ constructor() { this.m_defines = { useWebGL2: 1, @@ -227,14 +195,14 @@ export default class MaterialTex2d { } /** Create material for 2d texture display - * @param {object} tex - texture with 2d layout of 3d source - * @param {int} xDim - 3d texture dimension on x - * @param {int} yDim - 3d texture dimension on y - * @param {int} zDim - 3d texture dimension on z - * @param {int} planeMode - see TEX2D_PLANE_X, TEX2D_PLANE_Y, TEX2D_PLANE_Z - * @param {int} sliceIndex - current sliceIndex - * @param {bool} isRoiVolume - is roi volume or not - */ + * @param {object} tex - texture with 2d layout of 3d source + * @param {int} xDim - 3d texture dimension on x + * @param {int} yDim - 3d texture dimension on y + * @param {int} zDim - 3d texture dimension on z + * @param {int} planeMode - see TEX2D_PLANE_X, TEX2D_PLANE_Y, TEX2D_PLANE_Z + * @param {int} sliceIndex - current sliceIndex + * @param {bool} isRoiVolume - is roi volume or not + */ create(tex, xDim, yDim, zDim, planeMode, sliceIndex, isRoiVolume) { this.m_uniforms.volTexture.value = tex; this.m_uniforms.plane.value = planeMode; @@ -242,10 +210,9 @@ export default class MaterialTex2d { this.m_uniforms.xDim.value = xDim; this.m_uniforms.yDim.value = yDim; this.m_uniforms.zDim.value = zDim; - this.m_uniforms.isRoiVolume.value = (isRoiVolume) ? 1.0 : 0.0; + this.m_uniforms.isRoiVolume.value = isRoiVolume ? 1.0 : 0.0; if (isRoiVolume) { - const roiPalette = new RoiPalette(); - const palette = roiPalette.getPalette256(); + const palette = getPalette256(); const BYTES_PER_COLOR = 4; const MAGIC_COLOR = 250; const OFFS_0 = 0; @@ -285,7 +252,7 @@ export default class MaterialTex2d { uniforms: this.m_uniforms, defines: this.m_defines, vertexShader: this.m_strShaderVertex, - fragmentShader: this.m_strShaderFragment + fragmentShader: this.m_strShaderFragment, }); this.m_material.needsUpdate = true; } diff --git a/src/demo/engine/gfx/mattplain.js b/src/engine/gfx/mattplain.js similarity index 64% rename from src/demo/engine/gfx/mattplain.js rename to src/engine/gfx/mattplain.js index 8e31457b..1e488080 100644 --- a/src/demo/engine/gfx/mattplain.js +++ b/src/engine/gfx/mattplain.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* 2d texture simplest render -* @module lib/scripts/gfx/mattplain -*/ + * 2d texture simplest render + * @module lib/scripts/gfx/mattplain + */ // ****************************************************************** // imports @@ -31,10 +17,9 @@ import * as THREE from 'three'; /** Class @class MaterialTexturePlain2d for create artifical volume */ export default class MaterialTexturePlain2d { - /** Simple material constructor - * @constructor - */ + * @constructor + */ constructor() { this.m_strShaderVertex = ''; this.m_strShaderFragment = ''; @@ -71,8 +56,8 @@ export default class MaterialTexturePlain2d { } /** Simple material constructor - * @return {object} Three.js material with this shader - */ + * @return {object} Three.js material with this shader + */ create(tex) { // Init uniforms this.m_uniforms.texture1.value = tex; @@ -84,7 +69,7 @@ export default class MaterialTexturePlain2d { blendDst: THREE.OneMinusSrcAlphaFactor, uniforms: this.m_uniforms, vertexShader: this.m_strShaderVertex, - fragmentShader: this.m_strShaderFragment + fragmentShader: this.m_strShaderFragment, }); this.m_material.needsUpdate = true; } diff --git a/src/demo/engine/gfx/matvolumerender.js b/src/engine/gfx/matvolumerender.js similarity index 78% rename from src/demo/engine/gfx/matvolumerender.js rename to src/engine/gfx/matvolumerender.js index 7c044073..1dcd033a 100644 --- a/src/demo/engine/gfx/matvolumerender.js +++ b/src/engine/gfx/matvolumerender.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Final isosurface rendering material for CT dataset -* @module lib/scripts/gfx/matvolumerender -*/ + * Final isosurface rendering material for CT dataset + * @module lib/scripts/gfx/matvolumerender + */ // ****************************************************************** // imports @@ -34,10 +20,9 @@ import VOL_RENDER_FRAGMENT_SHADER from '../shaders/volumerender.frag'; /** Class @class MaterialVolumeRender for create skull volume render shader material */ export default class MaterialVolumeRender { - /** Simple material constructor - * @constructor - */ + * @constructor + */ constructor() { this.m_strShaderVertex = ''; this.m_strShaderFragment = ''; @@ -82,10 +67,9 @@ export default class MaterialVolumeRender { } /** Simple material constructor - * @return {object} Three.js material with this shader - */ - create(texTF, texVol2d, - texVolMask, texVolAO, texBackface, texFrontface, renderTexture, offsets, callbackMat) { + * @return {object} Three.js material with this shader + */ + create(texTF, texVol2d, texVolMask, texVolAO, texBackface, texFrontface, renderTexture, offsets, callbackMat) { // Init uniforms this.m_uniforms.texTF.value = texTF; this.m_uniforms.texVolume.value = texVol2d; diff --git a/src/demo/engine/gfx/matwireframecull.js b/src/engine/gfx/matwireframecull.js similarity index 70% rename from src/demo/engine/gfx/matwireframecull.js rename to src/engine/gfx/matwireframecull.js index 0c87f361..69fa2291 100644 --- a/src/demo/engine/gfx/matwireframecull.js +++ b/src/engine/gfx/matwireframecull.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Material to enable back/front face culling with wireframe geom -* @module lib/scripts/gfx/matwireframecull -*/ + * Material to enable back/front face culling with wireframe geom + * @module lib/scripts/gfx/matwireframecull + */ // ****************************************************************** // imports @@ -31,10 +17,9 @@ import * as THREE from 'three'; /** Class @class MaterialWC back/front face culling with wireframe rendering */ export default class MaterialWC { - /** Wireframe material constructor - * @constructor - */ + * @constructor + */ constructor() { this.m_strShaderVertex = ''; this.m_strShaderFragment = ''; @@ -48,8 +33,8 @@ export default class MaterialWC { } /** Wireframe material constructor - * @return {object} Three.js material with this shader - */ + * @return {object} Three.js material with this shader + */ create(textureBF, textureFF) { // Init uniforms this.m_uniforms.texBF.value = textureBF; diff --git a/src/demo/engine/imgproc/BilateralHW.js b/src/engine/imgproc/BilateralHW.js similarity index 88% rename from src/demo/engine/imgproc/BilateralHW.js rename to src/engine/imgproc/BilateralHW.js index c92e1954..c05631f3 100644 --- a/src/demo/engine/imgproc/BilateralHW.js +++ b/src/engine/imgproc/BilateralHW.js @@ -1,6 +1,11 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +// +// Bilateral filter for 3d iamge using render and shader // -// Bilateral filter for 3d iamge using render and shader -// import * as THREE from 'three'; import GlSelector from '../GlSelector'; @@ -94,8 +99,8 @@ export default class BilateralHW { volumeSizeZ: { type: 'f', value: VOL_SIZE_Z }, xDim: { type: 'f', value: VOL_SIZE_Z }, yDim: { type: 'f', value: VOL_SIZE_Z }, - distSigma: { type: 'f', value: DIST_SIGMA }, - valSigma: { type: 'f', value: VAL_SIGMA }, + distSigma: { type: 'f', value: DIST_SIGMA }, + valSigma: { type: 'f', value: VAL_SIGMA }, curZ: { type: 'f', value: 0.0 }, kernelSize: { type: 'f', value: 0.0 }, }; @@ -112,14 +117,14 @@ export default class BilateralHW { isFinished() { if (this.m_z >= this.m_zDim) { return true; - } + } return false; } update() { const zDim = this.m_zDim; - const STEP = (zDim > 16 ) ? 24 : 2; - const zNext = Math.floor((this.m_iter + 1) * zDim / STEP); + const STEP = zDim > 16 ? 24 : 2; + const zNext = Math.floor(((this.m_iter + 1) * zDim) / STEP); const VAL_4 = 4; @@ -136,7 +141,7 @@ export default class BilateralHW { for (let x = 0; x < this.m_xDim; x++) { const val = this.m_frameBuf[VAL_4 * (x + yOff)]; this.m_bufferTextureCPU[x + yOff + zOffs] = val; - valMax = (val > valMax) ? val : valMax; + valMax = val > valMax ? val : valMax; } // for x } // for y } // for z @@ -164,16 +169,13 @@ export default class BilateralHW { initRenderer(distSigma, valSigma) { this.sceneBlur = new THREE.Scene(); // eslint-disable-next-line - this.cameraOrtho = new THREE.OrthographicCamera( - -this.m_xDim / 2, +this.m_xDim / 2, - +this.m_yDim / 2, -this.m_yDim / 2, - 0.1, 100); + this.cameraOrtho = new THREE.OrthographicCamera(-this.m_xDim / 2, +this.m_xDim / 2, +this.m_yDim / 2, -this.m_yDim / 2, 0.1, 100); const glSelector = new GlSelector(); this.context = glSelector.createWebGLContext(); this.canvas3d = glSelector.getCanvas(); this.rendererBlur = new THREE.WebGLRenderer({ canvas: this.canvas3d, - context: this.context + context: this.context, }); const geometryBlur = new THREE.PlaneGeometry(1.0, 1.0); @@ -195,18 +197,19 @@ export default class BilateralHW { // create renderer // koefDist in 0.5 .. 3.0 // koefVal in 0.1 .. 4.0 - // + // // | koefDist = 0.5 | koefDist = 3.0 // ---------------+-----------------+---------------- - // koefVal = 0.1 | orig | Nice without noise + // koefVal = 0.1 | orig | Nice without noise // koefVal = 4.0 | orig | Blurred // // create(volume, texelSize, kernelSize, koefDist, koefVal = 0.1) { - const distSigma = (1.0 / kernelSize) * koefDist; const valSigma = (1.0 / 256.0) * koefVal; - console.log('BilateralHW params: kernel=' + kernelSize.toString() + ' dist sigma=' + distSigma.toString() + ' val sigma=' + valSigma.toString() ); + console.log( + 'BilateralHW params: kernel=' + kernelSize.toString() + ' dist sigma=' + distSigma.toString() + ' val sigma=' + valSigma.toString() + ); const xDim = volume.m_xDim; const yDim = volume.m_yDim; const zDim = volume.m_zDim; @@ -237,16 +240,16 @@ export default class BilateralHW { this.origVolumeTex.wrapR = THREE.ClampToEdgeWrapping; this.origVolumeTex.wrapS = THREE.ClampToEdgeWrapping; this.origVolumeTex.wrapT = THREE.ClampToEdgeWrapping; - this.origVolumeTex.magFilter = THREE.NearestFilter;//THREE.LinearFilter; - this.origVolumeTex.minFilter = THREE.NearestFilter;//THREE.LinearFilter; + this.origVolumeTex.magFilter = THREE.NearestFilter; //THREE.LinearFilter; + this.origVolumeTex.minFilter = THREE.NearestFilter; //THREE.LinearFilter; this.origVolumeTex.needsUpdate = true; - + // compile shaders this.m_material = new THREE.ShaderMaterial({ uniforms: this.m_uniforms, defines: this.m_defines, vertexShader: this.m_strShaderVertex, - fragmentShader: this.m_strShaderFragment + fragmentShader: this.m_strShaderFragment, }); this.m_uniforms.texVolume.value = this.origVolumeTex; @@ -258,5 +261,4 @@ export default class BilateralHW { } return this.m_bufferTextureCPU; } // end create - } // end class diff --git a/src/demo/engine/imgproc/Gauss.js b/src/engine/imgproc/Gauss.js similarity index 77% rename from src/demo/engine/imgproc/Gauss.js rename to src/engine/imgproc/Gauss.js index 64d07ecd..15c1d98b 100644 --- a/src/demo/engine/imgproc/Gauss.js +++ b/src/engine/imgproc/Gauss.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Gauss filtering -* @module demo/engine/imgproc/Gauss -*/ + * Gauss filtering + * @module demo/engine/imgproc/Gauss + */ import * as THREE from 'three'; @@ -50,22 +36,19 @@ class GaussSmoother { } createKernel(kernelSize, sigma) { - const side = kernelSize * 2 + 1; + const side = kernelSize * 2 + 1; const xyzKernel = side * side * side; const arr = new Float32Array(xyzKernel); - + const mult = 1.0 / (2.0 * sigma * sigma); - + let off = 0; let sum = 0.0; - for (let dz = -kernelSize; dz <= +kernelSize; dz++) - { + for (let dz = -kernelSize; dz <= +kernelSize; dz++) { const tz = dz / kernelSize; - for (let dy = -kernelSize; dy <= +kernelSize; dy++) - { + for (let dy = -kernelSize; dy <= +kernelSize; dy++) { const ty = dy / kernelSize; - for (let dx = -kernelSize; dx <= +kernelSize; dx++) - { + for (let dx = -kernelSize; dx <= +kernelSize; dx++) { const tx = dx / kernelSize; const w = Math.exp(-(tx * tx + ty * ty + tz * tz) * mult); arr[off++] = w; @@ -73,11 +56,10 @@ class GaussSmoother { } // for dx } // for dy } // for dz - + // normalize arr const scl = 1.0 / sum; - for (let i = 0; i < xyzKernel; i++) - arr[i] *= scl; + for (let i = 0; i < xyzKernel; i++) arr[i] *= scl; this.m_kernel = arr; } @@ -101,7 +83,6 @@ class GaussSmoother { const vTexelSize = new THREE.Vector3(1.0 / xDim, 1.0 / yDim, 1.0 / zDim); this.m_bilateralHw.create(vol, vTexelSize, kernelSize, koefDist, koefVal); } // if HW gauss - } normalizeDstImage() { @@ -113,7 +94,7 @@ class GaussSmoother { const xyzDim = this.m_vol.m_xDim * this.m_vol.m_yDim * this.m_vol.m_zDim; for (let i = 0; i < xyzDim; i++) { const val = this.m_pixelsDst[i]; - valMax = (val > valMax) ? val : valMax; + valMax = val > valMax ? val : valMax; } // for i valMax += 0.9; const scl = 255.0 / valMax; @@ -130,7 +111,7 @@ class GaussSmoother { // return ratio in [0..1] getRatio() { const zDim = this.m_vol.m_zDim; - let ratio01 = 0.0; + let ratio01 = 0.0; if (this.m_needHw) { ratio01 = this.m_bilateralHw.m_z / zDim; } else { @@ -145,7 +126,7 @@ class GaussSmoother { if (this.m_needHw) { if (this.m_bilateralHw.m_z >= zDim) { return true; - } + } } else { if (this.m_z >= zDim) { return true; @@ -170,8 +151,8 @@ class GaussSmoother { const zDim = this.m_vol.m_zDim; const xyDim = xDim * yDim; - const STEP = (zDim > 16 ) ? 24 : 2; - const zNext = Math.floor((this.m_iter + 1) * zDim / STEP); + const STEP = zDim > 16 ? 24 : 2; + const zNext = Math.floor(((this.m_iter + 1) * zDim) / STEP); // console.log('Gauss update z from ' + this.m_z.toString() + ' until ' + zNext.toString()); const arrKernel = this.m_kernel; @@ -187,28 +168,26 @@ class GaussSmoother { let offKer = 0; for (let dz = -kernelSize; dz <= +kernelSize; dz++) { let zz = z + dz; - zz = (zz >= 0) ? zz : 0; - zz = (zz < zDim) ? zz : (zDim - 1); + zz = zz >= 0 ? zz : 0; + zz = zz < zDim ? zz : zDim - 1; const zzOff = zz * xyDim; for (let dy = -kernelSize; dy <= +kernelSize; dy++) { let yy = y + dy; - yy = (yy >= 0) ? yy : 0; - yy = (yy < yDim) ? yy : (yDim - 1); + yy = yy >= 0 ? yy : 0; + yy = yy < yDim ? yy : yDim - 1; const yyOff = yy * xDim; for (let dx = -kernelSize; dx <= +kernelSize; dx++) { let xx = x + dx; - xx = (xx >= 0) ? xx : 0; - xx = (xx < xDim) ? xx : (xDim - 1); - + xx = xx >= 0 ? xx : 0; + xx = xx < xDim ? xx : xDim - 1; + sum += arrKernel[offKer] * pixelsSrc[xx + yyOff + zzOff]; offKer++; - } // for dx } // for dy } // for dz this.m_pixelsDst[off] = sum; off++; - } // for x } // for y } // for z all slices @@ -231,7 +210,7 @@ class GaussSmoother { for (let z = 0; z < SZ; z++) { for (let y = 0; y < SZ; y++) { for (let x = 0; x < SZ; x++) { - pixelsSrc[offDst++] = (z < HALF_SZ) ? 0 : 255; + pixelsSrc[offDst++] = z < HALF_SZ ? 0 : 255; } } } @@ -253,7 +232,7 @@ class GaussSmoother { const srcVal = pixelsSrc[xOff + yOff + z * xyDim]; const val = pixelsDst[xOff + yOff + z * xyDim]; console.log('src val / gauss val = ' + srcVal.toString() + ' / ' + val.toString()); - const isGood = (val >= valPrev) ? true : false; + const isGood = val >= valPrev ? true : false; if (!isGood) { console.log('gauss test failed'); } @@ -261,9 +240,7 @@ class GaussSmoother { } // for z this.stop(); console.log('gauss test completed on a small volume'); - } // end test simple - } // end class export default GaussSmoother; diff --git a/src/demo/engine/imgproc/Sobel.js b/src/engine/imgproc/Sobel.js similarity index 67% rename from src/demo/engine/imgproc/Sobel.js rename to src/engine/imgproc/Sobel.js index 183a3dff..a2df1680 100644 --- a/src/demo/engine/imgproc/Sobel.js +++ b/src/engine/imgproc/Sobel.js @@ -1,32 +1,18 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Soble edge detector -* @module demo/engine/imgproc/Sobel -*/ + * Soble edge detector + * @module demo/engine/imgproc/Sobel + */ // // Sobel edge detectio // -const MAX_SQRT = (5400 * 5400) +const MAX_SQRT = 5400 * 5400; export default class SobelEdgeDetector { constructor() { @@ -63,7 +49,7 @@ export default class SobelEdgeDetector { const xyzDim = this.m_vol.m_xDim * this.m_vol.m_yDim * this.m_vol.m_zDim; for (let i = 0; i < xyzDim; i++) { const val = this.m_pixelsDst[i]; - valMax = (val > valMax) ? val : valMax; + valMax = val > valMax ? val : valMax; } // for i valMax += 0.9; const scl = 255.0 / valMax; @@ -105,7 +91,7 @@ export default class SobelEdgeDetector { const xyDim = xDim * yDim; const STEP = 24; - const zNext = Math.floor((this.m_iter + 1) * zDim / STEP); + const zNext = Math.floor(((this.m_iter + 1) * zDim) / STEP); // console.log('Sobel update z from ' + this.m_z.toString() + ' until ' + zNext.toString()); // let maxSqrt = 0; @@ -115,45 +101,40 @@ export default class SobelEdgeDetector { for (let z = this.m_z; z < zNext; z++) { for (let y = 0; y < yDim; y++) { for (let x = 0; x < xDim; x++) { - let sumDx = 0.0, sumDy = 0.0, sumDz = 0.0; + let sumDx = 0.0, + sumDy = 0.0, + sumDz = 0.0; for (let dz = -1; dz <= +1; dz++) { let zz = z + dz; - zz = (zz >= 0) ? zz : 0; - zz = (zz < zDim) ? zz : (zDim - 1); + zz = zz >= 0 ? zz : 0; + zz = zz < zDim ? zz : zDim - 1; const zzOff = zz * xyDim; for (let dy = -1; dy <= +1; dy++) { let yy = y + dy; - yy = (yy >= 0) ? yy : 0; - yy = (yy < yDim) ? yy : (yDim - 1); + yy = yy >= 0 ? yy : 0; + yy = yy < yDim ? yy : yDim - 1; const yyOff = yy * xDim; for (let dx = -1; dx <= +1; dx++) { let xx = x + dx; - xx = (xx >= 0) ? xx : 0; - xx = (xx < xDim) ? xx : (xDim - 1); - + xx = xx >= 0 ? xx : 0; + xx = xx < xDim ? xx : xDim - 1; + const val = pixelsSrc[xx + yyOff + zzOff]; - + let kx = 1; - if (dy === 0) - kx *= 2; - if (dz === 0) - kx *= 2; + if (dy === 0) kx *= 2; + if (dz === 0) kx *= 2; sumDx += dx * val * kx; - + let ky = 1; - if (dx === 0) - ky *= 2; - if (dz === 0) - ky *= 2; + if (dx === 0) ky *= 2; + if (dz === 0) ky *= 2; sumDy += dy * val * ky; - + let kz = 1; - if (dx === 0) - kz *= 2; - if (dy === 0) - kz *= 2; + if (dx === 0) kz *= 2; + if (dy === 0) kz *= 2; sumDz += dz * val * kz; - } // for dx } // for dy } // for dz @@ -164,7 +145,6 @@ export default class SobelEdgeDetector { this.m_pixelsDst[off] = this.m_sqrtTable[dotProd]; off++; - } // for x } // for y } // for z all slices diff --git a/src/engine/loaders/FileLoader.js b/src/engine/loaders/FileLoader.js new file mode 100644 index 00000000..bc3c62c6 --- /dev/null +++ b/src/engine/loaders/FileLoader.js @@ -0,0 +1,101 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Common binary file loader + * @module src/demo/engine/loaders/FileLoader + */ + +// ****************************************************************** +// File loader +// ****************************************************************** + +/** Instance habdle for loader */ +let GInstanceFileLoader = null; + +/** Class FileLoader for load binary files */ +export default class FileLoader { + /** Create empty loader + * @param {string} strUrl - URL for loaded file + */ + constructor(strUrl) { + if (!GInstanceFileLoader) { + GInstanceFileLoader = this; + } + /** @property {string} m_url - Urlf ror file being read */ + this.m_url = strUrl; + /** @property {object} m_request - XMLHttpRequest object, used for acees to resource */ + this.m_request = null; + this.readFile = this.readFile.bind(this); + } + + /** Read file + * @param {object} doneCallback - invoked callback + */ + readFile(doneCallback, rejectCallback) { + const METHOD = 'GET'; + this.m_request = new XMLHttpRequest(); + if (!this.m_request) { + console.log('Cant create object request'); + } + if ('withCredentials' in this.m_request) { + // this.m_request.withCredentials = true; + const NEED_ASYNC = true; + this.m_request.open(METHOD, this.m_url, NEED_ASYNC); + // } else if (typeof XDomainRequest !== 'undefined') { + // console.log('HttpRequest: XDomainRequest will be used'); + // this.m_request = new XDomainRequest(); + // this.m_request.open(METHOD, this.m_url); + } else { + this.m_request = null; + console.log('This browser cant support CORS requests'); + return; + } + + this.m_request.responseType = 'arraybuffer'; // "blob" + this.m_request.addEventListener( + 'load', + (event) => { + const arrBuf = event.target.response; + if (arrBuf === null) { + console.log('Bad response type. Expect object type in response.'); + } else if (doneCallback) { + // console.log(`FileFromServer response received. url = ${this.m_url}`); + + // check wrong buffer content + const enc = new TextDecoder('utf-8'); + let sz = arrBuf.byteLength; + if (sz > 4000) { + sz = 4000; + } + const bufHead = arrBuf.slice(0, sz); + const strBuf = enc.decode(bufHead); + if (strBuf.substr(0, 9) === '<!DOCTYPE') { + console.log('Error load data from URL. Read result is ' + strBuf); + } + doneCallback(arrBuf); + } + }, + false + ); + + this.m_request.addEventListener( + 'error', + () => { + // console.log(`Error event happend for XMLHttpRequest: loaded = ${event.loaded}, total = ${event.total}`); + const errMsg = `Error accessing file ${this.m_url}`; + rejectCallback(errMsg); + }, + false + ); + + this.m_request.send(); + const RES_FAIL_404 = 404; + if (this.m_request.status === RES_FAIL_404) { + const errMsg = `Cant access url = ${this.m_url}`; + rejectCallback(errMsg); + } + } +} // end class FileLoader diff --git a/src/engine/loaders/FileReader.js b/src/engine/loaders/FileReader.js new file mode 100644 index 00000000..6b61b1b4 --- /dev/null +++ b/src/engine/loaders/FileReader.js @@ -0,0 +1,882 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +// import { gzip, ungzip } from 'node-gzip'; +// import UiModalDicomSeries from './UiModalDicomSeries'; + +import React from 'react'; +import zlib from 'zlib'; +import createReadStream from 'filereader-stream'; + +import StoreActionType from '../../store/ActionTypes'; +import ViewMode from '../../store/ViewMode'; +import Modes3d from '../../store/Modes3d'; + +import Volume from '../Volume'; +import VolumeSet from '../VolumeSet'; + +import LoaderHdr from './LoaderHdr'; +import FileTools from './FileTools'; +import LoadResult from '../LoadResult'; +import LoaderDicom from './LoaderDicom'; +import LoaderUrlDicom from './LoaderUrlDicom'; +import LoaderDcmDaikon from './LoaderDcmDaikon'; +import LoaderDcmUrlDaikon from './LoadDcmUrlDiakon'; + +import config from '../../config/config'; + +const NEED_TEXTURE_SIZE_4X = true; +const READ_DICOM_VIA_DAIKON = true; + +class FileReader extends React.Component { + constructor(props) { + super(props); + this.onButtonOpenLocalFileClick = this.onButtonOpenLocalFileClick.bind(this); + this.handleFileSelected = this.handleFileSelected.bind(this); + this.onFileContentReadSingleFile = this.onFileContentReadSingleFile.bind(this); + this.onFileContentReadMultipleDicom = this.onFileContentReadMultipleDicom.bind(this); + this.onFileContentReadMultipleHdr = this.onFileContentReadMultipleHdr.bind(this); + this.setErrorString = this.setErrorString.bind(this); + this.onModalUrlShow = this.onModalUrlShow.bind(this); + this.onModalUrlHide = this.onModalUrlHide.bind(this); + this.onClickLoadUrl = this.onClickLoadUrl.bind(this); + this.callbackReadCompleteUrlKtxNii = this.callbackReadCompleteUrlKtxNii.bind(this); + this.onModalDemoOpenShow = this.onModalDemoOpenShow.bind(this); + this.onModalDemoOpenHide = this.onModalDemoOpenHide.bind(this); + this.onDemoSelected = this.onDemoSelected.bind(this); + this.onModalWindowCWHide = this.onModalWindowCWHide.bind(this); + this.onModalGoogleShow = this.onModalGoogleShow.bind(this); + this.onModalGoogleHide = this.onModalGoogleHide.bind(this); + this.onGoogleSelected = this.onGoogleSelected.bind(this); + this.onModalDicomSeriesHide = this.onModalDicomSeriesHide.bind(this); + this.onDicomSerieSelected = this.onDicomSerieSelected.bind(this); + this.callbackReadProgress = this.callbackReadProgress.bind(this); + this.callbackReadComplete = this.callbackReadComplete.bind(this); + this.callbackReadSingleDicomComplete = this.callbackReadSingleDicomComplete.bind(this); + this.callbackReadMultipleComplete = this.callbackReadMultipleComplete.bind(this); + this.callbackCompleteMultipleDicom = this.callbackCompleteMultipleDicom.bind(this); + + this.m_fileNameOnLoad = ''; + this.m_fileName = ''; + this.m_fileIndex = 0; + this.m_fileReader = null; + this.m_fileSize = null; + this.state = { + showModalUrl: false, + showModalDemo: false, + showModalGoogle: false, + showModalWindowCW: false, + onLoadCounter: 1, + }; + this.m_volumeSet = null; + this.m_volumeRoi = null; + this.m_updateEnable = true; + this.roiMode = false; + } + + finalizeSuccessLoadedVolume(volSet, fileNameIn) { + const store = this.props; + + console.assert(volSet instanceof VolumeSet, 'finalizeSuccessLoadedVolume: should be VolumeSet'); + console.assert(volSet.getNumVolumes() >= 1, 'finalizeSuccessLoadedVolume: should be more or 1 volume'); + const indexVol = 0; + + const vol = volSet.getVolume(indexVol); + console.assert(vol !== null, 'finalizeSuccessLoadedVolume: should be non zero volume'); + + if (vol.m_dataArray !== null) { + console.log(`success loaded volume from ${fileNameIn}`); + if (NEED_TEXTURE_SIZE_4X) { + vol.makeDimensions4x(); + } + // invoke notification + + // send update (repaint) if was loaded prev model + if (store.isLoaded) { + store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); + } + + store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: volSet }); + store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: 0 }); + store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); + store.dispatch({ type: StoreActionType.SET_FILENAME, fileName: fileNameIn }); + store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: [] }); + store.dispatch({ type: StoreActionType.SET_MODE_VIEW, viewMode: ViewMode.VIEW_2D }); + store.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); + store.dispatch({ type: StoreActionType.SET_SPINNER, spinner: false }); + } + } + + setErrorString(strErr) { + const store = this.props; + const arrErrors = []; + arrErrors.push(strErr); + store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); + store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: arrErrors }); + store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volume: null }); + } + + finalizeFailedLoadedVolume(volSet, fileNameIn, arrErrors) { + console.assert(arrErrors !== undefined); + // invoke notification + const store = this.props; + store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); + store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volume: null }); + store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: arrErrors }); + store.dispatch({ type: StoreActionType.SET_FILENAME, fileName: fileNameIn }); + store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); + } + + callbackReadProgress(ratio01) { + // console.log(`callbackReadProgress = ${ratio01}`); + const ratioPrc = Math.floor(ratio01 * 100); + const store = this.props; + console.log('ratioPrc ===================> ' + ratioPrc); + console.log('ratio01 ===================> ' + ratio01); + if (ratioPrc >= 99) { + // console.log(`callbackReadProgress. hide on = ${ratio01}`); + store.dispatch({ + type: StoreActionType.SET_PROGRESS, + progress: 0, + }); + } else { + store.dispatch({ + type: StoreActionType.SET_PROGRESS, + progress: ratioPrc, + }); + } + } // callback progress + + callbackReadComplete(errCode) { + if (errCode === undefined) { + console.log('callbackReadComplete. should be errCode'); + } else { + if (errCode !== LoadResult.SUCCESS) { + const strErr = LoadResult.getResultString(errCode); + this.setErrorString(strErr); + } + } + const store = this.props; + store.dispatch({ + type: StoreActionType.SET_PROGRESS, + progress: 0, + }); + if (errCode === LoadResult.SUCCESS) { + // console.log('callbackReadComplete finished OK'); + this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); + } else { + console.log(`callbackReadComplete failed! reading ${this.m_fileName} file`); + const arrErr = []; + const strErr = LoadResult.getResultString(errCode); + arrErr.push(strErr); + this.finalizeFailedLoadedVolume(this.m_volumeSet, this.m_fileName, arrErr); + } + } + + callbackReadSingleDicomComplete(errCode) { + if (errCode === LoadResult.SUCCESS) { + const store = this.props; + store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: this.m_volumeSet }); + store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: 0 }); + // save dicom loader to store + store.dispatch({ type: StoreActionType.SET_LOADER_DICOM, loaderDicom: this.m_loader }); + + // show modal: select window center, width + this.setState({ showModalWindowCW: true }); + return; // do nothing immediately after: wait for dialog + } + this.callbackReadComplete(errCode); + } + + callbackReadMultipleComplete(errCode) { + if (errCode !== LoadResult.SUCCESS) { + const strErr = LoadResult.getResultString(errCode); + this.setErrorString(strErr); + } + } + + onFileContentReadSingleFile() { + let strContent = this.m_fileReader.result; + this.onFileReadSingleBuffer(strContent); + console.log(this.onFileReadSingleBuffer(strContent)); + } + + // + // daikon read individual slice from file buffer (one from multiple files) + // strContent is ArrayBuffer + readSliceDicomViaDaikon(fileIndex, fileName, ratioLoad, strContent) { + const loaderDaikon = new LoaderDcmDaikon(); + return loaderDaikon.readSlice(this.m_loader, fileIndex, fileName, strContent); + } // end read single slice via daikon + + // + // based on local file read + // read from string content in this.m_fileReader.result + // + onFileReadSingleBuffer(strContent) { + // daikon read + // strContent is ArrayBuffer + if ((this.m_fileName.endsWith('.dcm') || this.m_fileName.endsWith('.DCM')) && READ_DICOM_VIA_DAIKON) { + const loaderDcm = new LoaderDcmDaikon(); + const store = this.props; + const fileIndex = this.m_fileIndex; + const fileName = this.m_fileName; + this.m_loader = new LoaderDicom(1); + const ret = loaderDcm.readSingleSlice(store, this.m_loader, fileIndex, fileName, strContent); + this.callbackReadSingleDicomComplete(ret); + return ret; + } + + console.log('UiOpenMenu. onFileReadSingleBuffer ...'); + // console.log(`file content = ${strContent.substring(0, 64)}`); + // console.log(`onFileContentRead. type = ${typeof strContent}`); + this.m_volumeSet = new VolumeSet(); + // add empty [0]-th volume in set to read single file + this.m_volumeSet.addVolume(new Volume()); + const callbackProgress = this.callbackReadProgress; + const callbackComplete = this.callbackReadComplete; + const callbackCompleteSingleDicom = this.callbackReadSingleDicomComplete; + + if (this.m_fileName.endsWith('.ktx') || this.m_fileName.endsWith('.KTX')) { + // if read ktx + // debugger; + this.m_volumeSet.readFromKtx(strContent, callbackProgress, callbackComplete); + } else if (this.m_fileName.endsWith('.nii') || this.m_fileName.endsWith('.NII')) { + this.m_volumeSet.readFromNifti(strContent, callbackProgress, callbackComplete); + } else if (this.m_fileName.endsWith('.dcm') || this.m_fileName.endsWith('.DCM')) { + this.m_loader = new LoaderDicom(); + this.m_loader.m_zDim = 1; + this.m_loader.m_numFiles = 1; + this.m_volumeSet.readFromDicom(this.m_loader, strContent, callbackProgress, callbackCompleteSingleDicom); + // save dicomInfo to store + const dicomInfo = this.m_loader.m_dicomInfo; + const sliceInfo = dicomInfo.m_sliceInfo[0]; + sliceInfo.m_fileName = this.m_fileName; + sliceInfo.m_sliceName = 'Slice 0'; + const store = this.props; + store.dispatch({ type: StoreActionType.SET_DICOM_INFO, dicomInfo: dicomInfo }); + } else if (this.m_fileName.endsWith('.hdr') || this.m_fileName.endsWith('.HDR')) { + // readOk = vol.readFromHdrHeader(strContent, callbackProgress, callbackComplete); + console.log(`cant read single hdr file: ${this.m_fileName}`); + // readStatus = LoadResult.BAD_HEADER; + } else if (this.m_fileName.endsWith('.img') || this.m_fileName.endsWith('.IMG')) { + // readOk = vol.readFromHdrImage(strContent, callbackProgress, callbackComplete); + console.log(`cant read single img file: ${this.m_fileName}`); + // readStatus = LoadResult.BAD_HEADER; + } else { + console.log(`onFileContentReadSingleFile: unknown file type: ${this.m_fileName}`); + } + } + + // + // read hdr/img. content is in this.m_fileReader.result + // + onFileContentReadMultipleHdr() { + const VALID_NUM_FILES_2 = 2; + const VALID_NUM_FILES_4 = 4; + if (this.m_numFiles !== VALID_NUM_FILES_2 && this.m_numFiles !== VALID_NUM_FILES_4) { + console.log(`onFileContentReadMultipleHdr: can read ${VALID_NUM_FILES_2} or ${VALID_NUM_FILES_4} files for multiple hdr loader`); + return; + } + + const isHdr = this.m_fileName.endsWith('hdr') || this.m_fileName.endsWith('HDR'); + console.log(`onFileContentReadMultipleHdr: read file ${this.m_fileName}. Ratio=${this.m_fileIndex} / ${this.m_numFiles}`); + this.m_fileIndex++; + const ratioLoad = this.m_fileIndex / this.m_numFiles; + const strContent = this.m_fileReader.result; + // const lenContent = strContent.length; + + if (this.m_fileIndex <= 1) { + // add single volume to set + if (this.m_volumeSet.getNumVolumes() === 0) { + this.m_volumeSet.addVolume(new Volume()); + } + this.callbackReadProgress(0.0); + } + + if (this.m_numFiles === VALID_NUM_FILES_4 && this.m_volumeRoi === null) { + this.m_volumeRoi = new Volume(); + } + + const callbackProgress = null; + const callbackComplete = null; + + const regExpFileName = /([\S]+)\.[\S]+/; + const fnameArr = regExpFileName.exec(this.m_fileName); + const numFN = fnameArr.length; + let detectedMask = false; + let detectedIntensity = false; + if (numFN === 2) { + const fname = fnameArr[1]; + if (fname.endsWith('_mask')) { + detectedMask = true; + } + if (fname.endsWith('_intn')) { + detectedIntensity = true; + } + } + let volDst = this.m_volumeSet.getVolume(0); + if (this.m_fileIndex > VALID_NUM_FILES_2) { + volDst = this.m_volumeRoi; + } + if (detectedIntensity) { + volDst = this.m_volumeSet.getVolume(0); + } + if (detectedMask) { + volDst = this.m_volumeRoi; + this.roiMode = true; + // console.log('mask vol by name'); + if (this.m_numFiles !== VALID_NUM_FILES_4) { + console.log('You need to load 4 files, if one of them has _mask in name'); + return; + } + } + + // read header or image from src files + let readOk; + if (isHdr) { + readOk = this.m_loader.readFromBufferHeader(volDst, strContent, callbackProgress, callbackComplete); + } else { + readOk = this.m_loader.readFromBufferImage(volDst, strContent, callbackProgress, callbackComplete); + } + + // create final volume from readed data + volDst = this.m_volumeSet.getVolume(0); + if (readOk && this.m_fileIndex === this.m_numFiles) { + let ok = false; + if (this.m_numFiles === VALID_NUM_FILES_2) { + ok = this.m_loader.createVolumeFromHeaderAndImage(volDst); + } else if (this.m_numFiles === VALID_NUM_FILES_4) { + // intensity data 16 -> 8 bpp + ok = this.m_loader.createVolumeFromHeaderAndImage(volDst); + if (ok) { + // mix 8 bpp intensity and roi pixels + ok = this.m_loader.createRoiVolumeFromHeaderAndImage(volDst, this.m_volumeRoi); + } + } + this.callbackReadProgress(1.0); + if (!ok) { + this.callbackReadComplete(LoadResult.FAIL); + } else { + this.callbackReadComplete(LoadResult.SUCCESS); + } + } + + // read again new file + if (this.m_fileIndex < this.m_numFiles) { + this.callbackReadProgress(ratioLoad); + this.m_fileReader.onloadend = this.onFileContentReadMultipleHdr; + const file = this.m_files[this.m_fileIndex]; + this.m_fileName = file.name; + this.m_fileReader.readAsArrayBuffer(file); + } + } // on multuple hdr + + // on complete read multuple dicom + callbackCompleteMultipleDicom(errCode) { + if (errCode !== LoadResult.SUCCESS) { + const strErr = LoadResult.getResultString(errCode); + this.setErrorString(strErr); + } + } + + // + // read from string content in this.m_fileReader.result + // + onFileContentReadMultipleDicom() { + // console.log('UiOpenMenu. onFileContentReadMultipleDicom ...'); + const strContent = this.m_fileReader.result; + this.m_fileIndex++; + const ratioLoad = this.m_fileIndex / this.m_numFiles; + // console.log(`onFileContentReadMultipleDicom. r = ${ratioLoad}`); + const callbackProgress = null; + // const callbackComplete = this.callbackReadMultipleComplete; + + if (this.m_fileIndex <= 1) { + // add new volume to volume set on the first slice + const vol = new Volume(); + this.m_volumeSet.addVolume(vol); + // init progress on the first file loading + this.callbackReadProgress(0.0); + } + + // FIX 05/06/2020: read multiple dicom callback complete + // can be invoked with error code + const callbackColmpleteVoid = this.callbackCompleteMultipleDicom; + + let readStatus; + + if (READ_DICOM_VIA_DAIKON) { + readStatus = this.readSliceDicomViaDaikon(this.m_fileIndex - 1, this.m_fileName, ratioLoad, strContent); + } else { + readStatus = this.m_volumeSet.readSingleSliceFromDicom( + this.m_loader, + this.m_fileIndex - 1, + this.m_fileName, + ratioLoad, + strContent, + callbackProgress, + callbackColmpleteVoid + ); + } + + if (readStatus !== LoadResult.SUCCESS) { + console.log('onFileContentReadMultipleDicom. Error read individual file'); + } + if (readStatus === LoadResult.SUCCESS && this.m_fileIndex === this.m_numFiles) { + // setup global vars + const store = this.props; + store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: 0 }); + store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: this.m_volumeSet }); + + // save dicom loader to store + store.dispatch({ type: StoreActionType.SET_LOADER_DICOM, loaderDicom: this.m_loader }); + // stop show loading progress bar + this.callbackReadProgress(1.0); + this.callbackReadComplete(LoadResult.SUCCESS); + + // show modal: select window center, width + this.setState({ showModalWindowCW: true }); + return; // do nothing immediately after: wait for dialog + } // end if successfully read all files (multiple dicom read) + // read again new file + if (readStatus === LoadResult.SUCCESS) { + if (this.m_fileIndex < this.m_numFiles) { + // print console loading progress + const NUM_PARTS_REPORT = 16; + const STEP_PROGRESS = Math.floor(this.m_numFiles / NUM_PARTS_REPORT); + if (this.m_fileIndex % STEP_PROGRESS === 0) { + // console.log(`onFileContentReadMultipleDicom. Loading completed = ${ratioLoad}`); + this.callbackReadProgress(ratioLoad); + } + + this.m_fileReader.onloadend = this.onFileContentReadMultipleDicom; + const file = this.m_files[this.m_fileIndex]; + this.m_fileName = file.name; + this.m_fileReader.readAsArrayBuffer(file); + } // if still need files + } else { + const arrErr = []; + const strErr = this.props.arrErrors[0]; + arrErr.push(strErr); + this.finalizeFailedLoadedVolume(this.m_volumeSet, this.m_fileName, arrErr); + } // if result is not success + } + + // + // Perform open file after it selected in dialog + handleFileSelected(evt) { + if (evt.target.files !== undefined) { + let numFiles = evt.target.files.length; + console.log(`UiOpenMenu. Trying to open ${numFiles} files`); + if (numFiles <= 0) { + return; + } + console.log(`UiOpenMenu. handleFileSelected. file[0] = ${evt.target.files[0].name}`); + // debugger; + console.log('evt = ' + evt.target.files); + this.m_volumeSet = new VolumeSet(); + if (numFiles === 1) { + const file = evt.target.files[0]; + this.m_fileName = file.name; + this.m_fileSize = file.size; + console.log('this.m_fileSize ->>>>>>>>>>>>>> ' + this.m_fileSize); + console.log('evt.loaded ->>>>>>>>>>>>>> ' + evt.loaded); + console.log('evt.total ->>>>>>>>>>>>>> ' + evt.total); + + // read gzip + if (this.m_fileName.endsWith('.gz')) { + // here will be result raw buffer + this.m_unzippedBuffer = null; + + // remove last 3 chars form file name string + this.m_fileName = this.m_fileName.slice(0, -3); + + const store = this.props; + + const gunzip = zlib.createGunzip(); + createReadStream(file).pipe(gunzip); + gunzip.on('data', (data) => { + if (this.m_unzippedBuffer == null) { + store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); + } else { + const readSize = this.m_unzippedBuffer.length; + const allSize = file.size; + const KOEF_DEFLATE = 0.28; + const ratio100 = Math.floor((readSize * 100.0 * KOEF_DEFLATE) / allSize); + store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: ratio100 }); + } + + // read the data chunk-by-chunk + // data is Uint8Array + const dataSize = data.length; + if (this.m_unzippedBuffer == null) { + // create buffer from first ungzipped data chunk + this.m_unzippedBuffer = new Uint8Array(dataSize); + this.m_unzippedBuffer.set(data, 0); + } else { + // append buffer from 2,3,... ungzipped data chunks + const dataCollectedSize = this.m_unzippedBuffer.length; + const arrNew = new Uint8Array(dataCollectedSize + dataSize); + arrNew.set(this.m_unzippedBuffer, 0); + arrNew.set(data, dataCollectedSize); + this.m_unzippedBuffer = arrNew; + } + }); + gunzip.on('close', () => { + console.log('gzip on close'); + }); + + gunzip.on('end', () => { + store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); + // now all chunks are read. Need to check raw ungzipped buffer + const sizeBuffer = this.m_unzippedBuffer.length; + if (sizeBuffer < 128) { + console.log('Too small ungzipped data: ' + sizeBuffer.toString() + " bytes. can't read volume data"); + return; + } + // check correct nifti header after extract raw bytes from gzip + const headTemplate = [0x00, 0x00, 0x01, 0x5c]; + let correctHead0 = true; + for (let i = 0; i < 4; i++) { + if (this.m_unzippedBuffer[i] !== headTemplate[i]) { + correctHead0 = false; + } + } + let correctHead1 = true; + for (let i = 0; i < 4; i++) { + if (this.m_unzippedBuffer[i] !== headTemplate[3 - i]) { + correctHead1 = false; + } + } + if (!correctHead0 && !correctHead1) { + console.log('Wrong nifi header, cant read gzipped file'); + return; + } + console.log('ungzip done with ' + sizeBuffer.toString() + ' bytes. Correct nifti header detected'); + // process raw data buffer + this.onFileReadSingleBuffer(this.m_unzippedBuffer); + }); + return; + } // if gzipped file + this.m_fileReader = new FileReader(); + const progressHandler = ({ loaded, total }) => { + // debugger; + this.callbackReadProgress(loaded / total); + }; + this.m_fileReader.addEventListener('progress', progressHandler); + this.m_fileReader.onloadend = this.onFileContentReadSingleFile; + this.m_fileReader.readAsArrayBuffer(file); + } else { + // not single file was open + this.m_files = Array.from(evt.target.files); // FileList -> Array + this.m_fileIndex = 0; + this.m_numFiles = numFiles; + this.m_fileReader = new FileReader(); + // if multiple files, create Dicom loader + this.m_loader = null; + if (evt.target.files[0].name.endsWith('.dcm')) { + // remove non-dcm files + let numFilesNew = 0; + for (let i = numFiles - 1; i >= 0; i--) { + if (this.m_files[i].name.endsWith('.dcm')) { + numFilesNew++; + } else { + this.m_files.splice(i, 1); + } + } + numFiles = numFilesNew; + this.m_numFiles = numFilesNew; + + this.m_loader = new LoaderDicom(numFiles); + const dicomInfo = this.m_loader.m_dicomInfo; + + // save dicomInfo to store + const store = this.props; + store.dispatch({ type: StoreActionType.SET_DICOM_INFO, dicomInfo: dicomInfo }); + + // save dicom loader to store + store.dispatch({ type: StoreActionType.SET_LOADER_DICOM, loaderDicom: this.m_loader }); + + this.m_fileReader.onloadend = this.onFileContentReadMultipleDicom; + } else if (evt.target.files[0].name.endsWith('.hdr') || evt.target.files[0].name.endsWith('.img')) { + this.m_loader = new LoaderHdr(numFiles); + this.m_fileReader.onloadend = this.onFileContentReadMultipleHdr; + } + + //const vol = new Volume(); + //this.m_volume = vol; + this.m_volumeRoi = null; + + const file = evt.target.files[0]; + this.m_fileName = file.name; + this.m_fileReader.readAsArrayBuffer(file); + } // if num files > 1 + } // if event is not empty + } + + buildFileSelector() { + const fileSelector = document.createElement('input'); + fileSelector.setAttribute('type', 'file'); + fileSelector.setAttribute('hidden', 'true'); + fileSelector.setAttribute('accept', '.txt,.ktx,.dcm,.nii,.hdr,.h,.img,.gz'); + fileSelector.setAttribute('multiple', 'true'); + document.body.appendChild(fileSelector); + fileSelector.onchange = this.handleFileSelected; + return fileSelector; + } + + onButtonOpenLocalFileClick(evt) { + // console.log('onButtonLocalFile started'); + // debugger; + evt.preventDefault(); + this.m_fileSelector.click(); + } + + // + onModalUrlShow() { + console.log(`onModalUrlShow`); + this.setState({ showModalUrl: true }); + } + + onModalUrlHide() { + console.log(`onModalUrlHide`); + this.setState({ showModalUrl: false }); + } + + callbackReadCompleteUrlKtxNii(codeResult) { + if (codeResult !== LoadResult.SUCCESS) { + console.log(`onCompleteFromUrlKtx. Bad result: ${codeResult}`); + + const arrErrors = []; + const strErr = LoadResult.getResultString(codeResult); + arrErrors.push(strErr); + this.finalizeFailedLoadedVolume(this.m_volumeSet, this.m_fileName, arrErrors); + } else { + this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); + this.callbackReadComplete(LoadResult.SUCCESS, null, 0, null); + } + } + + loadFromUrl(strUrl) { + if (FileTools.isValidUrl(strUrl)) { + this.m_url = strUrl; + + this.m_fileName = FileTools.getFileNameFromUrl(strUrl); + this.m_volumeSet = new VolumeSet(); + this.m_volumeSet.addVolume(new Volume()); + + if (strUrl.endsWith('.ktx')) { + // debugger; + const callbackProgress = this.callbackReadProgress; + const callbackComplete = this.callbackReadCompleteUrlKtxNii; + this.callbackReadProgress(0.0); + // debugger; + this.m_volumeSet.readFromKtxUrl(strUrl, callbackProgress, callbackComplete); + // if KTX + } else if (strUrl.endsWith('.nii')) { + const callbackProgress = this.callbackReadProgress; + const callbackComplete = this.callbackReadCompleteUrlKtxNii; + this.callbackReadProgress(0.0); + this.m_volumeSet.readFromNiiUrl(strUrl, callbackProgress, callbackComplete); + // if NII (Nifti format) + } else if (strUrl.endsWith('.dcm')) { + if (READ_DICOM_VIA_DAIKON) { + const loaderUrlDcm = new LoaderDcmUrlDaikon(); + return loaderUrlDcm.readFromUrl(this.m_volumeSet, strUrl, this.callbackReadCompleteUrlKtxNii, this.callbackReadProgress); + } + + const callbackProgress = this.callbackReadProgress; + const callbackComplete = this.callbackReadCompleteUrlKtxNii; + this.callbackReadProgress(0.0); + this.m_volumeSet.readFromDicomUrl(strUrl, callbackProgress, callbackComplete); + // if Dicom + } else if (strUrl.endsWith('.hdr')) { + const callbackProgress = this.callbackReadProgress; + const callbackComplete = this.callbackReadCompleteUrlKtxNii; + this.callbackReadProgress(0.0); + this.m_volumeSet.readFromHdrUrl(strUrl, callbackProgress, callbackComplete); + // if Hdr + } else { + console.log(`UiOpenMenu. Unknown file type from URL = ${strUrl}`); + } + } else { + const strErr = `UiOpenMenu. Bad URL = ${strUrl}`; + console.log(strErr); + this.setErrorString(strErr); + } + } + + onClickLoadUrl(strUrl) { + this.setState({ showModalUrl: false }); + console.log(`onClickLoadUrl with strUrl = ${strUrl}`); + this.loadFromUrl(strUrl); + } + + // + onModalDemoOpenShow() { + this.setState({ showModalDemo: true }); + } + + onModalDemoOpenHide() { + this.setState({ showModalDemo: false }); + } + + // + arrNumToStr(arrNums) { + const numLet = arrNums.length; + let str = ''; + for (let i = 0; i < numLet; i++) { + const n = arrNums[i]; + str = str.concat(String.fromCharCode(n)); + } + return str; + } + + onModalGoogleShow() { + this.setState({ showModalGoogle: true }); + } + + onModalGoogleHide() { + this.setState({ showModalGoogle: false }); + } + + onGoogleSelected(index) { + // perform action on click i-th item in Google cloud menu . Or remove this menu completely + console.log(`onGoogleSelected(${index}) ... `); + } + + onDemoSelected(index) { + const store = this.props; + store.dispatch({ + type: StoreActionType.SET_PROGRESS, + progress: 0, + }); + store.dispatch({ type: StoreActionType.SET_SPINNER, spinner: true }); + const arr = config.demoUrls; + if (arr.length >= 8) { + const fileName = arr[index]; + console.log(`onDemoSelected: load file ${fileName}, config[ ${index} ]`); + this.loadFromUrl(fileName); + return; + } + + const DEMO_URL = 'https://d8ohfj70qg23c.cloudfront.net/demo/'; + + let fileName = + DEMO_URL + + [ + '01_lungs/20101108.ktx', + '02_brain_set/brain256.ktx', + '03_grandmother_gm3/gm3_512_512_165.nii', + '04_woman_pelvis/file_list.txt', + '05_lungs_00cba/file_list.txt', + '06_ct_256/ct_256_256_256.ktx', + '07_lungs_256/lungs_256_256_256.ktx', + '08_brain_with_roi/set_intn.hdr', + ][index] || console.log(`onDemoSelected. not implemented for index = ${index}`); + + if (fileName === '04_woman_pelvis/file_list.txt') { + const numUrls = config.demoWomanPelvisUrls.length; + if (numUrls > 0) { + const strPrefix = config.demoWomanPelvisPrefix; + // console.log(`config. prefix = ${strPrefix}`); + const arrFileNames = []; + for (let i = 0; i < numUrls; i++) { + const strFn = config.demoWomanPelvisUrls[i]; + const url = `${strPrefix}${strFn}`; + arrFileNames.push(url); + } + const store = this.props; + const loader = new LoaderUrlDicom(store); + const GOOGLE_HEADER = false; + loader.loadFromUrlArray(arrFileNames, GOOGLE_HEADER); + return; + } + } + if (fileName === '05_lungs_00cba/file_list.txt') { + const numUrls = config.demoLungsUrls.length; + if (numUrls > 0) { + const strPrefix = config.demoLungsPrefix; + const arrFileNames = []; + for (let i = 0; i < numUrls; i++) { + const strFn = config.demoLungsUrls[i]; + const url = `${strPrefix}${strFn}`; + arrFileNames.push(url); + } + const store = this.props; + const loader = new LoaderUrlDicom(store); + const GOOGLE_HEADER = false; + loader.loadFromUrlArray(arrFileNames, GOOGLE_HEADER); + return; + } + } + if (fileName.length > 0) { + console.log(`onDemoSelected. enc = ${fileName}`); + this.loadFromUrl(fileName); + } + } + + // + shouldComponentUpdate() { + return true; + } + + onModalDicomSeriesHide() { + const arrEmpty = []; + const store = this.props; + store.dispatch({ type: StoreActionType.SET_DICOM_SERIES, dicomSeries: arrEmpty }); + } + + onDicomSerieSelected(indexSelected) { + const store = this.props; + const series = store.dicomSeries; + const serieSelected = series[indexSelected]; + const hash = serieSelected.m_hash; + this.m_loader.createVolumeFromSlices(this.m_volumeSet, indexSelected, hash); + this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); + console.log(`onFileContentReadMultipleDicom read all ${this.m_numFiles} files`); + + // clear modal + store.dispatch({ type: StoreActionType.SET_DICOM_SERIES, dicomSeries: [] }); + } + + // + onModalWindowCWHide(needShow) { + this.setState({ showModalWindowCW: false }); + if (needShow) { + this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); + // setup dicom series (volumes info) for global store: select volume later + const store = this.props; + let series = null; + if (this.m_loader !== undefined) { + series = this.m_loader.m_slicesVolume.getSeries(); + store.dispatch({ type: StoreActionType.SET_DICOM_SERIES, dicomSeries: series }); + } + // update graphics 2d window + const gra = store.graphics2d; + if (gra !== null) { + gra.forceUpdate(); + } + } + } + + // + // invoked after render + // + componentDidMount() { + this.m_fileSelector = this.buildFileSelector(); + const fileNameOnLoad = this.m_fileNameOnLoad; + // console.log(`UiOpenMenu. componentDidMount. fnonl = ${fileNameOnLoad}`); + if (fileNameOnLoad.length > 0 && this.state.onLoadCounter > 0) { + this.setState({ onLoadCounter: 0 }); + const TIMEOUT_MS = 50; + // debugger; + setTimeout(this.loadFromUrl(fileNameOnLoad), TIMEOUT_MS); + } + } +} + +export default FileReader; diff --git a/src/engine/loaders/FileTools.js b/src/engine/loaders/FileTools.js new file mode 100644 index 00000000..cfb34d2a --- /dev/null +++ b/src/engine/loaders/FileTools.js @@ -0,0 +1,46 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +class FileTools { + static isValidUrl(string) { + let url; + + try { + url = new URL(string); + } catch (_) { + return false; + } + + return url.protocol === 'http:' || url.protocol === 'https:'; + } + + static getFileNameFromUrl(strUrl) { + let idx = strUrl.lastIndexOf('/'); + if (idx < 0) { + idx = strUrl.lastIndexOf('\\'); + } + if (idx < 0) { + console.log('getFileNameFromUrl: wrong URL!'); + return ''; + } + let strFileName = strUrl.substring(idx + 1); + const MAX_LEN = 40; + strFileName = strFileName.length <= MAX_LEN ? strFileName : strFileName.substring(0, MAX_LEN); + return strFileName; + } + + static getFolderNameFromUrl(strUrl) { + let idx = strUrl.lastIndexOf('/'); + if (idx < 0) { + idx = strUrl.lastIndexOf('\\'); + } + if (idx < 0) { + console.log('getFolderNameFromUrl: wrong URL!'); + return ''; + } + return strUrl.substring(0, idx); + } +} +export default FileTools; diff --git a/src/demo/engine/loaders/LoadDcmUrlDiakon.js b/src/engine/loaders/LoadDcmUrlDiakon.js similarity index 84% rename from src/demo/engine/loaders/LoadDcmUrlDiakon.js rename to src/engine/loaders/LoadDcmUrlDiakon.js index d0aaa0a2..78259f85 100644 --- a/src/demo/engine/loaders/LoadDcmUrlDiakon.js +++ b/src/engine/loaders/LoadDcmUrlDiakon.js @@ -1,3 +1,8 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + // // // @@ -32,38 +37,38 @@ class LoaderDcmUrlDaikon { readFromUrl(volSet, strUrl, callbackComplete, callbackProgress) { // check arguments - console.assert(volSet != null, "Null volume"); - console.assert(volSet instanceof VolumeSet, "Should be volume set"); - console.assert(strUrl != null, "Null string url"); - console.assert(typeof(strUrl) === 'string', "Should be string in url"); - - // replace file name to 'file_list.txt' - const ft = new FileTools(); - const isValidUrl = ft.isValidUrl(strUrl); - if (!isValidUrl) { + console.assert(volSet != null, 'Null volume'); + console.assert(volSet instanceof VolumeSet, 'Should be volume set'); + console.assert(strUrl != null, 'Null string url'); + console.assert(typeof strUrl === 'string', 'Should be string in url'); + + if (!FileTools.isValidUrl(strUrl)) { console.log(`readFromUrl: not vaild URL = = ${strUrl} `); return false; } - this.m_folder = ft.getFolderNameFromUrl(strUrl); + this.m_folder = FileTools.getFolderNameFromUrl(strUrl); const urlFileList = this.m_folder + '/file_list.txt'; console.log(`readFromUrl: load file = ${urlFileList} `); callbackProgress(0.0); - + const fileLoader = new FileLoader(urlFileList); this.m_fileListCounter = 0; - fileLoader.readFile((arrBuf) => { - this.m_fileListCounter += 1; - if (this.m_fileListCounter === 1) { - const okRead = this.readReadyFileList(volSet, arrBuf, callbackComplete, callbackProgress); - return okRead; + fileLoader.readFile( + (arrBuf) => { + this.m_fileListCounter += 1; + if (this.m_fileListCounter === 1) { + const okRead = this.readReadyFileList(volSet, arrBuf, callbackComplete, callbackProgress); + return okRead; + } + return true; + }, + (errMsg) => { + console.log(`Error read file: ${errMsg}`); + // callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); + return false; } - return true; - }, (errMsg) => { - console.log(`Error read file: ${errMsg}`); - // callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); - return false; - }); // get file from server + ); // get file from server return true; } // end read from url @@ -98,7 +103,6 @@ class LoaderDcmUrlDaikon { this.m_errors[i] = -1; this.m_loaders[i] = null; } - const zDim = numFiles; console.log(`Loaded file list. ${numFiles} files will be loaded. 1st file in list is = ${arrFileNames[0]}`); @@ -127,7 +131,7 @@ class LoaderDcmUrlDaikon { // eslint-disable-next-line y: +1.0e12, // eslint-disable-next-line - z: +1.0e12 + z: +1.0e12, }; this.m_loaderDaikon.m_loaderDicom.m_imagePosMax = { // eslint-disable-next-line @@ -135,7 +139,7 @@ class LoaderDcmUrlDaikon { // eslint-disable-next-line y: -1.0e12, // eslint-disable-next-line - z: -1.0e12 + z: -1.0e12, }; // eslint-disable-next-line @@ -143,7 +147,7 @@ class LoaderDcmUrlDaikon { // eslint-disable-next-line this.m_loaderDaikon.m_sliceLocMax = -1.0e12; - for (let i = 0; (i < this.m_numLoadedFiles) && (this.m_numFailsLoad < 1); i++) { + for (let i = 0; i < this.m_numLoadedFiles && this.m_numFailsLoad < 1; i++) { const urlFile = `${this.m_folder}/${arrFileNames[i]}`; // console.log(`trying read file ${urlFile} from web`); @@ -152,7 +156,7 @@ class LoaderDcmUrlDaikon { loader.readFile((fileArrBu) => { const ratioLoaded = this.m_filesLoadedCounter / this.m_numLoadedFiles; const VAL_MASK = 7; - if ((callbackProgress !== undefined) && ((this.m_filesLoadedCounter & VAL_MASK) === 0)) { + if (callbackProgress !== undefined && (this.m_filesLoadedCounter & VAL_MASK) === 0) { //console.log(`LoadDcmUrlDaikon. Progress = ${ratioLoaded}`); callbackProgress(ratioLoaded); } @@ -174,7 +178,7 @@ class LoaderDcmUrlDaikon { const imagePosBox = { x: this.m_loaderDaikon.m_loaderDicom.m_imagePosMax.x - this.m_loaderDaikon.m_loaderDicom.m_imagePosMin.x, y: this.m_loaderDaikon.m_loaderDicom.y - this.m_loaderDaikon.m_loaderDicom.m_imagePosMin.y, - z: this.m_loaderDaikon.m_loaderDicom.m_imagePosMax.z - this.m_loaderDaikon.m_loaderDicom.m_imagePosMin.z + z: this.m_loaderDaikon.m_loaderDicom.m_imagePosMax.z - this.m_loaderDaikon.m_loaderDicom.m_imagePosMin.z, }; const TOO_MIN = 0.00001; let zBox; @@ -194,7 +198,7 @@ class LoaderDcmUrlDaikon { } const xDim = this.m_loaderDaikon.m_loaderDicom.m_xDim; const yDim = this.m_loaderDaikon.m_loaderDicom.m_yDim; - + this.m_loaderDaikon.m_loaderDicom.m_pixelSpacing.z = zBox / zDim; this.m_boxSize.z = zDim * this.m_loaderDaikon.m_loaderDicom.m_pixelSpacing.z; this.m_boxSize.x = xDim * this.m_loaderDaikon.m_loaderDicom.m_pixelSpacing.x; @@ -209,7 +213,7 @@ class LoaderDcmUrlDaikon { } const indexSerie = 0; const hash = series[indexSerie].m_hash; - const errStatus = this.m_loaderDaikon.m_loaderDicom.createVolumeFromSlices(volSet, indexSerie, hash); + const errStatus = this.m_loaderDaikon.m_loaderDicom.createVolumeFromSlices(volSet, indexSerie, hash); if (callbackProgress !== null) { callbackProgress(1.0); } @@ -220,12 +224,10 @@ class LoaderDcmUrlDaikon { } } // if last file }); // file buffer is ready to parse - } // for i all files return LoadResult.SUCCESS; } // end readReadyFileList - } // end class LoaderDcmUrlDaikon export default LoaderDcmUrlDaikon; diff --git a/src/engine/loaders/LoadPromise.js b/src/engine/loaders/LoadPromise.js new file mode 100644 index 00000000..0226bc01 --- /dev/null +++ b/src/engine/loaders/LoadPromise.js @@ -0,0 +1,95 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** +/** +* File load from local disk or URL with promise to complete +* @module demo/engine.loaders/loadpromise +*/ + +// ****************************************************************** +// class LoadFilePromise +// ****************************************************************** + +/** Class LoadFilePromise implements local and remote (via URL) file reading functionality via Promises */ +export default class LoadFilePromise { + constructor() { + this.m_file = null; + this.m_reader = null; + this.m_request = null; + } + + /** + * Read local file. If success, invoke resolve callback for created promise + * + * @param {object} file - file to read + * @return {object} Promise, working after file will be read + */ + readLocal(file) { + return new Promise((resolve) => { + this.m_file = file; + this.m_reader = new FileReader(); + this.m_reader.addEventListener('load', (evt) => { + const arrBuf = evt.target.result; + if (resolve) { + resolve(arrBuf); + } + }); + this.m_reader.readAsArrayBuffer(this.m_file); + }); + } + + /** + * Read remote file (via promise). If success, invoke resolve callback for created promise + * + * @param {string} url - file to read + * @return {object} Promise, working after file will be read + */ + readFromUrl(url) { + return new Promise((resolve, reject) => { + this.m_url = url; + this.m_request = null; + const METHOD = 'GET'; + this.m_request = new XMLHttpRequest(); + if ('withCredentials' in this.m_request) { + // this.m_request.withCredentials = true; + const NEED_ASYNC = true; + this.m_request.open(METHOD, this.m_url, NEED_ASYNC); + // } else if (typeof XDomainRequest !== 'undefined') { + // console.log('HttpRequest: XDomainRequest will be used'); + // this.m_request = new XDomainRequest(); + // this.m_request.open(METHOD, this.m_url); + } else { + this.m_request = null; + console.log('This browser cant support CORS requests'); + return; + } + this.m_request.responseType = 'arraybuffer'; // "blob" + this.m_request.addEventListener( + 'load', + (event) => { + const arrBuf = event.target.response; + if (arrBuf === null) { + console.log('Bad response type. Expect object type in response.'); + } else { + resolve(arrBuf); + } + }, + false + ); + + this.m_request.addEventListener( + 'error', + (event) => { + const strError = `Error event happend for XMLHttpRequest: loaded = ${event.loaded}, total = ${event.total}`; + console.log(strError); + reject(strError); + }, + false + ); + this.m_request.send(); + }); + } +} diff --git a/src/demo/engine/loaders/LoaderDcmDaikon.js b/src/engine/loaders/LoaderDcmDaikon.js similarity index 79% rename from src/demo/engine/loaders/LoaderDcmDaikon.js rename to src/engine/loaders/LoaderDcmDaikon.js index a1da5147..c9265217 100644 --- a/src/demo/engine/loaders/LoaderDcmDaikon.js +++ b/src/engine/loaders/LoaderDcmDaikon.js @@ -1,3 +1,8 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + // // // @@ -7,7 +12,7 @@ // ********************************************** // 31.08.2020. Daikon reader -import daikon from 'daikon'; +import daikon from 'daikon'; import DicomSliceInfo from './dicomsliceinfo'; import LoadResult from '../LoadResult'; import LoaderDicom from './LoaderDicom'; @@ -32,7 +37,7 @@ const READ_DICOMDIR = false; // ********************************************** class LoaderDcmDaikon { - constructor(){ + constructor() { this.m_loaderDicom = null; } @@ -46,10 +51,10 @@ class LoaderDcmDaikon { try { image = daikon.Series.parseImage(dataFile); } catch (err) { - console.log("error parse dcm file buffer"); + console.log('error parse dcm file buffer'); return LoadResult.BAD_DICOM; } - if ((image === undefined) || (image === null)) { + if (image === undefined || image === null) { return LoadResult.BAD_DICOM; } const TAG_DIRECTORY_REC = [0x0004, 0x1220]; @@ -61,20 +66,20 @@ class LoaderDcmDaikon { const numEntries = tagDirRec.value.length; for (let k = 0; k < numEntries; k++) { let dirEntry = tagDirRec.value[k]; - if ((dirEntry.element === 57344) && (dirEntry.group === 65534)) { + if (dirEntry.element === 57344 && dirEntry.group === 65534) { const numSub = dirEntry.value.length; for (let s = 0; s < numSub; s++) { let elemSub = dirEntry.value[s]; - if ((elemSub.element === 5168) && (elemSub.group === 4)) { + if (elemSub.element === 5168 && elemSub.group === 4) { //const str = elemSub.value[0]; //console.log(`elem sub val = ${str}`); } - if ((elemSub.element === 5376) && (elemSub.group === 4)) { + if (elemSub.element === 5376 && elemSub.group === 4) { const fold = elemSub.value[0]; const fname = elemSub.value[1]; console.log(`image nm = ${fold} / ${fname}`); } - } // for s, all sub elemenst + } // for s, all sub elemenst } // if entry with patient and image information } // for k all entries in dir } // if dir rec found @@ -89,17 +94,17 @@ class LoaderDcmDaikon { try { image = daikon.Series.parseImage(dataFile); } catch (err) { - console.log("error parse dcm file buffer"); + console.log('error parse dcm file buffer'); return LoadResult.BAD_DICOM; } - if ((image === undefined) || (image === null)) { + if (image === undefined || image === null) { return LoadResult.BAD_DICOM; } // console.log("dcm parse completed"); const yDim = image.getRows(); const xDim = image.getCols(); const bits = image.getBitsAllocated(); - if ((bits !== 8) && (bits !== 16)) { + if (bits !== 8 && bits !== 16) { console.log('Parse Dicom data. Strange bits per pixel = ' + bits.toString()); } // data for hash code evaluate @@ -112,7 +117,6 @@ class LoaderDcmDaikon { //const hasPixels = image.hasPixelData(); //const isComp = image.isCompressed(); - const dicomInfo = this.m_loaderDicom.m_dicomInfo; //const volSlice = this.m_loaderDicom.m_slicesVolume.getNewSlice(); const volSlice = new DicomSlice(); @@ -122,7 +126,7 @@ class LoaderDcmDaikon { volSlice.m_studyDescr = studyDescr; volSlice.m_studyDate = studyDate; volSlice.m_seriesTime = seriesTime; - volSlice.m_seriesDescr = seriesDescr; + volSlice.m_seriesDescr = seriesDescr; volSlice.m_bodyPartExamined = bodyPartExamined; volSlice.buildHash(); @@ -151,46 +155,69 @@ class LoaderDcmDaikon { const TAG_PADDING_VALUE = [0x0028, 0x0120]; const knownTags = [ // image dims - daikon.Tag.TAG_ROWS, daikon.Tag.TAG_COLS, daikon.Tag.TAG_ACQUISITION_MATRIX, - daikon.Tag.TAG_NUMBER_OF_FRAMES, daikon.Tag.TAG_NUMBER_TEMPORAL_POSITIONS, + daikon.Tag.TAG_ROWS, + daikon.Tag.TAG_COLS, + daikon.Tag.TAG_ACQUISITION_MATRIX, + daikon.Tag.TAG_NUMBER_OF_FRAMES, + daikon.Tag.TAG_NUMBER_TEMPORAL_POSITIONS, // voxel dims - daikon.Tag.TAG_PIXEL_SPACING, daikon.Tag.TAG_SLICE_THICKNESS, daikon.Tag.TAG_SLICE_GAP, - daikon.Tag.TAG_TR, daikon.Tag.TAG_FRAME_TIME, + daikon.Tag.TAG_PIXEL_SPACING, + daikon.Tag.TAG_SLICE_THICKNESS, + daikon.Tag.TAG_SLICE_GAP, + daikon.Tag.TAG_TR, + daikon.Tag.TAG_FRAME_TIME, // datatype - daikon.Tag.TAG_BITS_ALLOCATED, daikon.Tag.TAG_BITS_STORED, - daikon.Tag.TAG_PIXEL_REPRESENTATION, daikon.Tag.TAG_HIGH_BIT, - daikon.Tag.TAG_PHOTOMETRIC_INTERPRETATION, daikon.Tag.TAG_SAMPLES_PER_PIXEL, - daikon.Tag.TAG_PLANAR_CONFIG, daikon.Tag.TAG_PALETTE_RED, daikon.Tag.TAG_PALETTE_GREEN, + daikon.Tag.TAG_BITS_ALLOCATED, + daikon.Tag.TAG_BITS_STORED, + daikon.Tag.TAG_PIXEL_REPRESENTATION, + daikon.Tag.TAG_HIGH_BIT, + daikon.Tag.TAG_PHOTOMETRIC_INTERPRETATION, + daikon.Tag.TAG_SAMPLES_PER_PIXEL, + daikon.Tag.TAG_PLANAR_CONFIG, + daikon.Tag.TAG_PALETTE_RED, + daikon.Tag.TAG_PALETTE_GREEN, daikon.Tag.TAG_PALETTE_BLUE, // data scale - daikon.Tag.TAG_DATA_SCALE_SLOPE, daikon.Tag.TAG_DATA_SCALE_INTERCEPT, - daikon.Tag.TAG_DATA_SCALE_ELSCINT, daikon.Tag.TAG_PIXEL_BANDWIDTH, + daikon.Tag.TAG_DATA_SCALE_SLOPE, + daikon.Tag.TAG_DATA_SCALE_INTERCEPT, + daikon.Tag.TAG_DATA_SCALE_ELSCINT, + daikon.Tag.TAG_PIXEL_BANDWIDTH, // range - daikon.Tag.TAG_IMAGE_MIN, daikon.Tag.TAG_IMAGE_MAX, - daikon.Tag.TAG_WINDOW_CENTER, daikon.Tag.TAG_WINDOW_WIDTH, + daikon.Tag.TAG_IMAGE_MIN, + daikon.Tag.TAG_IMAGE_MAX, + daikon.Tag.TAG_WINDOW_CENTER, + daikon.Tag.TAG_WINDOW_WIDTH, // description - daikon.Tag.TAG_PATIENT_NAME, daikon.Tag.TAG_PATIENT_ID, - daikon.Tag.TAG_STUDY_DATE, daikon.Tag.TAG_STUDY_TIME, - daikon.Tag.TAG_STUDY_DES, daikon.Tag.TAG_IMAGE_TYPE, - daikon.Tag.TAG_IMAGE_COMMENTS, daikon.Tag.TAG_SEQUENCE_NAME, + daikon.Tag.TAG_PATIENT_NAME, + daikon.Tag.TAG_PATIENT_ID, + daikon.Tag.TAG_STUDY_DATE, + daikon.Tag.TAG_STUDY_TIME, + daikon.Tag.TAG_STUDY_DES, + daikon.Tag.TAG_IMAGE_TYPE, + daikon.Tag.TAG_IMAGE_COMMENTS, + daikon.Tag.TAG_SEQUENCE_NAME, daikon.Tag.TAG_MODALITY, daikon.Tag.TAG_FRAME_OF_REF_UID, daikon.Tag.TAG_STUDY_UID, // volume id - daikon.Tag.TAG_SERIES_DESCRIPTION, daikon.Tag.TAG_SERIES_INSTANCE_UID, - daikon.Tag.TAG_SERIES_NUMBER, daikon.Tag.TAG_ECHO_NUMBER, + daikon.Tag.TAG_SERIES_DESCRIPTION, + daikon.Tag.TAG_SERIES_INSTANCE_UID, + daikon.Tag.TAG_SERIES_NUMBER, + daikon.Tag.TAG_ECHO_NUMBER, daikon.Tag.TAG_TEMPORAL_POSITION, // slice id - daikon.Tag.TAG_IMAGE_NUM, daikon.Tag.TAG_SLICE_LOCATION, + daikon.Tag.TAG_IMAGE_NUM, + daikon.Tag.TAG_SLICE_LOCATION, // orientation - daikon.Tag.TAG_IMAGE_ORIENTATION, daikon.Tag.TAG_IMAGE_POSITION, + daikon.Tag.TAG_IMAGE_ORIENTATION, + daikon.Tag.TAG_IMAGE_POSITION, daikon.Tag.TAG_SLICE_LOCATION_VECTOR, // lut shape daikon.Tag.TAG_LUT_SHAPE, @@ -206,21 +233,19 @@ class LoaderDcmDaikon { const TAG_PHYSICANS_NAME = [0x0008, 0x0090]; dicomInfo.m_patientName = image.getPatientName(); - dicomInfo.m_patientDateOfBirth = daikon.Image.getSingleValueSafely(image.getTag(TAG_PATIENT_BIRTH_DATE[0], - TAG_PATIENT_BIRTH_DATE[1]), 0); + dicomInfo.m_patientDateOfBirth = daikon.Image.getSingleValueSafely( + image.getTag(TAG_PATIENT_BIRTH_DATE[0], TAG_PATIENT_BIRTH_DATE[1]), + 0 + ); dicomInfo.m_seriesDescr = seriesDescr; dicomInfo.m_studyDescr = studyDescr; dicomInfo.m_studyDate = studyDate; dicomInfo.m_seriesTime = seriesTime; - dicomInfo.m_bodyPartExamined = daikon.Image.getSingleValueSafely(image.getTag(TAG_BODY_PART_EXAMINED[0], - TAG_BODY_PART_EXAMINED[1]), 0); - dicomInfo.m_institutionName = daikon.Image.getSingleValueSafely(image.getTag(TAG_INSTITUTION_NAME[0], - TAG_INSTITUTION_NAME[1]), 0); - dicomInfo.m_operatorsName = daikon.Image.getSingleValueSafely(image.getTag(TAG_OPERATORS_NAME[0], - TAG_OPERATORS_NAME[1]), 0); - dicomInfo.m_physicansName = daikon.Image.getSingleValueSafely(image.getTag(TAG_PHYSICANS_NAME[0], - TAG_PHYSICANS_NAME[1]), 0); + dicomInfo.m_bodyPartExamined = daikon.Image.getSingleValueSafely(image.getTag(TAG_BODY_PART_EXAMINED[0], TAG_BODY_PART_EXAMINED[1]), 0); + dicomInfo.m_institutionName = daikon.Image.getSingleValueSafely(image.getTag(TAG_INSTITUTION_NAME[0], TAG_INSTITUTION_NAME[1]), 0); + dicomInfo.m_operatorsName = daikon.Image.getSingleValueSafely(image.getTag(TAG_OPERATORS_NAME[0], TAG_OPERATORS_NAME[1]), 0); + dicomInfo.m_physicansName = daikon.Image.getSingleValueSafely(image.getTag(TAG_PHYSICANS_NAME[0], TAG_PHYSICANS_NAME[1]), 0); // save all known tags to info array (can be displayed in app UI) const numKnownTags = knownTags.length; @@ -234,18 +259,16 @@ class LoaderDcmDaikon { // const sliceInfo = dicomInfo.m_sliceInfo[0]; const tagInfo = new DicomTagInfo(); - tagInfo.m_tag = '(' + - LoaderDicom.numberToHexString(group) + ',' + - LoaderDicom.numberToHexString(element) + ')'; + tagInfo.m_tag = '(' + LoaderDicom.numberToHexString(group) + ',' + LoaderDicom.numberToHexString(element) + ')'; const strTagName = this.m_loaderDicom.m_dictionary.getTextDesc(group, element); - tagInfo.m_attrName = (strTagName.length > 1) ? strTagName : ''; - + tagInfo.m_attrName = strTagName.length > 1 ? strTagName : ''; + // let strVal = LoaderDicom.getAttrValueAsString(tag); let strVal = ''; if (val !== null) { strVal = val.toString(); } - + tagInfo.m_attrValue = strVal; sliceInfo.m_tags.push(tagInfo); if (NEED_DEBUG_PRINT_TAGS) { @@ -261,8 +284,8 @@ class LoaderDcmDaikon { if (tagSLoc !== undefined) { let sliceLoc = tagSLoc.value[0]; volSlice.m_sliceLocation = sliceLoc; - this.m_sliceLocMin = (sliceLoc < this.m_sliceLocMin) ? sliceLoc : this.m_sliceLocMin; - this.m_sliceLocMax = (sliceLoc > this.m_sliceLocMax) ? sliceLoc : this.m_sliceLocMax; + this.m_sliceLocMin = sliceLoc < this.m_sliceLocMin ? sliceLoc : this.m_sliceLocMin; + this.m_sliceLocMax = sliceLoc > this.m_sliceLocMax ? sliceLoc : this.m_sliceLocMax; } // slice number ind = daikon.Utils.dec2hex(daikon.Tag.TAG_IMAGE_NUM[0]) + daikon.Utils.dec2hex(daikon.Tag.TAG_IMAGE_NUM[1]); @@ -321,7 +344,7 @@ class LoaderDcmDaikon { ind = daikon.Utils.dec2hex(TAG_RESCALE_TYPE[0]) + daikon.Utils.dec2hex(TAG_RESCALE_TYPE[1]); const tagResTyp = image.tags[ind]; if (tagResTyp !== undefined) { - if ((tagResTyp.value !== null) && (tagResTyp.value[0] === 'HU')) { + if (tagResTyp.value !== null && tagResTyp.value[0] === 'HU') { this.m_loaderDicom.m_rescaleHounsfield = true; } } @@ -335,7 +358,6 @@ class LoaderDcmDaikon { } } - // read pixel spacing on xy (physical dimensions) ind = daikon.Utils.dec2hex(daikon.Tag.TAG_PIXEL_SPACING[0]) + daikon.Utils.dec2hex(daikon.Tag.TAG_PIXEL_SPACING[1]); const tagPS = image.tags[ind]; @@ -370,12 +392,12 @@ class LoaderDcmDaikon { const yPos = tagImPos.value[1]; // eslint-disable-next-line const zPos = tagImPos.value[2]; - this.m_loaderDicom.m_imagePosMin.x = (xPos < this.m_loaderDicom.m_imagePosMin.x) ? xPos : this.m_loaderDicom.m_imagePosMin.x; - this.m_loaderDicom.m_imagePosMin.y = (yPos < this.m_loaderDicom.m_imagePosMin.y) ? yPos : this.m_loaderDicom.m_imagePosMin.y; - this.m_loaderDicom.m_imagePosMin.z = (zPos < this.m_loaderDicom.m_imagePosMin.z) ? zPos : this.m_loaderDicom.m_imagePosMin.z; - this.m_loaderDicom.m_imagePosMax.x = (xPos > this.m_loaderDicom.m_imagePosMax.x) ? xPos : this.m_loaderDicom.m_imagePosMax.x; - this.m_loaderDicom.m_imagePosMax.y = (yPos > this.m_loaderDicom.m_imagePosMax.y) ? yPos : this.m_loaderDicom.m_imagePosMax.y; - this.m_loaderDicom.m_imagePosMax.z = (zPos > this.m_loaderDicom.m_imagePosMax.z) ? zPos : this.m_loaderDicom.m_imagePosMax.z; + this.m_loaderDicom.m_imagePosMin.x = xPos < this.m_loaderDicom.m_imagePosMin.x ? xPos : this.m_loaderDicom.m_imagePosMin.x; + this.m_loaderDicom.m_imagePosMin.y = yPos < this.m_loaderDicom.m_imagePosMin.y ? yPos : this.m_loaderDicom.m_imagePosMin.y; + this.m_loaderDicom.m_imagePosMin.z = zPos < this.m_loaderDicom.m_imagePosMin.z ? zPos : this.m_loaderDicom.m_imagePosMin.z; + this.m_loaderDicom.m_imagePosMax.x = xPos > this.m_loaderDicom.m_imagePosMax.x ? xPos : this.m_loaderDicom.m_imagePosMax.x; + this.m_loaderDicom.m_imagePosMax.y = yPos > this.m_loaderDicom.m_imagePosMax.y ? yPos : this.m_loaderDicom.m_imagePosMax.y; + this.m_loaderDicom.m_imagePosMax.z = zPos > this.m_loaderDicom.m_imagePosMax.z ? zPos : this.m_loaderDicom.m_imagePosMax.z; if (NEED_DEBUG_PRINT_TAGS) { console.log(`TAG. image position x,y,z = ${xPos}, ${yPos}, ${zPos}`); } // if print @@ -387,7 +409,7 @@ class LoaderDcmDaikon { const tagTraSyn = image.tags[ind]; if (tagTraSyn !== undefined) { let arrStrTra = tagTraSyn.value; - if (arrStrTra[0] === "1.2.840.10008.1.2.2") { + if (arrStrTra[0] === '1.2.840.10008.1.2.2') { this.m_loaderDicom.m_littleEndian = false; } // console.log('val pad = ' + valPad); @@ -428,7 +450,7 @@ class LoaderDcmDaikon { const bVal = pixSrc[j + 0]; const gVal = pixSrc[j + 1]; const rVal = pixSrc[j + 2]; - volSlice.m_image[i] = Math.floor( (bVal + gVal + rVal) / 3 ); + volSlice.m_image[i] = Math.floor((bVal + gVal + rVal) / 3); } // for i } // if samples per pixel is 3 // store x, y dims @@ -458,7 +480,7 @@ class LoaderDcmDaikon { if (ret !== LoadResult.SUCCESS) { return ret; } - + // save dicomInfo to store const dicomInfo = this.m_loaderDicom.m_dicomInfo; store.dispatch({ type: StoreActionType.SET_DICOM_INFO, dicomInfo: dicomInfo }); @@ -466,9 +488,6 @@ class LoaderDcmDaikon { store.dispatch({ type: StoreActionType.SET_LOADER_DICOM, loaderDicom: this.m_loaderDicom }); return ret; } - } - export default LoaderDcmDaikon; - diff --git a/src/demo/engine/loaders/LoaderDicom.js b/src/engine/loaders/LoaderDicom.js similarity index 53% rename from src/demo/engine/loaders/LoaderDicom.js rename to src/engine/loaders/LoaderDicom.js index 3ab66310..e3ea110d 100644 --- a/src/demo/engine/loaders/LoaderDicom.js +++ b/src/engine/loaders/LoaderDicom.js @@ -1,10 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview LoaderDicom * @author Epam * @version 1.0.0 */ - // ******************************************************** // Imports // ******************************************************** @@ -48,12 +52,12 @@ const DICOM_ERROR_OK = 0; const DICOM_ERROR_WRONG_HEADER = -1; const DICOM_ERROR_TOO_SMALL_FILE = -2; -const UNDEFINED_LENGTH = 0xFFFFFFFF; +const UNDEFINED_LENGTH = 0xffffffff; -const LARGE_NUMBER = 0x3FFFFFFF; +const LARGE_NUMBER = 0x3fffffff; const TAG_IMAGE_INSTANCE_NUMBER = [0x0020, 0x0013]; -const TAG_PIXEL_DATA = [0x7FE0, 0x0010]; +const TAG_PIXEL_DATA = [0x7fe0, 0x0010]; const TAG_BITS_ALLOCATED = [0x0028, 0x0100]; const TAG_IMAGE_ROWS = [0x0028, 0x0010]; @@ -73,10 +77,10 @@ const TAG_PIXEL_REPRESENTATION = [0x0028, 0x0103]; const TAG_IMAGE_POSITION = [0x0020, 0x0032]; const TAG_SLICE_LOCATION = [0x0020, 0x1041]; const TAG_SAMPLES_PER_PIXEL = [0x0028, 0x0002]; -const TAG_SERIES_DESCRIPTION = [0x0008, 0x103E]; +const TAG_SERIES_DESCRIPTION = [0x0008, 0x103e]; const TAG_SERIES_TIME = [0x0008, 0x31]; -const TAG_END_OF_ITEMS = [0xFFFE, 0xE00D]; -const TAG_END_OF_SEQUENCE = [0xFFFE, 0xE0DD]; +const TAG_END_OF_ITEMS = [0xfffe, 0xe00d]; +const TAG_END_OF_SEQUENCE = [0xfffe, 0xe0dd]; const TAG_SERIES_NUMBER = [0x0020, 0x0011]; const TAG_SLICE_THICKNESS = [0x0018, 0x0050]; const TAG_BODY_PART_EXAMINED = [0x0018, 0x0015]; @@ -116,7 +120,7 @@ const TAG_OPERATORS_NAME = [0x0008, 0x1070]; /** * Class LoaderDicom some text later... */ -class LoaderDicom{ +class LoaderDicom { /** * @param {object} props - props from up level object */ @@ -140,7 +144,7 @@ class LoaderDicom{ /** @property {array} m_errors - array with error after file read, used internally */ this.m_errors = []; /** @property {string} m_transformSyntax - string with pixel data transform syntax */ - this.m_transformSyntax = ""; + this.m_transformSyntax = ''; /** @property {array} m_loaders - array with objects for individual file loading */ this.m_loaders = []; /** @property {number} m_xDim - volume dimension on x (width) */ @@ -205,7 +209,7 @@ class LoaderDicom{ this.m_pixelSpacing = { x: 0.0, y: 0.0, - z: 0.0 + z: 0.0, }; this.m_filesLoadedCounter = 0; this.m_numLoadedFiles = numFiles; @@ -216,7 +220,7 @@ class LoaderDicom{ // eslint-disable-next-line y: +1.0e12, // eslint-disable-next-line - z: +1.0e12 + z: +1.0e12, }; this.m_imagePosMax = { // eslint-disable-next-line @@ -224,7 +228,7 @@ class LoaderDicom{ // eslint-disable-next-line y: -1.0e12, // eslint-disable-next-line - z: -1.0e12 + z: -1.0e12, }; // eslint-disable-next-line @@ -251,86 +255,134 @@ class LoaderDicom{ * Create volume from slices set (m_slicesVolume) * It can be several set of slices (for multiple series) and hash will * select required slices - * + * * Create volume data array from individual slices, loaded from different files * @param {VolumeSet} volSet - destination volume set, will be created * @param {number} indexSelected - desired volume (serie) index * @param {number} hashSelected - use only slices with this hash * @return {LoadResult} LoadResult.SUCCESS if success */ - createVolumeFromSlices(volSet, indexSelected, hashSelected) { - // check arguments - console.assert(volSet != null, "Null volume"); - console.assert(volSet instanceof VolumeSet, "Should be volume set"); - console.assert(typeof(indexSelected) === "number", "index should be number"); - console.assert(typeof(hashSelected) === "number", "index should be number"); - - let volDst = null; - if (indexSelected < volSet.getNumVolumes()) { - volDst = volSet.getVolume(indexSelected); - } else { - volDst = new Volume(); - volSet.addVolume(volDst); - volDst = volSet.getVolume(indexSelected); - console.assert(volDst !== null); - } + createVolumeFromSlices(volSet, indexSelected, hashSelected) { + // check arguments + console.assert(volSet != null, 'Null volume'); + console.assert(volSet instanceof VolumeSet, 'Should be volume set'); + console.assert(typeof indexSelected === 'number', 'index should be number'); + console.assert(typeof hashSelected === 'number', 'index should be number'); + + let volDst = null; + if (indexSelected < volSet.getNumVolumes()) { + volDst = volSet.getVolume(indexSelected); + } else { + volDst = new Volume(); + volSet.addVolume(volDst); + volDst = volSet.getVolume(indexSelected); + console.assert(volDst !== null); + } - const numSeries = this.m_slicesVolume.m_series.length; - // get serie with given hash - let indSerie = -1; - for (let s = 0; s < numSeries; s++) { - if (this.m_slicesVolume.m_series[s].m_hash === hashSelected) { - indSerie = s; break; + const numSeries = this.m_slicesVolume.m_series.length; + // get serie with given hash + let indSerie = -1; + for (let s = 0; s < numSeries; s++) { + if (this.m_slicesVolume.m_series[s].m_hash === hashSelected) { + indSerie = s; + break; + } } - } - console.assert(indSerie >= 0); - const serie = this.m_slicesVolume.m_series[indSerie]; - const slice0 = serie.m_slices[0]; - const numSlices = serie.m_slices.length; - this.m_xDim = slice0.m_xDim; - this.m_yDim = slice0.m_yDim; - this.m_zDim = serie.m_slices.length; - let xyDim = this.m_xDim * this.m_yDim; - - const imagePosBox = { - x: this.m_imagePosMax.x - this.m_imagePosMin.x, - y: this.m_imagePosMax.y - this.m_imagePosMin.y, - z: this.m_imagePosMax.z - this.m_imagePosMin.z - }; - const TOO_MIN = 0.00001; - let zBox; - if (Math.abs(this.m_pixelSpacing.z) > TOO_MIN) { - zBox = this.m_pixelSpacing.z * this.m_zDim; - } else { - zBox = imagePosBox.z; - if (Math.abs(zBox) < TOO_MIN) { - zBox = imagePosBox.x; + console.assert(indSerie >= 0); + const serie = this.m_slicesVolume.m_series[indSerie]; + const slice0 = serie.m_slices[0]; + const numSlices = serie.m_slices.length; + this.m_xDim = slice0.m_xDim; + this.m_yDim = slice0.m_yDim; + this.m_zDim = serie.m_slices.length; + let xyDim = this.m_xDim * this.m_yDim; + + const imagePosBox = { + x: this.m_imagePosMax.x - this.m_imagePosMin.x, + y: this.m_imagePosMax.y - this.m_imagePosMin.y, + z: this.m_imagePosMax.z - this.m_imagePosMin.z, + }; + const TOO_MIN = 0.00001; + let zBox; + if (Math.abs(this.m_pixelSpacing.z) > TOO_MIN) { + zBox = this.m_pixelSpacing.z * this.m_zDim; + } else { + zBox = imagePosBox.z; if (Math.abs(zBox) < TOO_MIN) { - zBox = imagePosBox.y; + zBox = imagePosBox.x; + if (Math.abs(zBox) < TOO_MIN) { + zBox = imagePosBox.y; + } } + } // if pixel spacing 0 + if (zBox < TOO_MIN) { + zBox = 1.0; } - } // if pixel spacing 0 - if (zBox < TOO_MIN) { - zBox = 1.0; - } - // check empty pixel spacing - if (this.m_pixelSpacing.x * this.m_pixelSpacing.y < TOO_MIN) { - this.m_pixelSpacing.x = 1.0; - this.m_pixelSpacing.y = 1.0; - } - this.m_pixelSpacing.z = zBox / this.m_zDim; - this.m_boxSize.z = this.m_zDim * this.m_pixelSpacing.z; - this.m_boxSize.x = this.m_xDim * this.m_pixelSpacing.x; - this.m_boxSize.y = this.m_yDim * this.m_pixelSpacing.y; - console.log(`createVolumeFromSlices. Volume local phys dim: ${this.m_boxSize.x} * ${this.m_boxSize.y} * ${this.m_boxSize.z}`); - - let i; - let dataSize = 0; - let dataArray = null; - - // convert big endian in slices - if (!this.m_littleEndian) { - for (let ser = 0; ser < numSeries; ser++){ + // check empty pixel spacing + if (this.m_pixelSpacing.x * this.m_pixelSpacing.y < TOO_MIN) { + this.m_pixelSpacing.x = 1.0; + this.m_pixelSpacing.y = 1.0; + } + this.m_pixelSpacing.z = zBox / this.m_zDim; + this.m_boxSize.z = this.m_zDim * this.m_pixelSpacing.z; + this.m_boxSize.x = this.m_xDim * this.m_pixelSpacing.x; + this.m_boxSize.y = this.m_yDim * this.m_pixelSpacing.y; + console.log(`createVolumeFromSlices. Volume local phys dim: ${this.m_boxSize.x} * ${this.m_boxSize.y} * ${this.m_boxSize.z}`); + + let i; + let dataSize = 0; + let dataArray = null; + + // convert big endian in slices + if (!this.m_littleEndian) { + for (let ser = 0; ser < numSeries; ser++) { + const serie = this.m_slicesVolume.m_series[ser]; + if (serie.m_hash !== hashSelected) { + continue; + } + for (let sl = 0; sl < numSlices; sl++) { + const slice = serie.m_slices[sl]; + const sliceData16 = slice.m_image; + const xDim = slice.m_xDim; + const yDim = slice.m_yDim; + xyDim = xDim * yDim; + for (i = 0; i < xyDim; i++) { + const val16 = sliceData16[i]; + sliceData16[i] = (val16 >> 8) | ((val16 << 8) & 0xffff); + } // for (i) all slice pixels + } // for sl + } // for ser + } // if big endian + + // remove pad values or too much values + for (let ser = 0; ser < numSeries; ser++) { + const serie = this.m_slicesVolume.m_series[ser]; + if (serie.m_hash !== hashSelected) { + continue; + } + for (let sl = 0; sl < numSlices; sl++) { + const slicePad = serie.m_slices[sl]; + const xDim = slicePad.m_xDim; + const yDim = slicePad.m_yDim; + xyDim = xDim * yDim; + for (i = 0; i < xyDim; i++) { + let val16 = slicePad.m_image[i]; + // if ((val16 === this.m_padValue) || ((val16 & 0x8000) !== 0)) { + if (val16 === this.m_padValue) { + val16 = 0; + } + slicePad.m_image[i] = val16; + } // for (i) all slice pixels + } // for sl + } // for ser + + // dont apply rescale formula here, due to unsigned numbder can became signed, but store + // image in the unsigmed form + + // get maximum value from slices (but only for given serie : hash) + let maxVal = -LARGE_NUMBER; + let minVal = +LARGE_NUMBER; + for (let ser = 0; ser < numSeries; ser++) { const serie = this.m_slicesVolume.m_series[ser]; if (serie.m_hash !== hashSelected) { continue; @@ -342,435 +394,408 @@ class LoaderDicom{ const yDim = slice.m_yDim; xyDim = xDim * yDim; for (i = 0; i < xyDim; i++) { - const val16 = sliceData16[i]; - sliceData16[i] = (val16 >> 8) | ((val16 << 8) & 0xffff); + const valData = sliceData16[i] * this.m_rescaleSlope + this.m_rescaleIntercept; + minVal = valData < minVal ? valData : minVal; + maxVal = valData > maxVal ? valData : maxVal; } // for (i) all slice pixels } // for sl } // for ser - } // if big endian - // remove pad values or too much values - for (let ser = 0; ser < numSeries; ser++) { - const serie = this.m_slicesVolume.m_series[ser]; - if (serie.m_hash !== hashSelected) { - continue; - } - for (let sl = 0; sl < numSlices; sl++) { - const slicePad = serie.m_slices[sl]; - const xDim = slicePad.m_xDim; - const yDim = slicePad.m_yDim; - xyDim = xDim * yDim; - for (i = 0; i < xyDim; i++) { - const val16 = slicePad.m_image[i]; - // if ((val16 === this.m_padValue) || ((val16 & 0x8000) !== 0)) { - if (val16 === this.m_padValue) { - val16 = 0; - } - slicePad.m_image[i] = val16; - } // for (i) all slice pixels - } // for sl - } // for ser - - // dont apply rescale formula here, due to unsigned numbder can became signed, but store - // image in the unsigmed form - - // get maximum value from slices (but only for given serie : hash) - let maxVal = -LARGE_NUMBER; - let minVal = +LARGE_NUMBER; - for (let ser = 0; ser < numSeries; ser++) { - const serie = this.m_slicesVolume.m_series[ser]; - if (serie.m_hash !== hashSelected) { - continue; + console.log(`Build Volume. min/max value=${minVal}/${maxVal}. Volume dim = ${this.m_xDim}*${this.m_yDim}*${this.m_zDim}`); + console.log(`Min slice number = ${serie.m_minSlice}`); + console.log(`Max slice number = ${serie.m_maxSlice}`); + maxVal = maxVal - minVal > 0 ? maxVal : maxVal + 1; + + const BITS_ACCUR = 11; + const BITS_IN_BYTE = 8; + const scale = Math.floor((1 << (BITS_IN_BYTE + BITS_ACCUR)) / (maxVal - minVal)); + const TOO_MIN_SCALE = 4; + if (scale <= TOO_MIN_SCALE) { + console.log('Bad scaling: image will be 0'); + return LoadResult.ERROR_SCALING; } - for (let sl = 0; sl < numSlices; sl++) { - const slice = serie.m_slices[sl]; - const sliceData16 = slice.m_image; - const xDim = slice.m_xDim; - const yDim = slice.m_yDim; - xyDim = xDim * yDim; - for (i = 0; i < xyDim; i++) { - const valData = sliceData16[i] * this.m_rescaleSlope + this.m_rescaleIntercept; - minVal = (valData < minVal) ? valData : minVal; - maxVal = (valData > maxVal) ? valData : maxVal; - } // for (i) all slice pixels - } // for sl - } // for ser - - console.log(`Build Volume. min/max value=${minVal}/${maxVal}. Volume dim = ${this.m_xDim}*${this.m_yDim}*${this.m_zDim}`); - console.log(`Min slice number = ${serie.m_minSlice}`); - console.log(`Max slice number = ${serie.m_maxSlice}`); - maxVal = (maxVal - minVal > 0) ? maxVal : (maxVal + 1); - - const BITS_ACCUR = 11; - const BITS_IN_BYTE = 8; - const scale = Math.floor((1 << (BITS_IN_BYTE + BITS_ACCUR)) / (maxVal - minVal)); - const TOO_MIN_SCALE = 4; - if (scale <= TOO_MIN_SCALE) { - console.log('Bad scaling: image will be 0'); - return LoadResult.ERROR_SCALING; - } - // get slices for selected serie - const srcSlices = serie.m_slices; + // get slices for selected serie + const srcSlices = serie.m_slices; - const numSlicesByTags = serie.m_maxSlice - serie.m_minSlice + 1; - if (numSlicesByTags !== numSlices) { - console.log(`Sort by location! N slices by tags = ${numSlicesByTags}, but N readed slices = ${numSlices}`); - } - // sort slices via slice location OR slice number - let minSliceNum = srcSlices[0].m_sliceNumber; - let maxSliceNum = srcSlices[0].m_sliceNumber; - for (let s = 0; s < numSlices; s++) { - const num = srcSlices[s].m_sliceNumber; - minSliceNum = (num < minSliceNum) ? num : minSliceNum; - maxSliceNum = (num > maxSliceNum) ? num : maxSliceNum; - } - const difSlceNum = maxSliceNum - minSliceNum; - if (difSlceNum > 0) { - // sort slices by slice number (read from dicom tag) - srcSlices.sort((a, b) => { - const zDif = a.m_sliceNumber - b.m_sliceNumber; - return zDif; - }); - } else { - // sort slices by slice location (read from diocom tag) - srcSlices.sort((a, b) => { - const zDif = a.m_sliceLocation - b.m_sliceLocation; - return zDif; - }); - } - // assign new slice numbers according accending location - let ind = 0; - for (let s = 0; s < numSlices; s++) { - srcSlices[s].m_sliceNumber = ind; - ind++; - } - this.m_zDim = numSlices; - - // create out volume data array - // normal copy volume with transform 16 -> 8 bit + const numSlicesByTags = serie.m_maxSlice - serie.m_minSlice + 1; + if (numSlicesByTags !== numSlices) { + console.log(`Sort by location! N slices by tags = ${numSlicesByTags}, but N readed slices = ${numSlices}`); + } + // sort slices via slice location OR slice number + let minSliceNum = srcSlices[0].m_sliceNumber; + let maxSliceNum = srcSlices[0].m_sliceNumber; + for (let s = 0; s < numSlices; s++) { + const num = srcSlices[s].m_sliceNumber; + minSliceNum = num < minSliceNum ? num : minSliceNum; + maxSliceNum = num > maxSliceNum ? num : maxSliceNum; + } + const difSlceNum = maxSliceNum - minSliceNum; + if (difSlceNum > 0) { + // sort slices by slice number (read from dicom tag) + srcSlices.sort((a, b) => { + const zDif = a.m_sliceNumber - b.m_sliceNumber; + return zDif; + }); + } else { + // sort slices by slice location (read from diocom tag) + srcSlices.sort((a, b) => { + const zDif = a.m_sliceLocation - b.m_sliceLocation; + return zDif; + }); + } + // assign new slice numbers according accending location + let ind = 0; + for (let s = 0; s < numSlices; s++) { + srcSlices[s].m_sliceNumber = ind; + ind++; + } + this.m_zDim = numSlices; - dataSize = this.m_xDim * this.m_yDim * this.m_zDim; - dataArray = new Uint8Array(dataSize); - if (dataArray === null) { - console.log('no memory'); - return LoadResult.ERROR_NO_MEMORY; - } - for (i = 0; i < dataSize; i++) { - dataArray[i] = 0; - } + // create out volume data array + // normal copy volume with transform 16 -> 8 bit - // convert slices data into volume set data (16 bpp -> 8 bpp, etc) - const MAX_BYTE = 255; - for (let s = 0; s < numSlices; s++) { - const sliceSrc = srcSlices[s]; - xyDim = sliceSrc.m_xDim * sliceSrc.m_yDim; - const dataSrc16 = sliceSrc.m_image; - // console.log(`Slice[${s}] sliceNumber = ${slice.m_sliceNumber} sliceLocation = ${slice.m_sliceLocation}`); - - // const z = slice.m_sliceNumber - this.m_slicesVolume.m_minSlice; - let z = sliceSrc.m_sliceNumber; - if (z >= serie.m_slices.length) { - z = sliceSrc.m_sliceNumber - serie.m_minSlice; - if ((z < 0) || (z >= this.m_zDim)) { - console.log('Invalid z slice reference'); - return LoadResult.ERROR_INVALID_SLICE_INDEX; - } // if z invalid - } // if z more num slices - - if (dataSrc16 !== null) { - const offZ = z * xyDim; - - if ((this.m_windowCenter !== LARGE_NUMBER) && (this.m_windowWidth !== LARGE_NUMBER)) { - const winMin = this.m_windowCenter - this.m_windowWidth * 0.5; - for (i = 0; i < xyDim; i++) { - const valScaled = dataSrc16[i] * this.m_rescaleSlope + this.m_rescaleIntercept; + dataSize = this.m_xDim * this.m_yDim * this.m_zDim; + dataArray = new Uint8Array(dataSize); + if (dataArray === null) { + console.log('no memory'); + return LoadResult.ERROR_NO_MEMORY; + } + for (i = 0; i < dataSize; i++) { + dataArray[i] = 0; + } - let val = 0; - if (this.m_rescaleHounsfield) { - // rescale for hounsfield units - val = Math.floor((valScaled - winMin) * 255 / this.m_windowWidth); - } else { - // usual (default) rescale - val = Math.floor(127 + (valScaled - this.m_windowCenter) * 128 / (this.m_windowWidth / 2)); - } - val = (val >= 0) ? val : 0; - val = (val < 255) ? val : 255; - dataArray[offZ + i] = val; - } // for i - } else { - // window center, width not specified - for (i = 0; i < xyDim; i++) { - const val16 = dataSrc16[i] * this.m_rescaleSlope + this.m_rescaleIntercept; - let val = ((val16 - minVal) * scale) >> BITS_ACCUR; - // let val = Math.floor(255 * val16 / maxVal); - val = (val <= MAX_BYTE) ? val : MAX_BYTE; - dataArray[offZ + i] = val; - } // for i - } // no defined window center, width - - } // if has slice data - } // for(s) all slices - - // destroy for what? - // this.m_slicesVolume.destroy(); - - // Scale down volume by slices - const numPixelsInVolume = this.m_xDim * this.m_yDim * this.m_zDim; - // eslint-disable-next-line - const MAX_VOLUME_PIXELS = 512 * 512 * 256; - if (this.m_needScaleDownTexture && (numPixelsInVolume > MAX_VOLUME_PIXELS)) { - const XY_MAX_DIM = 512; - const Z_LOW_DIM = 120; - const xDimDst = (this.m_xDim <= XY_MAX_DIM) ? this.m_xDim : XY_MAX_DIM; - const yDimDst = (this.m_yDim <= XY_MAX_DIM) ? this.m_yDim : XY_MAX_DIM; - const zDimDst = Z_LOW_DIM; - const dataNew = VolumeTools.scaleTextureDown(this, dataArray, xDimDst, yDimDst, zDimDst); - dataArray = dataNew; - xyDim = this.m_xDim * this.m_yDim; - console.log(`Volume scaled down to: ${xDimDst} * ${yDimDst} * ${zDimDst}.`); - } + // convert slices data into volume set data (16 bpp -> 8 bpp, etc) + const MAX_BYTE = 255; + for (let s = 0; s < numSlices; s++) { + const sliceSrc = srcSlices[s]; + xyDim = sliceSrc.m_xDim * sliceSrc.m_yDim; + const dataSrc16 = sliceSrc.m_image; + // console.log(`Slice[${s}] sliceNumber = ${slice.m_sliceNumber} sliceLocation = ${slice.m_sliceLocation}`); + + // const z = slice.m_sliceNumber - this.m_slicesVolume.m_minSlice; + let z = sliceSrc.m_sliceNumber; + if (z >= serie.m_slices.length) { + z = sliceSrc.m_sliceNumber - serie.m_minSlice; + if (z < 0 || z >= this.m_zDim) { + console.log('Invalid z slice reference'); + return LoadResult.ERROR_INVALID_SLICE_INDEX; + } // if z invalid + } // if z more num slices + + if (dataSrc16 !== null) { + const offZ = z * xyDim; + + if (this.m_windowCenter !== LARGE_NUMBER && this.m_windowWidth !== LARGE_NUMBER) { + const winMin = this.m_windowCenter - this.m_windowWidth * 0.5; + for (i = 0; i < xyDim; i++) { + const valScaled = dataSrc16[i] * this.m_rescaleSlope + this.m_rescaleIntercept; + + let val = 0; + if (this.m_rescaleHounsfield) { + // rescale for hounsfield units + val = Math.floor(((valScaled - winMin) * 255) / this.m_windowWidth); + } else { + // usual (default) rescale + val = Math.floor(127 + ((valScaled - this.m_windowCenter) * 128) / (this.m_windowWidth / 2)); + } + val = val >= 0 ? val : 0; + val = val < 255 ? val : 255; + dataArray[offZ + i] = val; + } // for i + } else { + // window center, width not specified + for (i = 0; i < xyDim; i++) { + const val16 = dataSrc16[i] * this.m_rescaleSlope + this.m_rescaleIntercept; + let val = ((val16 - minVal) * scale) >> BITS_ACCUR; + // let val = Math.floor(255 * val16 / maxVal); + val = val <= MAX_BYTE ? val : MAX_BYTE; + dataArray[offZ + i] = val; + } // for i + } // no defined window center, width + } // if has slice data + } // for(s) all slices + + // destroy for what? + // this.m_slicesVolume.destroy(); + + // Scale down volume by slices + const numPixelsInVolume = this.m_xDim * this.m_yDim * this.m_zDim; + // eslint-disable-next-line + const MAX_VOLUME_PIXELS = 512 * 512 * 256; + if (this.m_needScaleDownTexture && numPixelsInVolume > MAX_VOLUME_PIXELS) { + const XY_MAX_DIM = 512; + const Z_LOW_DIM = 120; + const xDimDst = this.m_xDim <= XY_MAX_DIM ? this.m_xDim : XY_MAX_DIM; + const yDimDst = this.m_yDim <= XY_MAX_DIM ? this.m_yDim : XY_MAX_DIM; + const zDimDst = Z_LOW_DIM; + const dataNew = VolumeTools.scaleTextureDown(this, dataArray, xDimDst, yDimDst, zDimDst); + dataArray = dataNew; + xyDim = this.m_xDim * this.m_yDim; + console.log(`Volume scaled down to: ${xDimDst} * ${yDimDst} * ${zDimDst}.`); + } - // Scan for empty voxels on border sides - if (NEED_SCAN_EMPTY_BORDER) { - const xDim = this.m_xDim; - const yDim = this.m_yDim; - const zDim = this.m_zDim; - - const minValBarrier = 16; - let x; - let y; - let z; - let isEmpty; - isEmpty = true; - for (x = 0; (x < xDim / TWICE) && (isEmpty); x++) { - // check is empty plane - for (y = 0; (y < yDim) && (isEmpty); y++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; - if (dataArray[off] > minValBarrier) { - isEmpty = false; - } - } // for (z) - } // for (y() - } // for (x) - const xBorderMin = x; - - isEmpty = true; - for (x = xDim - 1; (x > xDim / TWICE) && (isEmpty); x--) { - // check is empty plane - for (y = 0; (y < yDim) && (isEmpty); y++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; - if (dataArray[off] > minValBarrier) { - isEmpty = false; - } - } // for (z) - } // for (y() - } // for (x) - const xBorderMax = x; - - isEmpty = true; - for (y = 0; (y < yDim / TWICE) && (isEmpty); y++) { - // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; - if (dataArray[off] > minValBarrier) { - isEmpty = false; - } - } // for (z) - } // for (y() - } // for (x) - const yBorderMin = y; - - isEmpty = true; - for (y = yDim - 1; (y > yDim / TWICE) && (isEmpty); y--) { - // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; - if (dataArray[off] > minValBarrier) { - isEmpty = false; - } - } // for (z) - } // for (y() - } // for (x) - const yBorderMax = y; - - isEmpty = true; - for (z = 0; (z < zDim / TWICE) && (isEmpty); z++) { - // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (y = 0; (y < yDim) && (isEmpty); y++) { - const off = (z * xyDim) + (y * xDim) + x; - if (dataArray[off] > minValBarrier) { - isEmpty = false; - } - } // for (z) - } // for (y() - } // for (x) - const zBorderMin = z; - - isEmpty = true; - for (z = zDim - 1; (z > zDim / TWICE) && (isEmpty); z--) { - // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (y = 0; (y < yDim) && (isEmpty); y++) { - const off = (z * xyDim) + (y * xDim) + x; - if (dataArray[off] > minValBarrier) { - isEmpty = false; - } - } // for (z) - } // for (y() - } // for (x) - const zBorderMax = z; - - // console.log(`Border scan: xBorderMin = ${xBorderMin}, xBorderMax = ${xBorderMax}. xDim = ${xDim}`); - // console.log(`Border scan: yBorderMin = ${yBorderMin}, yBorderMax = ${yBorderMax}. yDim = ${yDim}`); - // console.log(`Border scan: zBorderMin = ${zBorderMin}, zBorderMax = ${zBorderMax}. zDim = ${zDim}`); - this.m_nonEmptyBoxMin.x = xBorderMin / xDim; - this.m_nonEmptyBoxMin.y = yBorderMin / yDim; - this.m_nonEmptyBoxMin.z = zBorderMin / zDim; - this.m_nonEmptyBoxMax.x = xBorderMax / xDim; - this.m_nonEmptyBoxMax.y = yBorderMax / yDim; - this.m_nonEmptyBoxMax.z = zBorderMax / zDim; - - this.m_boxSize.z = (zBorderMax - zBorderMin) * this.m_pixelSpacing.z; - this.m_boxSize.x = (xBorderMax - xBorderMin) * this.m_pixelSpacing.x; - this.m_boxSize.y = (yBorderMax - yBorderMin) * this.m_pixelSpacing.y; - - const neMin = this.m_nonEmptyBoxMin; - const neMax = this.m_nonEmptyBoxMax; - console.log(`Border scan min: ${neMin.x}, ${neMin.y}, ${neMin.z}`); - console.log(`Border scan max: ${neMax.x}, ${neMax.y}, ${neMax.z}`); - } // if need scan empty borders - - // Special volume texture size fix (z dim should be even) - if (NEED_EVEN_TEXTURE_SIZE) { - const xDim = this.m_xDim; - const yDim = this.m_yDim; - const zDim = this.m_zDim; - if ((zDim & 1) !== 0) { - const volDataAlignedSize = VolumeTools.makeTextureSizeEven(dataArray, xDim, yDim, zDim); - // Align all dims to 4*x - const NUM3 = 3; - this.m_xDim = (xDim + NUM3) & (~NUM3); - this.m_yDim = (yDim + NUM3) & (~NUM3); - this.m_zDim = (zDim + NUM3) & (~NUM3); - dataArray = volDataAlignedSize; + // Scan for empty voxels on border sides + if (NEED_SCAN_EMPTY_BORDER) { + const xDim = this.m_xDim; + const yDim = this.m_yDim; + const zDim = this.m_zDim; + + const minValBarrier = 16; + let x; + let y; + let z; + let isEmpty; + isEmpty = true; + for (x = 0; x < xDim / TWICE && isEmpty; x++) { + // check is empty plane + for (y = 0; y < yDim && isEmpty; y++) { + for (z = 0; z < zDim && isEmpty; z++) { + const off = z * xyDim + y * xDim + x; + if (dataArray[off] > minValBarrier) { + isEmpty = false; + } + } // for (z) + } // for (y() + } // for (x) + const xBorderMin = x; + + isEmpty = true; + for (x = xDim - 1; x > xDim / TWICE && isEmpty; x--) { + // check is empty plane + for (y = 0; y < yDim && isEmpty; y++) { + for (z = 0; z < zDim && isEmpty; z++) { + const off = z * xyDim + y * xDim + x; + if (dataArray[off] > minValBarrier) { + isEmpty = false; + } + } // for (z) + } // for (y() + } // for (x) + const xBorderMax = x; + + isEmpty = true; + for (y = 0; y < yDim / TWICE && isEmpty; y++) { + // check is empty plane + for (x = 0; x < xDim && isEmpty; x++) { + for (z = 0; z < zDim && isEmpty; z++) { + const off = z * xyDim + y * xDim + x; + if (dataArray[off] > minValBarrier) { + isEmpty = false; + } + } // for (z) + } // for (y() + } // for (x) + const yBorderMin = y; + + isEmpty = true; + for (y = yDim - 1; y > yDim / TWICE && isEmpty; y--) { + // check is empty plane + for (x = 0; x < xDim && isEmpty; x++) { + for (z = 0; z < zDim && isEmpty; z++) { + const off = z * xyDim + y * xDim + x; + if (dataArray[off] > minValBarrier) { + isEmpty = false; + } + } // for (z) + } // for (y() + } // for (x) + const yBorderMax = y; + + isEmpty = true; + for (z = 0; z < zDim / TWICE && isEmpty; z++) { + // check is empty plane + for (x = 0; x < xDim && isEmpty; x++) { + for (y = 0; y < yDim && isEmpty; y++) { + const off = z * xyDim + y * xDim + x; + if (dataArray[off] > minValBarrier) { + isEmpty = false; + } + } // for (z) + } // for (y() + } // for (x) + const zBorderMin = z; + + isEmpty = true; + for (z = zDim - 1; z > zDim / TWICE && isEmpty; z--) { + // check is empty plane + for (x = 0; x < xDim && isEmpty; x++) { + for (y = 0; y < yDim && isEmpty; y++) { + const off = z * xyDim + y * xDim + x; + if (dataArray[off] > minValBarrier) { + isEmpty = false; + } + } // for (z) + } // for (y() + } // for (x) + const zBorderMax = z; + + // console.log(`Border scan: xBorderMin = ${xBorderMin}, xBorderMax = ${xBorderMax}. xDim = ${xDim}`); + // console.log(`Border scan: yBorderMin = ${yBorderMin}, yBorderMax = ${yBorderMax}. yDim = ${yDim}`); + // console.log(`Border scan: zBorderMin = ${zBorderMin}, zBorderMax = ${zBorderMax}. zDim = ${zDim}`); + this.m_nonEmptyBoxMin.x = xBorderMin / xDim; + this.m_nonEmptyBoxMin.y = yBorderMin / yDim; + this.m_nonEmptyBoxMin.z = zBorderMin / zDim; + this.m_nonEmptyBoxMax.x = xBorderMax / xDim; + this.m_nonEmptyBoxMax.y = yBorderMax / yDim; + this.m_nonEmptyBoxMax.z = zBorderMax / zDim; + + this.m_boxSize.z = (zBorderMax - zBorderMin) * this.m_pixelSpacing.z; + this.m_boxSize.x = (xBorderMax - xBorderMin) * this.m_pixelSpacing.x; + this.m_boxSize.y = (yBorderMax - yBorderMin) * this.m_pixelSpacing.y; + + const neMin = this.m_nonEmptyBoxMin; + const neMax = this.m_nonEmptyBoxMax; + console.log(`Border scan min: ${neMin.x}, ${neMin.y}, ${neMin.z}`); + console.log(`Border scan max: ${neMax.x}, ${neMax.y}, ${neMax.z}`); + } // if need scan empty borders + + // Special volume texture size fix (z dim should be even) + if (NEED_EVEN_TEXTURE_SIZE) { + const xDim = this.m_xDim; + const yDim = this.m_yDim; + const zDim = this.m_zDim; + if ((zDim & 1) !== 0) { + const volDataAlignedSize = VolumeTools.makeTextureSizeEven(dataArray, xDim, yDim, zDim); + // Align all dims to 4*x + const NUM3 = 3; + this.m_xDim = (xDim + NUM3) & ~NUM3; + this.m_yDim = (yDim + NUM3) & ~NUM3; + this.m_zDim = (zDim + NUM3) & ~NUM3; + dataArray = volDataAlignedSize; + } } - } - // Apply Gauss smooth filter - if (NEED_APPLY_GAUSS_SMOOTHING) { - const volTools = new VolumeTools(); - const GAUSS_RADIUS = 2; - const GAUSS_SIGMA = 1.4; - volTools.gaussSmooth(dataArray, this.m_xDim, this.m_yDim, this.m_zDim, GAUSS_RADIUS, GAUSS_SIGMA); - } + // Apply Gauss smooth filter + if (NEED_APPLY_GAUSS_SMOOTHING) { + const volTools = new VolumeTools(); + const GAUSS_RADIUS = 2; + const GAUSS_SIGMA = 1.4; + volTools.gaussSmooth(dataArray, this.m_xDim, this.m_yDim, this.m_zDim, GAUSS_RADIUS, GAUSS_SIGMA); + } - // Apply 0 to the edges of volume - const MIN_NUM_SLICES_FOR_VOL = 4; - if (this.m_zDim > MIN_NUM_SLICES_FOR_VOL) { - let x; - let y; - let z; - let yOff; - let zOff; - // z planes - z = 0; - const zOffMin = z * this.m_xDim * this.m_yDim; - z = this.m_zDim - 1; - const zOffMax = z * this.m_xDim * this.m_yDim; - for (y = 0; y < this.m_yDim; y++) { - yOff = y * this.m_xDim; - for (x = 0; x < this.m_xDim; x++) { - dataArray[zOffMin + yOff + x] = 0; - dataArray[zOffMax + yOff + x] = 0; - } // for x - } // for y - - // x planes - x = 0; - const xOffMin = x; - x = this.m_xDim - 1; - const xOffMax = x; - for (z = 0; z < this.m_zDim; z++) { - zOff = z * this.m_xDim * this.m_yDim; + // Apply 0 to the edges of volume + const MIN_NUM_SLICES_FOR_VOL = 4; + if (this.m_zDim > MIN_NUM_SLICES_FOR_VOL) { + let x; + let y; + let z; + let yOff; + let zOff; + // z planes + z = 0; + const zOffMin = z * this.m_xDim * this.m_yDim; + z = this.m_zDim - 1; + const zOffMax = z * this.m_xDim * this.m_yDim; for (y = 0; y < this.m_yDim; y++) { yOff = y * this.m_xDim; - dataArray[zOff + yOff + xOffMin] = 0; - dataArray[zOff + yOff + xOffMax] = 0; + for (x = 0; x < this.m_xDim; x++) { + dataArray[zOffMin + yOff + x] = 0; + dataArray[zOffMax + yOff + x] = 0; + } // for x + } // for y + + // x planes + x = 0; + const xOffMin = x; + x = this.m_xDim - 1; + const xOffMax = x; + for (z = 0; z < this.m_zDim; z++) { + zOff = z * this.m_xDim * this.m_yDim; + for (y = 0; y < this.m_yDim; y++) { + yOff = y * this.m_xDim; + dataArray[zOff + yOff + xOffMin] = 0; + dataArray[zOff + yOff + xOffMax] = 0; + } } - } - // y planes - y = 0; - const yOffMin = y * this.m_xDim; - y = this.m_yDim - 1; - const yOffMax = y * this.m_xDim; - for (z = 0; z < this.m_zDim; z++) { - zOff = z * this.m_xDim * this.m_yDim; - for (x = 0; x < this.m_xDim; x++) { - dataArray[zOff + x + yOffMin] = 0; - dataArray[zOff + x + yOffMax] = 0; - } // for x - } // for z - } // if zDim more min possible for volume - - const KTX_GL_RED = 0x1903; - const KTX_UNSIGNED_BYTE = 0x1401; - const header = { - m_pixelWidth: this.m_xDim, - m_pixelHeight: this.m_yDim, - m_pixelDepth: this.m_zDim, - m_glType: KTX_UNSIGNED_BYTE, - m_glTypeSize: 1, - m_glFormat: KTX_GL_RED, - m_glInternalFormat: KTX_GL_RED, - m_glBaseInternalFormat: KTX_GL_RED, - }; - const callbackComplete = this.m_callbackComplete; - if (callbackComplete) { - callbackComplete(LoadResult.SUCCESS, header, dataSize, dataArray); - } // if callback ready - const ONE = 1; - - volDst.m_xDim = this.m_xDim; - volDst.m_yDim = this.m_yDim; - volDst.m_zDim = this.m_zDim; - volDst.m_dataArray = dataArray; - volDst.m_dataSize = dataSize; - volDst.m_bytesPerVoxel = ONE; - volDst.m_boxSize.x = this.m_boxSize.x; - volDst.m_boxSize.y = this.m_boxSize.y; - volDst.m_boxSize.z = this.m_boxSize.z; - - volDst.m_patientName = this.m_dicomInfo.m_patientName; - volDst.m_patientBirth = this.m_dicomInfo.m_patientDateOfBirth; - volDst.m_seriesDescr = this.m_dicomInfo.m_seriesDescr; - - - volDst.m_studyDescr = this.m_dicomInfo.m_studyDescr; - volDst.m_studyDate = this.m_dicomInfo.m_studyDate; - volDst.m_seriesTime = this.m_dicomInfo.m_seriesTime; - volDst.m_bodyPartExamined = this.m_dicomInfo.m_bodyPartExamined; - volDst.m_institutionName = this.m_dicomInfo.m_institutionName; - volDst.m_operatorsName = this.m_dicomInfo.m_operatorsName; - volDst.m_physicansName = this.m_dicomInfo.m_physicansName; - - volDst.createIcon(); - - - return LoadResult.SUCCESS; -} // end createVolumeFromSlices + // y planes + y = 0; + const yOffMin = y * this.m_xDim; + y = this.m_yDim - 1; + const yOffMax = y * this.m_xDim; + for (z = 0; z < this.m_zDim; z++) { + zOff = z * this.m_xDim * this.m_yDim; + for (x = 0; x < this.m_xDim; x++) { + dataArray[zOff + x + yOffMin] = 0; + dataArray[zOff + x + yOffMax] = 0; + } // for x + } // for z + } // if zDim more min possible for volume + + const KTX_GL_RED = 0x1903; + const KTX_UNSIGNED_BYTE = 0x1401; + const header = { + m_pixelWidth: this.m_xDim, + m_pixelHeight: this.m_yDim, + m_pixelDepth: this.m_zDim, + m_glType: KTX_UNSIGNED_BYTE, + m_glTypeSize: 1, + m_glFormat: KTX_GL_RED, + m_glInternalFormat: KTX_GL_RED, + m_glBaseInternalFormat: KTX_GL_RED, + }; + const callbackComplete = this.m_callbackComplete; + if (callbackComplete) { + callbackComplete(LoadResult.SUCCESS, header, dataSize, dataArray); + } // if callback ready + const ONE = 1; + + volDst.m_xDim = this.m_xDim; + volDst.m_yDim = this.m_yDim; + volDst.m_zDim = this.m_zDim; + volDst.m_dataArray = dataArray; + volDst.m_dataSize = dataSize; + volDst.m_bytesPerVoxel = ONE; + volDst.m_boxSize.x = this.m_boxSize.x; + volDst.m_boxSize.y = this.m_boxSize.y; + volDst.m_boxSize.z = this.m_boxSize.z; + + volDst.m_patientName = this.m_dicomInfo.m_patientName; + volDst.m_patientBirth = this.m_dicomInfo.m_patientDateOfBirth; + volDst.m_seriesDescr = this.m_dicomInfo.m_seriesDescr; + + volDst.m_studyDescr = this.m_dicomInfo.m_studyDescr; + volDst.m_studyDate = this.m_dicomInfo.m_studyDate; + volDst.m_seriesTime = this.m_dicomInfo.m_seriesTime; + volDst.m_bodyPartExamined = this.m_dicomInfo.m_bodyPartExamined; + volDst.m_institutionName = this.m_dicomInfo.m_institutionName; + volDst.m_operatorsName = this.m_dicomInfo.m_operatorsName; + volDst.m_physicansName = this.m_dicomInfo.m_physicansName; + + volDst.createIcon(); + + return LoadResult.SUCCESS; + } // end createVolumeFromSlices static getVrsStringIndex(vr) { const VRS = [ - 'AE', 'AS', 'AT', 'CS', 'DA', 'DS', 'DT', 'FL', - 'FD', 'IS', 'LO', 'LT', 'OB', 'OD', 'OF', 'OW', - 'PN', 'SH', 'SL', 'SS', 'ST', 'TM', 'UI', 'UL', - 'UN', 'US', 'UT', + 'AE', + 'AS', + 'AT', + 'CS', + 'DA', + 'DS', + 'DT', + 'FL', + 'FD', + 'IS', + 'LO', + 'LT', + 'OB', + 'OD', + 'OF', + 'OW', + 'PN', + 'SH', + 'SL', + 'SS', + 'ST', + 'TM', + 'UI', + 'UL', + 'UN', + 'US', + 'UT', ]; const numElems = VRS.length; for (let i = 0; i < numElems; i++) { @@ -781,9 +806,7 @@ class LoaderDicom{ return -1; } static getDataVrsStringIndex(vr) { - const DATA_VRS = [ - 'OB', 'OW', 'OF', 'SQ', 'UT', 'UN', - ]; + const DATA_VRS = ['OB', 'OW', 'OF', 'SQ', 'UT', 'UN']; const numElems = DATA_VRS.length; for (let i = 0; i < numElems; i++) { if (DATA_VRS[i] === vr) { @@ -793,12 +816,12 @@ class LoaderDicom{ return -1; } /** - * Convert DataView object into string - * @param {object} dataView - DataView object (created from ArrayBuffer) - * @param {number} offset - current offset in buffer, when string started - * @param {number} lengthBuf - number of bytes to convert to string - * @return {string} string presentation of DataView - */ + * Convert DataView object into string + * @param {object} dataView - DataView object (created from ArrayBuffer) + * @param {number} offset - current offset in buffer, when string started + * @param {number} lengthBuf - number of bytes to convert to string + * @return {string} string presentation of DataView + */ static getStringAt(dataView, offset, lengthBuf) { let str = ''; for (let i = 0; i < lengthBuf; i++) { @@ -813,36 +836,43 @@ class LoaderDicom{ let str = ''; let i = 0; while (i < lengthBuf) { - let c = dataView.getUint8(offset + i); i++; + let c = dataView.getUint8(offset + i); + i++; if (c == 0x5e) { c = 32; } switch (c >> 4) { - case 0: case 1: - case 2: case 3: - case 4: case 5: - case 6: case 7: + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: str += String.fromCharCode(c); break; - case 12: case 13: - const char2 = dataView.getUint8(offset + i); i++; - str += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); + case 12: + case 13: + const char2 = dataView.getUint8(offset + i); + i++; + str += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f)); break; case 14: - const ch2 = dataView.getUint8(offset + i); i++; - const ch3 = dataView.getUint8(offset + i); i++; - str += String.fromCharCode(((c & 0x0F) << 12) | - ((ch2 & 0x3F) << 6) | - ((ch3 & 0x3F) << 0)); - break; + const ch2 = dataView.getUint8(offset + i); + i++; + const ch3 = dataView.getUint8(offset + i); + i++; + str += String.fromCharCode(((c & 0x0f) << 12) | ((ch2 & 0x3f) << 6) | ((ch3 & 0x3f) << 0)); + break; } // switch - } // while not end string return str; } static getAttrValueAsString(tag) { if (tag.m_value === null) { - if (tag.m_vr === 'SQ') { // sequence of items + if (tag.m_vr === 'SQ') { + // sequence of items return '(Sequence Data)'; } return null; @@ -896,10 +926,10 @@ class LoaderDicom{ return res; case 'FD': // floating point double res = dvTag.getFloat64(0, tag.m_littleEndian).toString(); - readBytes = (SIZE_DWORD + SIZE_DWORD); + readBytes = SIZE_DWORD + SIZE_DWORD; while (readBytes + SIZE_DWORD + SIZE_DWORD <= dvTag.byteLength) { res = `${res} \\ ${dvTag.getFloat64(readBytes, tag.m_littleEndian).toString()}`; - readBytes += (SIZE_DWORD + SIZE_DWORD); + readBytes += SIZE_DWORD + SIZE_DWORD; } return res; case 'IS': // integer string @@ -972,186 +1002,190 @@ class LoaderDicom{ } } /** - * Get next tag from stream - * @param {object} dataView - array - * @param {number} offset - current offset in buffer - * @return {object} if success or null, when fail. Fail reasons: invalid tag length read. - */ - getNextTag(dataView, offset) { - // check end of buffer - if (offset >= dataView.byteLengh) { - return null; - } - const SIZE_SHORT = 2; - const SIZE_DWORD = 4; - - let little = true; - let group = 0; - let element = 0; - let lenData = 0; - const offsetStart = offset; - let vr = ''; - - const MAGIC_GROUP = 0x0002; - - if (this.m_metaFinished) { - little = this.m_littleEndian; - group = dataView.getUint16(offset, little); - } else { - group = dataView.getUint16(offset, 1); - if (((this.m_metaFinishedOffset !== -1) && (offset >= this.m_metaFinishedOffset)) || (group !== MAGIC_GROUP)) { - this.m_metaFinished = 1; + * Get next tag from stream + * @param {object} dataView - array + * @param {number} offset - current offset in buffer + * @return {object} if success or null, when fail. Fail reasons: invalid tag length read. + */ + getNextTag(dataView, offset) { + // check end of buffer + if (offset >= dataView.byteLengh) { + return null; + } + const SIZE_SHORT = 2; + const SIZE_DWORD = 4; + + let little = true; + let group = 0; + let element = 0; + let lenData = 0; + const offsetStart = offset; + let vr = ''; + + const MAGIC_GROUP = 0x0002; + + if (this.m_metaFinished) { little = this.m_littleEndian; group = dataView.getUint16(offset, little); } else { - little = true; + group = dataView.getUint16(offset, 1); + if ((this.m_metaFinishedOffset !== -1 && offset >= this.m_metaFinishedOffset) || group !== MAGIC_GROUP) { + this.m_metaFinished = 1; + little = this.m_littleEndian; + group = dataView.getUint16(offset, little); + } else { + little = true; + } } - } - if (!this.m_metaFound && (group === MAGIC_GROUP)) { - this.m_metaFound = true; - } - offset += SIZE_SHORT; // skip group number + if (!this.m_metaFound && group === MAGIC_GROUP) { + this.m_metaFound = true; + } + offset += SIZE_SHORT; // skip group number - element = dataView.getUint16(offset, little); - offset += SIZE_SHORT; // skip element number + element = dataView.getUint16(offset, little); + offset += SIZE_SHORT; // skip element number - if (this.m_explicit || !this.m_metaFinished) { - vr = LoaderDicom.getStringAt(dataView, offset, SIZE_SHORT); - if (!this.m_metaFound && this.m_metaFinished && (LoaderDicom.getVrsStringIndex(vr) === -1)) { - vr = DicomDictionary.getVr(group, element); - lenData = dataView.getUint32(offset, little); - // assert for lenData < 1024 * 1024 * 32 - offset += SIZE_DWORD; - this.m_explicit = false; - } else { - offset += SIZE_SHORT; - if (LoaderDicom.getDataVrsStringIndex(vr) !== -1) { - offset += SIZE_SHORT; + if (this.m_explicit || !this.m_metaFinished) { + vr = LoaderDicom.getStringAt(dataView, offset, SIZE_SHORT); + if (!this.m_metaFound && this.m_metaFinished && LoaderDicom.getVrsStringIndex(vr) === -1) { + vr = DicomDictionary.getVr(group, element); lenData = dataView.getUint32(offset, little); // assert for lenData < 1024 * 1024 * 32 offset += SIZE_DWORD; + this.m_explicit = false; } else { - lenData = dataView.getUint16(offset, little); - // assert for lenData < 1024 * 1024 * 32 offset += SIZE_SHORT; + if (LoaderDicom.getDataVrsStringIndex(vr) !== -1) { + offset += SIZE_SHORT; + lenData = dataView.getUint32(offset, little); + // assert for lenData < 1024 * 1024 * 32 + offset += SIZE_DWORD; + } else { + lenData = dataView.getUint16(offset, little); + // assert for lenData < 1024 * 1024 * 32 + offset += SIZE_SHORT; + } } + } else { + vr = this.m_dictionary.getVr(group, element); + lenData = dataView.getUint32(offset, little); + // assert for lenData < 1024 * 1024 * 32 + if (lenData === UNDEFINED_LENGTH) { + vr = 'SQ'; + } + offset += SIZE_DWORD; } - } else { - vr = this.m_dictionary.getVr(group, element); - lenData = dataView.getUint32(offset, little); - // assert for lenData < 1024 * 1024 * 32 - if (lenData === UNDEFINED_LENGTH) { - vr = 'SQ'; - } - offset += SIZE_DWORD; - } - const offsetValue = offset; - let dataValue = null; - if (vr === 'SQ') { - // see nema dicom Table 7.5-3 - // for now just skip sequence items - if (lenData === UNDEFINED_LENGTH) { - let sqGroup = 0; - let sqElement = 0; - while (!((sqGroup === TAG_END_OF_SEQUENCE[0]) && (sqElement === TAG_END_OF_SEQUENCE[1]))) { - sqGroup = dataView.getUint16(offset, little); - offset += SIZE_SHORT; - sqElement = dataView.getUint16(offset, little); - offset += SIZE_SHORT; - const sqLength = dataView.getUint32(offset, little); - offset += SIZE_DWORD; - if (sqLength === UNDEFINED_LENGTH) { - // item delim. tag (fffe, e00d) - while (!(((sqGroup === TAG_END_OF_ITEMS[0]) && (sqElement === TAG_END_OF_ITEMS[1])) || - ((sqGroup === TAG_END_OF_SEQUENCE[0]) && (sqElement === TAG_END_OF_SEQUENCE[1])))) { - const tagNew = this.getNextTag(dataView, offset); - offset = tagNew.m_offsetEnd; - sqGroup = dataView.getUint16(offset, little); - sqElement = dataView.getUint16(offset + SIZE_SHORT, little); + const offsetValue = offset; + let dataValue = null; + if (vr === 'SQ') { + // see nema dicom Table 7.5-3 + // for now just skip sequence items + if (lenData === UNDEFINED_LENGTH) { + let sqGroup = 0; + let sqElement = 0; + while (!(sqGroup === TAG_END_OF_SEQUENCE[0] && sqElement === TAG_END_OF_SEQUENCE[1])) { + sqGroup = dataView.getUint16(offset, little); + offset += SIZE_SHORT; + sqElement = dataView.getUint16(offset, little); + offset += SIZE_SHORT; + const sqLength = dataView.getUint32(offset, little); + offset += SIZE_DWORD; + if (sqLength === UNDEFINED_LENGTH) { + // item delim. tag (fffe, e00d) + while ( + !( + (sqGroup === TAG_END_OF_ITEMS[0] && sqElement === TAG_END_OF_ITEMS[1]) || + (sqGroup === TAG_END_OF_SEQUENCE[0] && sqElement === TAG_END_OF_SEQUENCE[1]) + ) + ) { + const tagNew = this.getNextTag(dataView, offset); + offset = tagNew.m_offsetEnd; + sqGroup = dataView.getUint16(offset, little); + sqElement = dataView.getUint16(offset + SIZE_SHORT, little); + } + offset += SIZE_DWORD + SIZE_DWORD; // 4 for group and element + 4 for length field + } else { + // if sqLength is ffffffff + offset += sqLength; } - offset += (SIZE_DWORD + SIZE_DWORD); // 4 for group and element + 4 for length field - } else { // if sqLength is ffffffff - offset += sqLength; + } // while not end tag sequence + lenData = 0; + } // if length equal to ffffffff + } else if (lenData > 0) { + if (lenData === UNDEFINED_LENGTH) { + if (group === TAG_PIXEL_DATA[0] && element === TAG_PIXEL_DATA[1]) { + lenData = dataView.byteLength - offset; } - } // while not end tag sequence - lenData = 0; - } // if length equal to ffffffff - } else if (lenData > 0) { - if (lenData === UNDEFINED_LENGTH) { - if ((group === TAG_PIXEL_DATA[0]) && (element === TAG_PIXEL_DATA[1])) { - lenData = (dataView.byteLength - offset); } + // Get data from buffer, starting from offset + dataValue = dataView.buffer.slice(offset, offset + lenData); + } + const VAL_16 = 16; + if (DEBUG_PRINT_TAGS_INFO) { + const strDesc = this.m_dictionary.getTextDesc(group, element); + const strGr = group.toString(VAL_16); + const strEl = element.toString(VAL_16); + console.log(`Tag {${strGr},${strEl}}, VR='${vr}', Length=${lenData}, Desc=${strDesc}`); + } + const VAL_MIN_ONE = 0xffffffff; + if (lenData === VAL_MIN_ONE) { + return null; } - // Get data from buffer, starting from offset - dataValue = dataView.buffer.slice(offset, offset + lenData); - } - const VAL_16 = 16; - if (DEBUG_PRINT_TAGS_INFO) { - const strDesc = this.m_dictionary.getTextDesc(group, element); - const strGr = group.toString(VAL_16); - const strEl = element.toString(VAL_16); - console.log(`Tag {${strGr},${strEl}}, VR='${vr}', Length=${lenData}, Desc=${strDesc}`); - } - const VAL_MIN_ONE = 0xffffffff; - if (lenData === VAL_MIN_ONE) { - return null; - } - offset += lenData; - const tag = new DicomTag(group, element, vr, dataValue, offsetStart, offsetValue, offset, this.m_littleEndian); + offset += lenData; + const tag = new DicomTag(group, element, vr, dataValue, offsetStart, offsetValue, offset, this.m_littleEndian); - if (tag) { - this.m_newTagEvent.detail.group = group.toString(VAL_16); - this.m_newTagEvent.detail.element = element.toString(VAL_16); - this.m_newTagEvent.detail.desc = this.m_dictionary.getTextDesc(group, element); - this.m_newTagEvent.detail.value = LoaderDicom.getAttrValueAsString(tag); - if ((group === TAG_IMAGE_INSTANCE_NUMBER[0]) && (element === TAG_IMAGE_INSTANCE_NUMBER[1])) { - this.m_newTagEvent.detail.imageNumber = parseInt(this.m_newTagEvent.detail.value, 10); - } else { - this.m_newTagEvent.detail.imageNumber = -1; + if (tag) { + this.m_newTagEvent.detail.group = group.toString(VAL_16); + this.m_newTagEvent.detail.element = element.toString(VAL_16); + this.m_newTagEvent.detail.desc = this.m_dictionary.getTextDesc(group, element); + this.m_newTagEvent.detail.value = LoaderDicom.getAttrValueAsString(tag); + if (group === TAG_IMAGE_INSTANCE_NUMBER[0] && element === TAG_IMAGE_INSTANCE_NUMBER[1]) { + this.m_newTagEvent.detail.imageNumber = parseInt(this.m_newTagEvent.detail.value, 10); + } else { + this.m_newTagEvent.detail.imageNumber = -1; + } + dispatchEvent(this.m_newTagEvent); } - dispatchEvent(this.m_newTagEvent); - } - - if (tag.isTransformSyntax()) { - const tagDataLen = tag.m_value.byteLength; - const dvTag = new DataView(tag.m_value); - const strTagVal = LoaderDicom.getStringAt(dvTag, 0, tagDataLen); - if (strTagVal === TRANSFER_SYNTAX_IMPLICIT_LITTLE) { - this.m_explicit = false; - this.m_littleEndian = true; - } else if (strTagVal === TRANSFER_SYNTAX_EXPLICIT_BIG) { - this.m_explicit = true; - this.m_littleEndian = false; - } else if (strTagVal === TRANSFER_SYNTAX_COMPRESSION_DEFLATE) { - this.m_needsDeflate = true; - this.m_explicit = true; - this.m_littleEndian = true; - } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG) { - this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG; - } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG_LOSSLESS_SEL1) { - this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG_LOSSLESS_SEL1; - } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG_LOSSLESS) { - this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG_LOSSLESS; - } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG_BASELINE_8BIT) { - this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG_BASELINE_8BIT; - } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG_BASELINE_12BIT) { - this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG_BASELINE_12BIT; - } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG_2000_LOSSLESS) { - this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG_2000_LOSSLESS; - } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG_2000) { - this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG_2000; - } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_RLE) { - this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_RLE; - } else { - this.m_explicit = true; - this.m_littleEndian = true; + if (tag.isTransformSyntax()) { + const tagDataLen = tag.m_value.byteLength; + const dvTag = new DataView(tag.m_value); + const strTagVal = LoaderDicom.getStringAt(dvTag, 0, tagDataLen); + if (strTagVal === TRANSFER_SYNTAX_IMPLICIT_LITTLE) { + this.m_explicit = false; + this.m_littleEndian = true; + } else if (strTagVal === TRANSFER_SYNTAX_EXPLICIT_BIG) { + this.m_explicit = true; + this.m_littleEndian = false; + } else if (strTagVal === TRANSFER_SYNTAX_COMPRESSION_DEFLATE) { + this.m_needsDeflate = true; + this.m_explicit = true; + this.m_littleEndian = true; + } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG) { + this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG; + } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG_LOSSLESS_SEL1) { + this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG_LOSSLESS_SEL1; + } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG_LOSSLESS) { + this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG_LOSSLESS; + } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG_BASELINE_8BIT) { + this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG_BASELINE_8BIT; + } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG_BASELINE_12BIT) { + this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG_BASELINE_12BIT; + } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG_2000_LOSSLESS) { + this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG_2000_LOSSLESS; + } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_JPEG_2000) { + this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_JPEG_2000; + } else if (strTagVal == TRANSFER_SYNTAX_COMPRESSION_RLE) { + this.m_transformSyntax = TRANSFER_SYNTAX_COMPRESSION_RLE; + } else { + this.m_explicit = true; + this.m_littleEndian = true; + } + } else if (tag.isMetaLength()) { + this.m_metaFinishedOffset = tag.m_value[0] + offset; } - } else if (tag.isMetaLength()) { - this.m_metaFinishedOffset = tag.m_value[0] + offset; - } - return tag; + return tag; } // getNextTag static numberToHexString(val) { const str = val.toString(16); @@ -1164,8 +1198,7 @@ class LoaderDicom{ const strRes = '0x' + strZeros + str; return strRes; } - readFromGoogleBuffer(i, fileName, ratioLoaded, arrBuf, callbackProgress, callbackComplete) - { + readFromGoogleBuffer(i, fileName, ratioLoaded, arrBuf, callbackProgress, callbackComplete) { const dataView = new DataView(arrBuf); let fileSize = dataView.byteLength; // fileSize = (fileSize) & (~1); @@ -1179,12 +1212,12 @@ class LoaderDicom{ const LEN_CONTENT_TYPE = 32; const strCtx = LoaderDicom.getStringAt(dataView, OFF_CONTENT_TYPE, LEN_CONTENT_TYPE); const STR_CTX_MATCH = 'Content-Type: application/dicom;'; - const isEqCtxStr = (strCtx === STR_CTX_MATCH); + const isEqCtxStr = strCtx === STR_CTX_MATCH; if (isEqCtxStr) { const SIZE_GOOGLE_HEADER = 136; const arrBufWoHead = arrBuf.slice(SIZE_GOOGLE_HEADER); const dataViewWoGoogle = new DataView(arrBufWoHead); - const okRet = this.readFromBuffer(i, fileName, ratioLoaded, arrBufWoHead, callbackProgress, callbackComplete) + const okRet = this.readFromBuffer(i, fileName, ratioLoaded, arrBufWoHead, callbackProgress, callbackComplete); return okRet; } else { console.log(`readFromGoogleBuffer. bad content type = ${strCtx}`); @@ -1192,13 +1225,13 @@ class LoaderDicom{ } } /** - * Read from local file buffer - * @param {number} indexFile - index of slice loaded - * @param {string} fileName - Loaded file - * @param {number} ratioLoaded - ratio from 0 to 1.0. - * @param {object} arrBuf - source byte buffer, ArrayBuffer type - * @return LoadResult.XXX - */ + * Read from local file buffer + * @param {number} indexFile - index of slice loaded + * @param {string} fileName - Loaded file + * @param {number} ratioLoaded - ratio from 0 to 1.0. + * @param {object} arrBuf - source byte buffer, ArrayBuffer type + * @return LoadResult.XXX + */ readFromBuffer(indexFile, fileName, ratioLoaded, arrBuf, callbackProgress, callbackComplete) { if (typeof indexFile !== 'number') { console.log('LoaderDicom.readFromBuffer: bad indexFile argument'); @@ -1282,7 +1315,7 @@ class LoaderDicom{ // read tag by tag, until image tag let tag; - for (tag = this.getNextTag(dataView, offset); tag !== null;) { + for (tag = this.getNextTag(dataView, offset); tag !== null; ) { if (tag.isPixelData()) { pixelsTagReaded = true; break; @@ -1298,14 +1331,12 @@ class LoaderDicom{ const numlices = dicomInfo.m_sliceInfo.length; const sliceInfo = dicomInfo.m_sliceInfo[numlices - 1]; const tagInfo = new DicomTagInfo(); - tagInfo.m_tag = '(' + - LoaderDicom.numberToHexString(tag.m_group) + ',' + - LoaderDicom.numberToHexString(tag.m_element) + ')'; + tagInfo.m_tag = '(' + LoaderDicom.numberToHexString(tag.m_group) + ',' + LoaderDicom.numberToHexString(tag.m_element) + ')'; const strTagName = this.m_dictionary.getTextDesc(tag.m_group, tag.m_element); - tagInfo.m_attrName = (strTagName.length > 1) ? strTagName : ''; + tagInfo.m_attrName = strTagName.length > 1 ? strTagName : ''; let strVal = LoaderDicom.getAttrValueAsString(tag); - strVal = (strVal !== null) ? strVal : ''; + strVal = strVal !== null ? strVal : ''; tagInfo.m_attrValue = strVal; sliceInfo.m_tags.push(tagInfo); @@ -1313,7 +1344,7 @@ class LoaderDicom{ // console.log(`Add tag info. tag = ${tagInfo.m_tag} atNa = ${tagInfo.m_attrName} atVal = ${tagInfo.m_attrValue} `); // get important info from tag: image number - if ((tag.m_group === TAG_IMAGE_INSTANCE_NUMBER[0]) && (tag.m_element === TAG_IMAGE_INSTANCE_NUMBER[1])) { + if (tag.m_group === TAG_IMAGE_INSTANCE_NUMBER[0] && tag.m_element === TAG_IMAGE_INSTANCE_NUMBER[1]) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strNum = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1323,11 +1354,10 @@ class LoaderDicom{ } } // get important tag: image rows - if ((tag.m_group === TAG_IMAGE_ROWS[0]) && (tag.m_element === TAG_IMAGE_ROWS[1])) { + if (tag.m_group === TAG_IMAGE_ROWS[0] && tag.m_element === TAG_IMAGE_ROWS[1]) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); - const yDim = (dataLen === SIZE_SHORT) ? - dv.getUint16(0, this.m_littleEndian) : dv.getUint32(0, this.m_littleEndian); + const yDim = dataLen === SIZE_SHORT ? dv.getUint16(0, this.m_littleEndian) : dv.getUint32(0, this.m_littleEndian); if (DEBUG_PRINT_TAGS_INFO) { console.log(`yDim = ${yDim}`); } @@ -1342,11 +1372,10 @@ class LoaderDicom{ } } // get important tag: image cols - if ((tag.m_group === TAG_IMAGE_COLS[0]) && (tag.m_element === TAG_IMAGE_COLS[1])) { + if (tag.m_group === TAG_IMAGE_COLS[0] && tag.m_element === TAG_IMAGE_COLS[1]) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); - const xDim = (dataLen === SIZE_SHORT) ? - dv.getUint16(0, this.m_littleEndian) : dv.getUint32(0, this.m_littleEndian); + const xDim = dataLen === SIZE_SHORT ? dv.getUint16(0, this.m_littleEndian) : dv.getUint32(0, this.m_littleEndian); if (DEBUG_PRINT_TAGS_INFO) { console.log(`xDim = ${xDim}`); } @@ -1361,19 +1390,18 @@ class LoaderDicom{ } } // get important tag: bits allocated - if ((tag.m_group === TAG_BITS_ALLOCATED[0]) && (tag.m_element === TAG_BITS_ALLOCATED[1])) { + if (tag.m_group === TAG_BITS_ALLOCATED[0] && tag.m_element === TAG_BITS_ALLOCATED[1]) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); - this.m_bitsPerPixel = (dataLen === SIZE_SHORT) ? - dv.getUint16(0, this.m_littleEndian) : dv.getUint32(0, this.m_littleEndian); + this.m_bitsPerPixel = dataLen === SIZE_SHORT ? dv.getUint16(0, this.m_littleEndian) : dv.getUint32(0, this.m_littleEndian); if (DEBUG_PRINT_TAGS_INFO) { console.log(`bitsPerPixel = ${this.m_bitsPerPixel}`); } } // window center - if ((tag.m_group === TAG_WINDOW_CENTER[0]) && (tag.m_element === TAG_WINDOW_CENTER[1])) { - if ((tag.m_value != null) && (tag.m_value.byteLength > 0)) { + if (tag.m_group === TAG_WINDOW_CENTER[0] && tag.m_element === TAG_WINDOW_CENTER[1]) { + if (tag.m_value != null && tag.m_value.byteLength > 0) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strNum = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1383,10 +1411,10 @@ class LoaderDicom{ } } // if non zero data } // window center - + // window width - if ((tag.m_group === TAG_WINDOW_WIDTH[0]) && (tag.m_element === TAG_WINDOW_WIDTH[1])) { - if ((tag.m_value != null) && (tag.m_value.byteLength > 0)) { + if (tag.m_group === TAG_WINDOW_WIDTH[0] && tag.m_element === TAG_WINDOW_WIDTH[1]) { + if (tag.m_value != null && tag.m_value.byteLength > 0) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strNum = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1398,8 +1426,8 @@ class LoaderDicom{ } // window width // rescale intercept - if ((tag.m_group === TAG_RESCALE_INTERCEPT[0]) && (tag.m_element === TAG_RESCALE_INTERCEPT[1])) { - if ((tag.m_value != null) && (tag.m_value.byteLength > 0)) { + if (tag.m_group === TAG_RESCALE_INTERCEPT[0] && tag.m_element === TAG_RESCALE_INTERCEPT[1]) { + if (tag.m_value != null && tag.m_value.byteLength > 0) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strNum = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1411,8 +1439,8 @@ class LoaderDicom{ } // rescale intercept // rescale slope - if ((tag.m_group === TAG_RESCALE_SLOPE[0]) && (tag.m_element === TAG_RESCALE_SLOPE[1])) { - if ((tag.m_value != null) && (tag.m_value.byteLength > 0)) { + if (tag.m_group === TAG_RESCALE_SLOPE[0] && tag.m_element === TAG_RESCALE_SLOPE[1]) { + if (tag.m_value != null && tag.m_value.byteLength > 0) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strNum = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1424,13 +1452,13 @@ class LoaderDicom{ } // rescale slope // rescale type - if ((tag.m_group === TAG_RESCALE_TYPE[0]) && (tag.m_element === TAG_RESCALE_TYPE[1])) { - if ((tag.m_value != null) && (tag.m_value.byteLength > 0)) { + if (tag.m_group === TAG_RESCALE_TYPE[0] && tag.m_element === TAG_RESCALE_TYPE[1]) { + if (tag.m_value != null && tag.m_value.byteLength > 0) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strVal = LoaderDicom.getStringAt(dv, 0, dataLen); if (strVal === 'HU') { - this.m_rescaleHounsfield = true; + this.m_rescaleHounsfield = true; } if (DEBUG_PRINT_TAGS_INFO) { console.log(`Str = ${strNum}, RescaleType = ${this.m_rescaleHounsfield}`); @@ -1439,12 +1467,12 @@ class LoaderDicom{ } // rescale type // pixel representation - if ((tag.m_group === TAG_PIXEL_REPRESENTATION[0]) && (tag.m_element === TAG_PIXEL_REPRESENTATION[1])) { - if ((tag.m_value != null) && (tag.m_value.byteLength > 0)) { + if (tag.m_group === TAG_PIXEL_REPRESENTATION[0] && tag.m_element === TAG_PIXEL_REPRESENTATION[1]) { + if (tag.m_value != null && tag.m_value.byteLength > 0) { const dataLenPixRep = tag.m_value.byteLength; const dvPixRep = new DataView(tag.m_value); - const pixRep = (dataLenPixRep === SIZE_SHORT) ? - dvPixRep.getUint16(0, this.m_littleEndian) : dvPixRep.getUint32(0, this.m_littleEndian); + const pixRep = + dataLenPixRep === SIZE_SHORT ? dvPixRep.getUint16(0, this.m_littleEndian) : dvPixRep.getUint32(0, this.m_littleEndian); if (pixRep === 1) { this.m_pixelRepresentaionSigned = true; } @@ -1455,8 +1483,8 @@ class LoaderDicom{ } // rescale slope // get series number - if ((tag.m_group === TAG_SERIES_NUMBER[0]) && (tag.m_element === TAG_SERIES_NUMBER[1])) { - if ((tag.m_value != null) && (tag.m_value.byteLength > 0)) { + if (tag.m_group === TAG_SERIES_NUMBER[0] && tag.m_element === TAG_SERIES_NUMBER[1]) { + if (tag.m_value != null && tag.m_value.byteLength > 0) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strNum = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1468,8 +1496,7 @@ class LoaderDicom{ } // series number // get important tag: series description - if ((tag.m_group === TAG_SERIES_DESCRIPTION[0]) && (tag.m_element === TAG_SERIES_DESCRIPTION[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_SERIES_DESCRIPTION[0] && tag.m_element === TAG_SERIES_DESCRIPTION[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); this.m_seriesDescr = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1478,11 +1505,10 @@ class LoaderDicom{ } } // get important tag: hight bit - if ((tag.m_group === TAG_IMAGE_HIGH_BIT[0]) && (tag.m_element === TAG_IMAGE_HIGH_BIT[1])) { + if (tag.m_group === TAG_IMAGE_HIGH_BIT[0] && tag.m_element === TAG_IMAGE_HIGH_BIT[1]) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); - const highBit = (dataLen === SIZE_SHORT) ? - dv.getUint16(0, this.m_littleEndian) : dv.getUint32(0, this.m_littleEndian); + const highBit = dataLen === SIZE_SHORT ? dv.getUint16(0, this.m_littleEndian) : dv.getUint32(0, this.m_littleEndian); pixelBitMask = (1 << (highBit + 1)) - 1; if (DEBUG_PRINT_TAGS_INFO) { console.log(`highBit = ${highBit}`); @@ -1490,40 +1516,37 @@ class LoaderDicom{ } // get important tag: min pixel value - if ((tag.m_group === TAG_IMAGE_SMALL_PIX_VAL[0]) && (tag.m_element === TAG_IMAGE_SMALL_PIX_VAL[1])) { + if (tag.m_group === TAG_IMAGE_SMALL_PIX_VAL[0] && tag.m_element === TAG_IMAGE_SMALL_PIX_VAL[1]) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); - pixelMinValue = (dataLen === SIZE_SHORT) ? - dv.getInt16(0, this.m_littleEndian) : dv.getInt32(0, this.m_littleEndian); + pixelMinValue = dataLen === SIZE_SHORT ? dv.getInt16(0, this.m_littleEndian) : dv.getInt32(0, this.m_littleEndian); if (DEBUG_PRINT_TAGS_INFO) { console.log(`pixelMinValue = ${pixelMinValue}`); } } // get important tag: max pixel value - if ((tag.m_group === TAG_IMAGE_LARGE_PIX_VAL[0]) && (tag.m_element === TAG_IMAGE_LARGE_PIX_VAL[1])) { + if (tag.m_group === TAG_IMAGE_LARGE_PIX_VAL[0] && tag.m_element === TAG_IMAGE_LARGE_PIX_VAL[1]) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); - pixelMaxValue = (dataLen === SIZE_SHORT) ? - dv.getInt16(0, this.m_littleEndian) : dv.getInt32(0, this.m_littleEndian); + pixelMaxValue = dataLen === SIZE_SHORT ? dv.getInt16(0, this.m_littleEndian) : dv.getInt32(0, this.m_littleEndian); if (DEBUG_PRINT_TAGS_INFO) { console.log(`pixelMaxValue = ${pixelMaxValue}`); } } // get important tag: pixel padding value - if ((tag.m_group === TAG_PIXEL_PADDING_VALUE[0]) && (tag.m_element === TAG_PIXEL_PADDING_VALUE[1])) { + if (tag.m_group === TAG_PIXEL_PADDING_VALUE[0] && tag.m_element === TAG_PIXEL_PADDING_VALUE[1]) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); - pixelPaddingValue = (dataLen === SIZE_SHORT) ? - dv.getUint16(0, this.m_littleEndian) : dv.getUint32(0, this.m_littleEndian); + pixelPaddingValue = dataLen === SIZE_SHORT ? dv.getUint16(0, this.m_littleEndian) : dv.getUint32(0, this.m_littleEndian); this.m_padValue = pixelPaddingValue; if (DEBUG_PRINT_TAGS_INFO) { console.log(`pixelPaddingValue = ${pixelPaddingValue}`); } } // get important tag: pixel spacing in 2d (xy) - if ((tag.m_group === TAG_PIXEL_SPACING[0]) && (tag.m_element === TAG_PIXEL_SPACING[1])) { + if (tag.m_group === TAG_PIXEL_SPACING[0] && tag.m_element === TAG_PIXEL_SPACING[1]) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strPixelSpacing = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1537,7 +1560,7 @@ class LoaderDicom{ } } // get important tag: image position (x,y,z) - if ((tag.m_group === TAG_IMAGE_POSITION[0]) && (tag.m_element === TAG_IMAGE_POSITION[1])) { + if (tag.m_group === TAG_IMAGE_POSITION[0] && tag.m_element === TAG_IMAGE_POSITION[1]) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strImagePosition = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1550,12 +1573,12 @@ class LoaderDicom{ const yPos = parseFloat(strArr[1]); // eslint-disable-next-line const zPos = parseFloat(strArr[2]); - this.m_imagePosMin.x = (xPos < this.m_imagePosMin.x) ? xPos : this.m_imagePosMin.x; - this.m_imagePosMin.y = (yPos < this.m_imagePosMin.y) ? yPos : this.m_imagePosMin.y; - this.m_imagePosMin.z = (zPos < this.m_imagePosMin.z) ? zPos : this.m_imagePosMin.z; - this.m_imagePosMax.x = (xPos > this.m_imagePosMax.x) ? xPos : this.m_imagePosMax.x; - this.m_imagePosMax.y = (yPos > this.m_imagePosMax.y) ? yPos : this.m_imagePosMax.y; - this.m_imagePosMax.z = (zPos > this.m_imagePosMax.z) ? zPos : this.m_imagePosMax.z; + this.m_imagePosMin.x = xPos < this.m_imagePosMin.x ? xPos : this.m_imagePosMin.x; + this.m_imagePosMin.y = yPos < this.m_imagePosMin.y ? yPos : this.m_imagePosMin.y; + this.m_imagePosMin.z = zPos < this.m_imagePosMin.z ? zPos : this.m_imagePosMin.z; + this.m_imagePosMax.x = xPos > this.m_imagePosMax.x ? xPos : this.m_imagePosMax.x; + this.m_imagePosMax.y = yPos > this.m_imagePosMax.y ? yPos : this.m_imagePosMax.y; + this.m_imagePosMax.z = zPos > this.m_imagePosMax.z ? zPos : this.m_imagePosMax.z; if (DEBUG_PRINT_TAGS_INFO) { console.log(`TAG. image position x,y,z = ${xPos}, ${yPos}, ${zPos}`); } @@ -1563,7 +1586,7 @@ class LoaderDicom{ } // slice thickness - if ((tag.m_group === TAG_SLICE_THICKNESS[0]) && (tag.m_element === TAG_SLICE_THICKNESS[1])) { + if (tag.m_group === TAG_SLICE_THICKNESS[0] && tag.m_element === TAG_SLICE_THICKNESS[1]) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strSliceThickness = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1574,41 +1597,38 @@ class LoaderDicom{ } // get important tag: slice location (x,y,z) - if ((tag.m_group === TAG_SLICE_LOCATION[0]) && (tag.m_element === TAG_SLICE_LOCATION[1])) { + if (tag.m_group === TAG_SLICE_LOCATION[0] && tag.m_element === TAG_SLICE_LOCATION[1]) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strSliceLocation = LoaderDicom.getStringAt(dv, 0, dataLen); const sliceLoc = parseFloat(strSliceLocation); this.m_sliceLocation = sliceLoc; - this.m_sliceLocMin = (sliceLoc < this.m_sliceLocMin) ? sliceLoc : this.m_sliceLocMin; - this.m_sliceLocMax = (sliceLoc > this.m_sliceLocMax) ? sliceLoc : this.m_sliceLocMax; + this.m_sliceLocMin = sliceLoc < this.m_sliceLocMin ? sliceLoc : this.m_sliceLocMin; + this.m_sliceLocMax = sliceLoc > this.m_sliceLocMax ? sliceLoc : this.m_sliceLocMax; if (DEBUG_PRINT_TAGS_INFO) { console.log(`TAG. Slice location = ${this.m_sliceLocation}`); } } // get important tag: samples per pixel - if ((tag.m_group === TAG_SAMPLES_PER_PIXEL[0]) && (tag.m_element === TAG_SAMPLES_PER_PIXEL[1])) { + if (tag.m_group === TAG_SAMPLES_PER_PIXEL[0] && tag.m_element === TAG_SAMPLES_PER_PIXEL[1]) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); - this.m_samplesPerPixel = (dataLen === SIZE_SHORT) ? - dv.getUint16(0, this.m_littleEndian) : dv.getUint32(0, this.m_littleEndian); + this.m_samplesPerPixel = dataLen === SIZE_SHORT ? dv.getUint16(0, this.m_littleEndian) : dv.getUint32(0, this.m_littleEndian); if (DEBUG_PRINT_TAGS_INFO) { console.log(`samplesPerPixel = ${this.m_samplesPerPixel}`); } } // dicom info - if ((tag.m_group === TAG_SERIES_DESCRIPTION[0]) && (tag.m_element === TAG_SERIES_DESCRIPTION[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_SERIES_DESCRIPTION[0] && tag.m_element === TAG_SERIES_DESCRIPTION[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strDescr = LoaderDicom.getStringAt(dv, 0, dataLen); // console.log(`DicomLoader. Series descr read = ${strDescr}`); this.m_dicomInfo.m_seriesDescr = strDescr; } - if ((tag.m_group === TAG_SERIES_TIME[0]) && (tag.m_element === TAG_SERIES_TIME[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_SERIES_TIME[0] && tag.m_element === TAG_SERIES_TIME[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strTimeMerged = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1625,30 +1645,26 @@ class LoaderDicom{ console.log(`Series time = ${this.m_dicomInfo.m_seriesTime}`); } } - if ((tag.m_group === TAG_PATIENT_NAME[0]) && (tag.m_element === TAG_PATIENT_NAME[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_PATIENT_NAME[0] && tag.m_element === TAG_PATIENT_NAME[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); this.m_dicomInfo.m_patientName = LoaderDicom.getUtf8StringAt(dv, 0, dataLen); this.m_dicomInfo.m_patientName = this.m_dicomInfo.m_patientName.trim(); //console.log(`m_patientName = ${this.m_dicomInfo.m_patientName}`); } - if ((tag.m_group === TAG_PATIENT_ID[0]) && (tag.m_element === TAG_PATIENT_ID[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_PATIENT_ID[0] && tag.m_element === TAG_PATIENT_ID[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); this.m_dicomInfo.m_patientId = LoaderDicom.getStringAt(dv, 0, dataLen); // console.log(`m_patientId = ${this.m_dicomInfo.m_patientId}`); } - if ((tag.m_group === TAG_PATIENT_GENDER[0]) && (tag.m_element === TAG_PATIENT_GENDER[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_PATIENT_GENDER[0] && tag.m_element === TAG_PATIENT_GENDER[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); this.m_dicomInfo.m_patientGender = LoaderDicom.getStringAt(dv, 0, dataLen); // console.log(`m_patientGender = ${this.m_dicomInfo.m_patientGender}`); } - if ((tag.m_group === TAG_PATIENT_BIRTH_DATE[0]) && (tag.m_element === TAG_PATIENT_BIRTH_DATE[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_PATIENT_BIRTH_DATE[0] && tag.m_element === TAG_PATIENT_BIRTH_DATE[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strDateMerged = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1661,8 +1677,7 @@ class LoaderDicom{ this.m_dicomInfo.m_patientDateOfBirth = `${strD}/${strM}/${strY}`; // console.log(`m_patientDateOfBirth = ${this.m_dicomInfo.m_patientDateOfBirth}`); } - if ((tag.m_group === TAG_STUDY_DATE[0]) && (tag.m_element === TAG_STUDY_DATE[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_STUDY_DATE[0] && tag.m_element === TAG_STUDY_DATE[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strDateMerged = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1675,8 +1690,7 @@ class LoaderDicom{ this.m_dicomInfo.m_studyDate = `${strD}/${strM}/${strY}`; // console.log(`m_studyDate = ${this.m_dicomInfo.m_studyDate}`); } - if ((tag.m_group === TAG_STUDY_DESCR[0]) && (tag.m_element === TAG_STUDY_DESCR[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_STUDY_DESCR[0] && tag.m_element === TAG_STUDY_DESCR[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); const strDescr = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1684,24 +1698,20 @@ class LoaderDicom{ this.m_dicomInfo.m_studyDescr = this.m_dicomInfo.m_studyDescr.trim(); // console.log(`m_studyDescr = ${this.m_dicomInfo.m_studyDescr}`); } - if ((tag.m_group === TAG_BODY_PART_EXAMINED[0]) && (tag.m_element === TAG_BODY_PART_EXAMINED[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_BODY_PART_EXAMINED[0] && tag.m_element === TAG_BODY_PART_EXAMINED[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); this.m_dicomInfo.m_bodyPartExamined = LoaderDicom.getStringAt(dv, 0, dataLen); // console.log(`m_patientName = ${this.m_dicomInfo.m_patientName}`); } - - if ((tag.m_group === TAG_ACQUISION_TIME[0]) && (tag.m_element === TAG_ACQUISION_TIME[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_ACQUISION_TIME[0] && tag.m_element === TAG_ACQUISION_TIME[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); this.m_dicomInfo.m_acquisionTime = LoaderDicom.getStringAt(dv, 0, dataLen); // console.log(`m_acquisionTime = ${this.m_dicomInfo.m_acquisionTime}`); } - if ((tag.m_group === TAG_INSTITUTION_NAME[0]) && (tag.m_element === TAG_INSTITUTION_NAME[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_INSTITUTION_NAME[0] && tag.m_element === TAG_INSTITUTION_NAME[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); this.m_dicomInfo.m_institutionName = LoaderDicom.getUtf8StringAt(dv, 0, dataLen); @@ -1709,24 +1719,21 @@ class LoaderDicom{ // console.log(`m_institutionName = ${this.m_dicomInfo.m_institutionName}`); } - if ((tag.m_group === TAG_OPERATORS_NAME[0]) && (tag.m_element === TAG_OPERATORS_NAME[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_OPERATORS_NAME[0] && tag.m_element === TAG_OPERATORS_NAME[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); this.m_dicomInfo.m_operatorsName = LoaderDicom.getUtf8StringAt(dv, 0, dataLen); this.m_dicomInfo.m_operatorsName = this.m_dicomInfo.m_operatorsName.trim(); // console.log(`m_operatorsName = ${this.m_dicomInfo.m_operatorsName}`); } - if ((tag.m_group === TAG_PHYSICANS_NAME[0]) && (tag.m_element === TAG_PHYSICANS_NAME[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_PHYSICANS_NAME[0] && tag.m_element === TAG_PHYSICANS_NAME[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); this.m_dicomInfo.m_physicansName = LoaderDicom.getUtf8StringAt(dv, 0, dataLen); this.m_dicomInfo.m_physicansName = this.m_dicomInfo.m_physicansName.trim(); // console.log(`m_physicansName = ${this.m_dicomInfo.m_physicansName}`); } - if ((tag.m_group === TAG_MANUFACTURER_NAME[0]) && (tag.m_element === TAG_MANUFACTURER_NAME[1]) && - (tag.m_value !== null)) { + if (tag.m_group === TAG_MANUFACTURER_NAME[0] && tag.m_element === TAG_MANUFACTURER_NAME[1] && tag.m_value !== null) { const dataLen = tag.m_value.byteLength; const dv = new DataView(tag.m_value); this.m_dicomInfo.m_manufacturerName = LoaderDicom.getStringAt(dv, 0, dataLen); @@ -1753,7 +1760,7 @@ class LoaderDicom{ // check correct data from tags const BITS_IN_BYTE = 8; const imageSizeBytes = Math.floor(this.m_xDim * this.m_yDim * (this.m_bitsPerPixel / BITS_IN_BYTE) * this.m_samplesPerPixel); - if ((imageSizeBytes !== tag.m_value.byteLength) || (pixelBitMask === 0)) { + if (imageSizeBytes !== tag.m_value.byteLength || pixelBitMask === 0) { console.log(`Wrong image pixels size. Readed ${tag.m_value.byteLength}, but expected ${imageSizeBytes}`); if (callbackComplete !== undefined) { callbackComplete(LoadResult.ERROR_COMPRESSED_IMAGE_NOT_SUPPORTED); @@ -1801,8 +1808,6 @@ class LoaderDicom{ // console.log(`seriesDescr = ${volSlice.m_seriesDescr}`); // console.log(`bodyPartExamined = ${volSlice.m_bodyPartExamined}`); - - // Fill slice image // const imageDst = this.m_slices[this.m_imageNumber]; const imageDst = volSlice.m_image; @@ -1824,7 +1829,7 @@ class LoaderDicom{ const val = imageSrc.getUint8(i); imageDst[i] = val; } - // if 1 sample per pixel + // if 1 sample per pixel } else if (this.m_samplesPerPixel === NUM_3) { // if 3 samples per pixel let j = 0; @@ -1845,7 +1850,8 @@ class LoaderDicom{ i2 += SIZE_SHORT; imageDst[i] = val; } // end for i pixels - } else { // if 16 bpp + } else { + // if 16 bpp console.log('TODO: need to implement reading non-8 and non-16 bit dicom images'); } this.m_error = DICOM_ERROR_OK; @@ -1862,21 +1868,18 @@ class LoaderDicom{ readFromUrl(volSet, strUrl, callbackProgress, callbackComplete) { // check arguments - console.assert(volSet != null, "Null volume"); - console.assert(volSet instanceof VolumeSet, "Should be volume set"); - console.assert(strUrl != null, "Null string url"); - + console.assert(volSet != null, 'Null volume'); + console.assert(volSet instanceof VolumeSet, 'Should be volume set'); + console.assert(strUrl != null, 'Null string url'); + // console.log(`typeof(strUrl) - ${typeof(strUrl)}`); - console.assert(typeof(strUrl) === 'string', "Should be string in url"); - - // replace file name to 'file_list.txt' - const ft = new FileTools(); - const isValidUrl = ft.isValidUrl(strUrl); - if (!isValidUrl) { + console.assert(typeof strUrl === 'string', 'Should be string in url'); + + if (!FileTools.isValidUrl(strUrl)) { console.log(`readFromUrl: not vaild URL = = ${strUrl} `); return false; } - this.m_folder = ft.getFolderNameFromUrl(strUrl); + this.m_folder = FileTools.getFolderNameFromUrl(strUrl); const urlFileList = this.m_folder + '/file_list.txt'; console.log(`readFromUrl: load file = ${urlFileList} `); @@ -1884,26 +1887,29 @@ class LoaderDicom{ this.m_callbackComplete = callbackComplete; this.m_callbackProgress = callbackProgress; this.m_fileListCounter = 0; - fileLoader.readFile((arrBuf) => { - this.m_fileListCounter += 1; - if (this.m_fileListCounter === 1) { - const okRead = this.readReadyFileList(volSet, arrBuf, callbackProgress, callbackComplete); - return okRead; + fileLoader.readFile( + (arrBuf) => { + this.m_fileListCounter += 1; + if (this.m_fileListCounter === 1) { + const okRead = this.readReadyFileList(volSet, arrBuf, callbackProgress, callbackComplete); + return okRead; + } + return true; + }, + (errMsg) => { + console.log(`Error read file: ${errMsg}`); + callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); + return false; } - return true; - }, (errMsg) => { - console.log(`Error read file: ${errMsg}`); - callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); - return false; - }); // get file from server + ); // get file from server return true; } readReadyFileList(volSet, arrBuf, callbackProgress, callbackComplete) { // check arguments - console.assert(volSet != null, "Null volume"); - console.assert(volSet instanceof VolumeSet, "Should be volume set"); - console.assert(arrBuf != null, "Null array"); - console.assert(arrBuf.constructor.name === "ArrayBuffer", "Should be ArrayBuf in arrBuf"); + console.assert(volSet != null, 'Null volume'); + console.assert(volSet instanceof VolumeSet, 'Should be volume set'); + console.assert(arrBuf != null, 'Null array'); + console.assert(arrBuf.constructor.name === 'ArrayBuffer', 'Should be ArrayBuf in arrBuf'); const uint8Arr = new Uint8Array(arrBuf); // const strFileContent = new TextDecoder('utf-8').decode(uint8Arr); @@ -1955,7 +1961,7 @@ class LoaderDicom{ // eslint-disable-next-line y: +1.0e12, // eslint-disable-next-line - z: +1.0e12 + z: +1.0e12, }; this.m_imagePosMax = { // eslint-disable-next-line @@ -1963,7 +1969,7 @@ class LoaderDicom{ // eslint-disable-next-line y: -1.0e12, // eslint-disable-next-line - z: -1.0e12 + z: -1.0e12, }; // eslint-disable-next-line @@ -1971,7 +1977,7 @@ class LoaderDicom{ // eslint-disable-next-line this.m_sliceLocMax = -1.0e12; - for (let i = 0; (i < this.m_numLoadedFiles) && (this.m_numFailsLoad < 1); i++) { + for (let i = 0; i < this.m_numLoadedFiles && this.m_numFailsLoad < 1; i++) { const urlFile = `${this.m_folder}/${arrFileNames[i]}`; // console.log(`Loading (${i})-th url: ${urlFile}`); this.m_loaders[i] = new FileLoader(urlFile); @@ -1981,119 +1987,116 @@ class LoaderDicom{ //if (volDst === null) { // volDst = new Volume(); // volSet.addVolume(volDst); - // } + // } const okLoader = this.runLoader(volSet, arrFileNames[i], loader, i, callbackProgress, callbackComplete, NOT_FROM_GOOGLE); if (!okLoader) { return false; } - } // for i all files-slices in folder + } // for i all files-slices in folder return true; } // end readReadyFileList(arrBuf) /** - * Run loader to read dicom file - * @param {object} volSet - destination volum set - * @param {string} fileName - File to read - * @param {object} loader - loader object with file inside - * @param {number} i - index of file in files array - * @param {func} callbackProgress - callback for continiuos load reporting - * @param {func} callbackComplete - callback after load finish - * @param {bool} fromGoogle - true, if from google store - * - */ + * Run loader to read dicom file + * @param {object} volSet - destination volum set + * @param {string} fileName - File to read + * @param {object} loader - loader object with file inside + * @param {number} i - index of file in files array + * @param {func} callbackProgress - callback for continiuos load reporting + * @param {func} callbackComplete - callback after load finish + * @param {bool} fromGoogle - true, if from google store + * + */ runLoader(volSet, fileName, loader, i, callbackProgress, callbackComplete, fromGoogle) { this.m_fromGoogle = fromGoogle; // console.log(`Loading url: ${fileName}`); - loader.readFile((fileArrBu) => { - const ratioLoaded = this.m_filesLoadedCounter / this.m_numLoadedFiles; - const VAL_MASK = 7; - if ((callbackProgress !== undefined) && ((this.m_filesLoadedCounter & VAL_MASK) === 0)) { - callbackProgress(ratioLoaded); - } - if ((callbackProgress !== undefined) && - (this.m_filesLoadedCounter + 1 === this.m_numLoadedFiles)) { - callbackProgress(1.0); - } - this.m_newTagEvent.detail.fileName = fileName; - - let status; - if (this.m_fromGoogle) { - status = this.readFromGoogleBuffer(i, fileName, ratioLoaded, fileArrBu, callbackProgress, callbackComplete); - } else { - status = this.readFromBuffer(i, fileName, ratioLoaded, fileArrBu, callbackProgress, callbackComplete); - } + loader.readFile( + (fileArrBu) => { + const ratioLoaded = this.m_filesLoadedCounter / this.m_numLoadedFiles; + const VAL_MASK = 7; + if (callbackProgress !== undefined && (this.m_filesLoadedCounter & VAL_MASK) === 0) { + callbackProgress(ratioLoaded); + } + if (callbackProgress !== undefined && this.m_filesLoadedCounter + 1 === this.m_numLoadedFiles) { + callbackProgress(1.0); + } + this.m_newTagEvent.detail.fileName = fileName; - if ((status !== LoadResult.SUCCESS) && (this.m_numFailsLoad === 0)) { - this.m_numFailsLoad += 1; - if (callbackComplete !== null) { - callbackComplete(status, null, 0, null, fileName); - return false; + let status; + if (this.m_fromGoogle) { + status = this.readFromGoogleBuffer(i, fileName, ratioLoaded, fileArrBu, callbackProgress, callbackComplete); + } else { + status = this.readFromBuffer(i, fileName, ratioLoaded, fileArrBu, callbackProgress, callbackComplete); } - } - // update total files counter - this.m_filesLoadedCounter += 1; - if (DEBUG_PRINT_INDI_SLICE_INFO) { - console.log(`Loaded local indi slice: ${fileName}. Total loaded slices: ${this.m_filesLoadedCounter}`); - } - // console.log(`!!!!!!!!! m_filesLoadedCounter = ${this.m_filesLoadedCounter} / ${this.m_numLoadedFiles}`); - if (this.m_filesLoadedCounter === this.m_numLoadedFiles) { - // Finalize physic dimension - if (DEBUG_PRINT_TAGS_INFO) { - console.log(`slice location (min, max) = ${this.m_sliceLocMin}, ${this.m_sliceLocMax}`); + if (status !== LoadResult.SUCCESS && this.m_numFailsLoad === 0) { + this.m_numFailsLoad += 1; + if (callbackComplete !== null) { + callbackComplete(status, null, 0, null, fileName); + return false; + } } - const imagePosBox = { - x: this.m_imagePosMax.x - this.m_imagePosMin.x, - y: this.m_imagePosMax.y - this.m_imagePosMin.y, - z: this.m_imagePosMax.z - this.m_imagePosMin.z - }; - const TOO_MIN = 0.00001; - let zBox; - if (Math.abs(this.m_pixelSpacing.z) > TOO_MIN) { - zBox = this.m_pixelSpacing.z * this.m_zDim; - } else { - zBox = imagePosBox.z; - if (Math.abs(zBox) < TOO_MIN) { - zBox = imagePosBox.x; + // update total files counter + this.m_filesLoadedCounter += 1; + if (DEBUG_PRINT_INDI_SLICE_INFO) { + console.log(`Loaded local indi slice: ${fileName}. Total loaded slices: ${this.m_filesLoadedCounter}`); + } + // console.log(`!!!!!!!!! m_filesLoadedCounter = ${this.m_filesLoadedCounter} / ${this.m_numLoadedFiles}`); + + if (this.m_filesLoadedCounter === this.m_numLoadedFiles) { + // Finalize physic dimension + if (DEBUG_PRINT_TAGS_INFO) { + console.log(`slice location (min, max) = ${this.m_sliceLocMin}, ${this.m_sliceLocMax}`); + } + const imagePosBox = { + x: this.m_imagePosMax.x - this.m_imagePosMin.x, + y: this.m_imagePosMax.y - this.m_imagePosMin.y, + z: this.m_imagePosMax.z - this.m_imagePosMin.z, + }; + const TOO_MIN = 0.00001; + let zBox; + if (Math.abs(this.m_pixelSpacing.z) > TOO_MIN) { + zBox = this.m_pixelSpacing.z * this.m_zDim; + } else { + zBox = imagePosBox.z; if (Math.abs(zBox) < TOO_MIN) { - zBox = imagePosBox.y; + zBox = imagePosBox.x; + if (Math.abs(zBox) < TOO_MIN) { + zBox = imagePosBox.y; + } } + } // if pixel spacing 0 + if (zBox < TOO_MIN) { + zBox = 1.0; } - } // if pixel spacing 0 - if (zBox < TOO_MIN) { - zBox = 1.0; - } - this.m_pixelSpacing.z = zBox / this.m_zDim; - this.m_boxSize.z = this.m_zDim * this.m_pixelSpacing.z; - this.m_boxSize.x = this.m_xDim * this.m_pixelSpacing.x; - this.m_boxSize.y = this.m_yDim * this.m_pixelSpacing.y; - console.log(`Volume local phys dim: ${this.m_boxSize.x} * ${this.m_boxSize.y} * ${this.m_boxSize.z}`); - // TODO: add hash - let series = this.m_slicesVolume.getSeries(); - if (series.length === 0) { - this.m_slicesVolume.buildSeriesInfo(); - series = this.m_slicesVolume.getSeries(); - } - const indexSerie = 0; - const hash = series[indexSerie].m_hash; - const errStatus = this.createVolumeFromSlices(volSet, indexSerie, hash); - if (callbackComplete !== null) { - callbackComplete(errStatus); - return true; - } - } // if last file was loaded - return true; - }, (errMsg) => { - console.log(`Error read file: ${errMsg}`); - return false; - }); // end of readfile + this.m_pixelSpacing.z = zBox / this.m_zDim; + this.m_boxSize.z = this.m_zDim * this.m_pixelSpacing.z; + this.m_boxSize.x = this.m_xDim * this.m_pixelSpacing.x; + this.m_boxSize.y = this.m_yDim * this.m_pixelSpacing.y; + console.log(`Volume local phys dim: ${this.m_boxSize.x} * ${this.m_boxSize.y} * ${this.m_boxSize.z}`); + // TODO: add hash + let series = this.m_slicesVolume.getSeries(); + if (series.length === 0) { + this.m_slicesVolume.buildSeriesInfo(); + series = this.m_slicesVolume.getSeries(); + } + const indexSerie = 0; + const hash = series[indexSerie].m_hash; + const errStatus = this.createVolumeFromSlices(volSet, indexSerie, hash); + if (callbackComplete !== null) { + callbackComplete(errStatus); + return true; + } + } // if last file was loaded + return true; + }, + (errMsg) => { + console.log(`Error read file: ${errMsg}`); + return false; + } + ); // end of readfile return true; } // end runLoader - - - } // end class LoaderDicom export default LoaderDicom; - - \ No newline at end of file diff --git a/src/demo/engine/loaders/LoaderHdr.js b/src/engine/loaders/LoaderHdr.js similarity index 72% rename from src/demo/engine/loaders/LoaderHdr.js rename to src/engine/loaders/LoaderHdr.js index 1229523d..5afb751e 100644 --- a/src/demo/engine/loaders/LoaderHdr.js +++ b/src/engine/loaders/LoaderHdr.js @@ -1,3 +1,8 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview LoaderHdr * @author Epam @@ -14,7 +19,6 @@ import LoadFilePromise from './LoadPromise'; import Volume from '../Volume'; import VolumeSet from '../VolumeSet'; - // ******************************************************** // Const // ******************************************************** @@ -38,41 +42,41 @@ class LoaderHdr { } /** - * Read 32 bit integer from input buffer - * @param {object} buf - source buffer - * @param {number} off - offset in buffer - * @return 32 bit integer number - */ + * Read 32 bit integer from input buffer + * @param {object} buf - source buffer + * @param {number} off - offset in buffer + * @return 32 bit integer number + */ static readIntFromBuffer(buf, off) { - const res = ((buf[off + 0]) | + const res = + buf[off + 0] | // eslint-disable-next-line (buf[off + 1] << 8) | // eslint-disable-next-line (buf[off + 2] << 16) | // eslint-disable-next-line - (buf[off + 3] << 24) - ); + (buf[off + 3] << 24); return res; } /** - * Read 16 bit short integer from input buffer - * @param {object} buf - source buffer - * @param {number} off - offset in buffer - * @return 16 bit short integer number - */ + * Read 16 bit short integer from input buffer + * @param {object} buf - source buffer + * @param {number} off - offset in buffer + * @return 16 bit short integer number + */ static readShortFromBuffer(buf, off) { // eslint-disable-next-line - const res = ((buf[off + 0]) | (buf[off + 1] << 8)); + const res = buf[off + 0] | (buf[off + 1] << 8); return res; } /** - * Read 32 bit float from input buffer - * @param {object} buf - source buffer - * @param {number} off - offset in buffer - * @return 32 bit float number - */ + * Read 32 bit float from input buffer + * @param {object} buf - source buffer + * @param {number} off - offset in buffer + * @return 32 bit float number + */ static readFloatFromBuffer(buf, off) { const BYTES_IN_FLOAT = 4; const arBuf = new ArrayBuffer(BYTES_IN_FLOAT); @@ -91,12 +95,12 @@ class LoaderHdr { } /** - * Convert DataView object into string - * @param {object} buf - buffer - * @param {number} off - current offset in buffer, when string started - * @param {number} lengthBuf - number of bytes to convert to string - * @return {string} string presentation of DataView - */ + * Convert DataView object into string + * @param {object} buf - buffer + * @param {number} off - current offset in buffer, when string started + * @param {number} lengthBuf - number of bytes to convert to string + * @return {string} string presentation of DataView + */ static getStringAt(buf, off, lengthBuf) { let str = ''; for (let i = 0; i < lengthBuf; i++) { @@ -114,10 +118,10 @@ class LoaderHdr { // readFromBufferHeader(volumeDst, arrBuf, callbackProgress, callbackComplete) { // check arguments - console.assert(volumeDst != null, "Null volume"); - console.assert(volumeDst instanceof Volume, "Should be volume"); - console.assert(arrBuf != null, "Null array"); - console.assert(arrBuf.constructor.name === "ArrayBuffer", "Should be ArrayBuf in arrBuf"); + console.assert(volumeDst != null, 'Null volume'); + console.assert(volumeDst instanceof Volume, 'Should be volume'); + console.assert(arrBuf != null, 'Null array'); + console.assert(arrBuf.constructor.name === 'ArrayBuffer', 'Should be ArrayBuf in arrBuf'); const bufBytes = new Uint8Array(arrBuf); const bufLen = bufBytes.length; @@ -193,7 +197,7 @@ class LoaderHdr { const iRegular = LoaderHdr.readByteFromBuffer(bufBytes, bufOff); bufOff += SIZE_BYTE; - const MAGIC_REGULAR = 114; + const MAGIC_REGULAR = 114; if (iRegular !== MAGIC_REGULAR) { console.log(`Hdr wrong regular in header. Should be ${MAGIC_REGULAR}, but found: ${iRegular}`); if (callbackComplete) { @@ -303,24 +307,24 @@ class LoaderHdr { // readFromBufferImage(volumeDst, arrBuf, callbackProgress, callbackComplete) { // check arguments - console.assert(volumeDst != null, "Null volume"); - console.assert(volumeDst instanceof Volume, "Should be volume"); - console.assert(arrBuf != null, "Null array"); - console.assert(arrBuf.constructor.name === "ArrayBuffer", "Should be ArrayBuf in arrBuf"); + console.assert(volumeDst != null, 'Null volume'); + console.assert(volumeDst instanceof Volume, 'Should be volume'); + console.assert(arrBuf != null, 'Null array'); + console.assert(arrBuf.constructor.name === 'ArrayBuffer', 'Should be ArrayBuf in arrBuf'); const bufBytes = new Uint8Array(arrBuf); const bufLen = bufBytes.length; const MIN_BUF_SIZE = 8; - const MAX_BUF_SIZE = (1024 * 1024 * 230); + const MAX_BUF_SIZE = 1024 * 1024 * 230; if (bufLen < MIN_BUF_SIZE) { if (callbackComplete) { - callbackComplete(LoadResult.ERROR_TOO_SMALL_DATA_SIZE , null, 0, null); + callbackComplete(LoadResult.ERROR_TOO_SMALL_DATA_SIZE, null, 0, null); } return false; } if (bufLen >= MAX_BUF_SIZE) { if (callbackComplete) { - callbackComplete(LoadResult.ERROR_TOO_LARGE_DATA_SIZE , null, 0, null); + callbackComplete(LoadResult.ERROR_TOO_LARGE_DATA_SIZE, null, 0, null); } return false; } @@ -335,9 +339,9 @@ class LoaderHdr { // createVolumeFromHeaderAndImage(volDst) { // check arguments - console.assert(volDst != null, "Null volume"); - console.assert(volDst instanceof Volume, "Should be volume"); - + console.assert(volDst != null, 'Null volume'); + console.assert(volDst instanceof Volume, 'Should be volume'); + const NUM_BYTES_CHAR = 1; const NUM_BYTES_WORD = 2; @@ -362,7 +366,7 @@ class LoaderHdr { let i; let valMax = 0; for (i = 0; i < numPixels; i++) { - valMax = (dataArray16[i] > valMax) ? dataArray16[i] : valMax; + valMax = dataArray16[i] > valMax ? dataArray16[i] : valMax; } // console.log(`IMG: maximum input color is ${valMax}`); valMax++; @@ -370,7 +374,7 @@ class LoaderHdr { // scale down to 256 colors const MAX_COLOR_BYTE = 255; for (i = 0; i < numPixels; i++) { - volDst.m_dataArray[i] = Math.floor(MAX_COLOR_BYTE * dataArray16[i] / valMax); + volDst.m_dataArray[i] = Math.floor((MAX_COLOR_BYTE * dataArray16[i]) / valMax); } } else if (volDst.m_dataType === HDR_DT_UNSIGNED_CHAR) { // Read color indices info: usually this is 1 bpp data @@ -390,10 +394,10 @@ class LoaderHdr { // createRoiVolumeFromHeaderAndImage(volDst, volRoi) { // check arguments - console.assert(volDst != null, "Null volume"); - console.assert(volDst instanceof Volume, "Should be volume"); - console.assert(volRoi != null, "Null volume"); - console.assert(volRoi instanceof Volume, "Should be volume"); + console.assert(volDst != null, 'Null volume'); + console.assert(volDst instanceof Volume, 'Should be volume'); + console.assert(volRoi != null, 'Null volume'); + console.assert(volRoi instanceof Volume, 'Should be volume'); // both volumes are in 1 byte format const ONE = 1; @@ -406,7 +410,7 @@ class LoaderHdr { return false; } // compare size - if ((volDst.m_xDim !== volRoi.m_xDim) || (volDst.m_yDim !== volRoi.m_yDim) || (volDst.m_zDim !== volRoi.m_zDim)) { + if (volDst.m_xDim !== volRoi.m_xDim || volDst.m_yDim !== volRoi.m_yDim || volDst.m_zDim !== volRoi.m_zDim) { console.log('createRoiVolumeFromHeaderAndImage: different volumes sizes'); return false; } @@ -417,8 +421,10 @@ class LoaderHdr { const arrBuf = volRoi.m_arrBuf; const dataArrayRoi8 = new Uint8Array(arrBuf); - const OFF0 = 0; const OFF1 = 1; - const OFF2 = 2; const OFF3 = 3; + const OFF0 = 0; + const OFF1 = 1; + const OFF2 = 2; + const OFF3 = 3; let j = 0; for (let i = 0; i < numPixels; i++, j += BYTES_IN_RGBA) { dataNew[j + OFF0] = volDst.m_dataArray[i]; @@ -435,7 +441,7 @@ class LoaderHdr { /** * Read hdr (h + img) files from URL - * + * * @param {object} volSet - volume set * @param {string} strUrl - url string * @param {func} callbackProgress - callback during read progress @@ -445,14 +451,12 @@ class LoaderHdr { readFromUrl(volSet, strUrl, callbackProgress, callbackComplete) { console.log(`readFromUrl. going to read from ${strUrl} ...`); - const ft = new FileTools(); - const isValidUrl = ft.isValidUrl(strUrl); - if (!isValidUrl) { + if (!FileTools.isValidUrl(strUrl)) { console.log(`readFromUrl: not vaild URL = = ${strUrl} `); return false; } - this.m_folder = ft.getFolderNameFromUrl(strUrl); - const fileName = ft.getFileNameFromUrl(strUrl); + this.m_folder = FileTools.getFolderNameFromUrl(strUrl); + const fileName = FileTools.getFileNameFromUrl(strUrl); // console.log(`readFromUrl: folder = ${this.m_folder} filename = ${fileName}`); const regExp = /(\w+)_intn.(h|hdr)/; @@ -464,12 +468,11 @@ class LoaderHdr { const namePrefix = arrGrp[1]; //console.log(`readFromUrl: name prefix = ${namePrefix}, grpLen = ${arrGrp.length}`); - const fileNameIntensityHeader = this.m_folder + '/' + namePrefix + '_intn.h'; + const fileNameIntensityHeader = this.m_folder + '/' + namePrefix + '_intn.hdr'; const fileNameIntensityImage = this.m_folder + '/' + namePrefix + '_intn.img'; - const fileNameMaskHeader = this.m_folder + '/' + namePrefix + '_mask.h'; + const fileNameMaskHeader = this.m_folder + '/' + namePrefix + '_mask.hdr'; const fileNameMaskImage = this.m_folder + '/' + namePrefix + '_mask.img'; - const arrUrls = []; arrUrls.push(fileNameIntensityHeader); arrUrls.push(fileNameIntensityImage); @@ -481,18 +484,16 @@ class LoaderHdr { } // end of readFromUrl /** - * + * * @param {object} arrUrls - array of strings urls * @param {*} volSet - dest volume set * @param {*} callbackProgress - callback during read * @param {*} callbackComplete - callback after end fo read */ readFromUrls(arrUrls, volSet, callbackProgress, callbackComplete) { - // check arguments - console.assert(volSet != null, "Null volume set"); - console.assert(volSet instanceof VolumeSet, "Should be volume set"); - + console.assert(volSet != null, 'Null volume set'); + console.assert(volSet instanceof VolumeSet, 'Should be volume set'); const numUrls = arrUrls.length; const NUM_URLS_IN_SET = 2; @@ -502,11 +503,7 @@ class LoaderHdr { let urlImg = arrUrls[1]; const loaderHdr = new LoadFilePromise(); const loaderImg = new LoadFilePromise(); - let indPointH = urlHdr.indexOf('.h'); - if (indPointH === -1) { - indPointH = urlHdr.indexOf('.hdr'); - } - if (indPointH === -1) { + if (urlHdr.indexOf('.hdr') === -1) { const strCopy = urlHdr; urlHdr = urlImg; urlImg = strCopy; @@ -515,25 +512,27 @@ class LoaderHdr { // this.m_volIntensity = new HdrVolume(this.m_needScaleDownTexture); const volDst = volSet.getVolume(0); - loaderHdr.readFromUrl(urlHdr).then((arrBufHdr) => { - this.readFromBufferHeader(volDst, arrBufHdr, callbackComplete, callbackProgress); - console.log(`Load success HDR file: ${urlHdr}`); - loaderImg.readFromUrl(urlImg).then((arrBufImg) => { - this.readFromBufferImage(volDst, arrBufImg, callbackComplete, callbackProgress); - console.log(`Load success IMG file: ${urlImg}`); - - // complete 2 images - this.createVolumeFromHeaderAndImage(volDst); - - // invoke callback for good loading end - callbackComplete(LoadResult.SUCCESS); - - }); - }, (error) => { - console.log('HDR File read error', error); - callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); - return false; - }); + loaderHdr.readFromUrl(urlHdr).then( + (arrBufHdr) => { + this.readFromBufferHeader(volDst, arrBufHdr, callbackComplete, callbackProgress); + console.log(`Load success HDR file: ${urlHdr}`); + loaderImg.readFromUrl(urlImg).then((arrBufImg) => { + this.readFromBufferImage(volDst, arrBufImg, callbackComplete, callbackProgress); + console.log(`Load success IMG file: ${urlImg}`); + + // complete 2 images + this.createVolumeFromHeaderAndImage(volDst); + + // invoke callback for good loading end + callbackComplete(LoadResult.SUCCESS); + }); + }, + (error) => { + console.log('HDR File read error', error); + callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); + return false; + } + ); } else if (numUrls === NUM_FILES_VOL_INT_ROI) { // read 4 files const urlHdrInt = arrUrls[0]; @@ -552,49 +551,48 @@ class LoaderHdr { const volRoi = new Volume(); const volDst = volSet.getVolume(0); - loaderHdrInt.readFromUrl(urlHdrInt).then((arrBufHdr) => { - // this.m_volIntensity.readBufferHead(arrBufHdr, callbackComplete, callbackProgress); - // this.readBufferHead(arrBufHdr, callbackComplete, callbackProgress); - this.readFromBufferHeader(volDst, arrBufHdr, callbackComplete, callbackProgress); - - console.log(`Load success HDR file: ${urlHdrInt}`); - loaderImgInt.readFromUrl(urlImgInt).then((arrBufImg) => { - // this.m_volIntensity.readBufferImg(arrBufImg, callbackComplete, callbackProgress); - // this.readBufferImg(arrBufImg, callbackComplete, callbackProgress); - this.readFromBufferImage(volDst, arrBufImg, callbackComplete, callbackProgress); - console.log(`Load success IMG file: ${urlImgInt}`); - - loaderHdrRoi.readFromUrl(urlHdrRoi).then((arrBufferHdr) => { - //this.m_volRoi.readBufferHead(arrBufferHdr, callbackComplete, callbackProgress); - this.readFromBufferHeader(volRoi, arrBufferHdr, callbackComplete, callbackProgress); - - loaderImgRoi.readFromUrl(urlImgRoi).then((arrBufferImg) => { - - // this.m_volRoi.readBufferImg(arrBufferImg, callbackComplete, callbackProgress); - this.readFromBufferImage(volRoi, arrBufferImg, callbackComplete, callbackProgress); - - // transform intensity data from 16 bpp -> 8 bpp - this.createVolumeFromHeaderAndImage(volDst); - - // mix intensity + roi - this.createRoiVolumeFromHeaderAndImage(volDst, volRoi); - - // invoke callback for good loading end - callbackComplete(LoadResult.SUCCESS); - - }); // loaderImgRoi - }); // loaderHdrRoi - - }); // loaderImgInt - }, (error) => { - console.log('HDR File read error', error); - return false; - }); // loaderHdrInt - + loaderHdrInt.readFromUrl(urlHdrInt).then( + (arrBufHdr) => { + // this.m_volIntensity.readBufferHead(arrBufHdr, callbackComplete, callbackProgress); + // this.readBufferHead(arrBufHdr, callbackComplete, callbackProgress); + this.readFromBufferHeader(volDst, arrBufHdr, callbackComplete, callbackProgress); + + console.log(`Load success HDR file: ${urlHdrInt}`); + loaderImgInt.readFromUrl(urlImgInt).then((arrBufImg) => { + // this.m_volIntensity.readBufferImg(arrBufImg, callbackComplete, callbackProgress); + // this.readBufferImg(arrBufImg, callbackComplete, callbackProgress); + this.readFromBufferImage(volDst, arrBufImg, callbackComplete, callbackProgress); + console.log(`Load success IMG file: ${urlImgInt}`); + + loaderHdrRoi.readFromUrl(urlHdrRoi).then((arrBufferHdr) => { + //this.m_volRoi.readBufferHead(arrBufferHdr, callbackComplete, callbackProgress); + this.readFromBufferHeader(volRoi, arrBufferHdr, callbackComplete, callbackProgress); + + loaderImgRoi.readFromUrl(urlImgRoi).then((arrBufferImg) => { + // this.m_volRoi.readBufferImg(arrBufferImg, callbackComplete, callbackProgress); + this.readFromBufferImage(volRoi, arrBufferImg, callbackComplete, callbackProgress); + + // transform intensity data from 16 bpp -> 8 bpp + this.createVolumeFromHeaderAndImage(volDst); + + // mix intensity + roi + this.createRoiVolumeFromHeaderAndImage(volDst, volRoi); + + // invoke callback for good loading end + callbackComplete(LoadResult.SUCCESS); + }); // loaderImgRoi + }); // loaderHdrRoi + }); // loaderImgInt + }, + (error) => { + console.log('HDR File read error', error); + return false; + } + ); // loaderHdrInt } else { console.log(`Error read hdr files. Should be ${NUM_URLS_IN_SET} files`); return false; - }// if number of files equal to 2 + } // if number of files equal to 2 return true; } // end of readFromUrls } // end class LoaderHdr diff --git a/src/demo/engine/loaders/LoaderKtx.js b/src/engine/loaders/LoaderKtx.js similarity index 78% rename from src/demo/engine/loaders/LoaderKtx.js rename to src/engine/loaders/LoaderKtx.js index 4f9af1e5..a67bb7ca 100644 --- a/src/demo/engine/loaders/LoaderKtx.js +++ b/src/engine/loaders/LoaderKtx.js @@ -1,10 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview LoaderKtx * @author Epam * @version 1.0.0 */ - // ******************************************************** // Imports // ******************************************************** @@ -51,12 +55,12 @@ export default class LoaderKtx { m_numberOfArrayElements: 0, m_numberOfFaces: 0, m_numberOfMipmapLevels: 0, - m_bytesOfKeyValueData: 0 + m_bytesOfKeyValueData: 0, }; this.m_boxSize = { x: 0.0, y: 0.0, - z: 0.0 + z: 0.0, }; } // constructor @@ -78,8 +82,10 @@ export default class LoaderKtx { const BYTES_IN_FLOAT = 4; const arBuf = new ArrayBuffer(BYTES_IN_FLOAT); const dataArray = new DataView(arBuf); - const OFF_0 = 0; const OFF_1 = 1; - const OFF_2 = 2; const OFF_3 = 3; + const OFF_0 = 0; + const OFF_1 = 1; + const OFF_2 = 2; + const OFF_3 = 3; dataArray.setUint8(OFF_0, buf[off + OFF_0]); dataArray.setUint8(OFF_1, buf[off + OFF_1]); dataArray.setUint8(OFF_2, buf[off + OFF_2]); @@ -110,7 +116,7 @@ export default class LoaderKtx { // console.log(`readFromKtx. data = ${bufBytes}`); // read header - const arrayHeaderSign = [0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A]; + const arrayHeaderSign = [0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a]; const lenHeaderSign = arrayHeaderSign.length; let isHeaderSignCorrect = true; let i; @@ -136,7 +142,8 @@ export default class LoaderKtx { const ENDIANNESS_16 = 16; const ENDIAN_CONST = 0x04030201; // read endianess - this.m_header.m_endianness = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; + this.m_header.m_endianness = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; if (this.m_header.m_endianness !== ENDIAN_CONST) { const strFoundEndns = this.m_header.m_endianness.toString(ENDIANNESS_16); // eslint-disable-next-line @@ -148,25 +155,34 @@ export default class LoaderKtx { } // read - this.m_header.m_glType = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; - this.m_header.m_glTypeSize = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; - this.m_header.m_glFormat = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; + this.m_header.m_glType = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; + this.m_header.m_glTypeSize = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; + this.m_header.m_glFormat = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; if ( - (this.m_header.m_glFormat !== KtxHeader.KTX_GL_RED) && - (this.m_header.m_glFormat !== KtxHeader.KTX_GL_RGB) && - (this.m_header.m_glFormat !== KtxHeader.KTX_GL_RGBA)) { + this.m_header.m_glFormat !== KtxHeader.KTX_GL_RED && + this.m_header.m_glFormat !== KtxHeader.KTX_GL_RGB && + this.m_header.m_glFormat !== KtxHeader.KTX_GL_RGBA + ) { console.log('KTX header.m_glFormat is WRONG'); if (callbackComplete !== undefined) { callbackComplete(LoadResult.UNSUPPORTED_COLOR_FORMAT); } return LoadResult.UNSUPPORTED_COLOR_FORMAT; } - this.m_header.m_glInternalFormat = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; - this.m_header.m_glBaseInternalFormat = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; - this.m_header.m_pixelWidth = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; - this.m_header.m_pixelHeight = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; - this.m_header.m_pixelDepth = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; + this.m_header.m_glInternalFormat = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; + this.m_header.m_glBaseInternalFormat = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; + this.m_header.m_pixelWidth = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; + this.m_header.m_pixelHeight = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; + this.m_header.m_pixelDepth = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; // save to result volume volDst.m_xDim = this.m_header.m_pixelWidth; @@ -177,17 +193,15 @@ export default class LoaderKtx { const head = this.m_header; // console.log(`check dim: ${head.m_pixelWidth} * ${head.m_pixelHeight} * ${head.m_pixelDepth}`); const MIN_DIM = 4; - const MAX_DIM = (1024 * 8); - if ((head.m_pixelWidth < MIN_DIM) || (head.m_pixelHeight < MIN_DIM) - || (head.m_pixelDepth < MIN_DIM)) { + const MAX_DIM = 1024 * 8; + if (head.m_pixelWidth < MIN_DIM || head.m_pixelHeight < MIN_DIM || head.m_pixelDepth < MIN_DIM) { console.log(`KTX dims too small: ${head.m_pixelWidth} * ${head.m_pixelHeight} * ${head.m_pixelDepth}`); if (callbackComplete !== undefined) { callbackComplete(LoadResult.WRONG_IMAGE_DIM_X); } return LoadResult.WRONG_IMAGE_DIM_X; } - if ((head.m_pixelWidth > MAX_DIM) || (head.m_pixelHeight > MAX_DIM) - || (head.m_pixelDepth > MAX_DIM)) { + if (head.m_pixelWidth > MAX_DIM || head.m_pixelHeight > MAX_DIM || head.m_pixelDepth > MAX_DIM) { console.log(`KTX dims too large: ${head.m_pixelWidth} * ${head.m_pixelHeight} * ${head.m_pixelDepth}`); if (callbackComplete !== undefined) { callbackComplete(LoadResult.WRONG_IMAGE_DIM_X); @@ -195,10 +209,14 @@ export default class LoaderKtx { return LoadResult.WRONG_IMAGE_DIM_X; } - this.m_header.m_numberOfArrayElements = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; - this.m_header.m_numberOfFaces = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; - this.m_header.m_numberOfMipmapLevels = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; - this.m_header.m_bytesOfKeyValueData = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; + this.m_header.m_numberOfArrayElements = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; + this.m_header.m_numberOfFaces = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; + this.m_header.m_numberOfMipmapLevels = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; + this.m_header.m_bytesOfKeyValueData = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; let bytesPerVoxel = 0; const SIZE_BYTE = 1; @@ -235,14 +253,20 @@ export default class LoaderKtx { console.log(`UDataString = ${str}`); // read vector if (str === 'fBoxMin') { - xMin = LoaderKtx.readFloat(bufBytes, udataOff); udataOff += SIZE_DWORD; - yMin = LoaderKtx.readFloat(bufBytes, udataOff); udataOff += SIZE_DWORD; - zMin = LoaderKtx.readFloat(bufBytes, udataOff); udataOff += SIZE_DWORD; + xMin = LoaderKtx.readFloat(bufBytes, udataOff); + udataOff += SIZE_DWORD; + yMin = LoaderKtx.readFloat(bufBytes, udataOff); + udataOff += SIZE_DWORD; + zMin = LoaderKtx.readFloat(bufBytes, udataOff); + udataOff += SIZE_DWORD; console.log(`vBoxMix = ${xMin} * ${yMin} * ${zMin}`); } else if (str === 'fBoxMax') { - xMax = LoaderKtx.readFloat(bufBytes, udataOff); udataOff += SIZE_DWORD; - yMax = LoaderKtx.readFloat(bufBytes, udataOff); udataOff += SIZE_DWORD; - zMax = LoaderKtx.readFloat(bufBytes, udataOff); udataOff += SIZE_DWORD; + xMax = LoaderKtx.readFloat(bufBytes, udataOff); + udataOff += SIZE_DWORD; + yMax = LoaderKtx.readFloat(bufBytes, udataOff); + udataOff += SIZE_DWORD; + zMax = LoaderKtx.readFloat(bufBytes, udataOff); + udataOff += SIZE_DWORD; this.m_boxSize.x = xMax - xMin; this.m_boxSize.y = yMax - yMin; this.m_boxSize.z = zMax - zMin; @@ -252,11 +276,9 @@ export default class LoaderKtx { } // while udata not ended } // if have key data // read image data size - this.m_dataSize = LoaderKtx.readInt(bufBytes, bufOff); bufOff += SIZE_DWORD; - const dataSizeCalculated = - this.m_header.m_pixelWidth * - this.m_header.m_pixelHeight * - this.m_header.m_pixelDepth * bytesPerVoxel; + this.m_dataSize = LoaderKtx.readInt(bufBytes, bufOff); + bufOff += SIZE_DWORD; + const dataSizeCalculated = this.m_header.m_pixelWidth * this.m_header.m_pixelHeight * this.m_header.m_pixelDepth * bytesPerVoxel; if (this.m_dataSize !== dataSizeCalculated) { console.log('!!! not implemented yet'); if (callbackComplete !== undefined) { @@ -269,7 +291,7 @@ export default class LoaderKtx { let pwr2; let pwrFinish = false; const MAX_POWER = 29; - for (pwr2 = MAX_POWER; (pwr2 >= 0) && (!pwrFinish); pwr2--) { + for (pwr2 = MAX_POWER; pwr2 >= 0 && !pwrFinish; pwr2--) { const val = 1 << pwr2; if (val < this.m_dataSize) { pwrFinish = true; @@ -288,7 +310,7 @@ export default class LoaderKtx { this.m_dataArray[i] = bufBytes[bufOff]; bufOff += 1; // progress update - if ((callbackProgress !== undefined) && ((i & progressMask) === 0) && (i > 0)) { + if (callbackProgress !== undefined && (i & progressMask) === 0 && i > 0) { const ratio = i / this.m_dataSize; callbackProgress(ratio); } @@ -321,23 +343,26 @@ export default class LoaderKtx { } // end readFromBuffer /** - * - * Read Ktx file from URL - * @param {object} volDst volume to read - * @param {string} strUrl from where - * @param {Function} callbackProgress invoke during loading - * @param {Function} callbackComplete invoke at the end with final success code - */ + * + * Read Ktx file from URL + * @param {object} volDst volume to read + * @param {string} strUrl from where + * @param {Function} callbackProgress invoke during loading + * @param {Function} callbackComplete invoke at the end with final success code + */ readFromUrl(volDst, strUrl, callbackProgress, callbackComplete) { console.log(`LoadedKtx. staring read ${strUrl}`); this.m_fileLoader = new FileLoader(strUrl); - this.m_fileLoader.readFile((arrBuf) => { - this.readFromBuffer(volDst, arrBuf, callbackProgress, callbackComplete); - return; - }, (errMsg) => { - console.log(`LoaderKtx. Error read file: ${errMsg}`); - callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); - return; - }); + this.m_fileLoader.readFile( + (arrBuf) => { + this.readFromBuffer(volDst, arrBuf, callbackProgress, callbackComplete); + return; + }, + (errMsg) => { + console.log(`LoaderKtx. Error read file: ${errMsg}`); + callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); + return; + } + ); } // end of readFromUrl } // end class diff --git a/src/demo/engine/loaders/LoaderNifti.js b/src/engine/loaders/LoaderNifti.js similarity index 80% rename from src/demo/engine/loaders/LoaderNifti.js rename to src/engine/loaders/LoaderNifti.js index 164095e3..11f5fb2e 100644 --- a/src/demo/engine/loaders/LoaderNifti.js +++ b/src/engine/loaders/LoaderNifti.js @@ -1,16 +1,20 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview LoaderNifti * @author Epam * @version 1.0.0 */ - // ******************************************************** // Imports // ******************************************************** import LoadResult from '../LoadResult'; -import UiHistogram from '../../ui/UiHistogram'; +import HistogramUtils from '../../ui/Histogram/HistogramUtils'; import FileLoader from './FileLoader'; // ******************************************************** @@ -46,7 +50,7 @@ class LoaderNifti { m_numberOfArrayElements: 0, m_numberOfFaces: 0, m_numberOfMipmapLevels: 0, - m_bytesOfKeyValueData: 0 + m_bytesOfKeyValueData: 0, }; this.m_xDim = 0; this.m_yDim = 0; @@ -54,62 +58,64 @@ class LoaderNifti { this.m_boxSize = { x: 0.0, y: 0.0, - z: 0.0 + z: 0.0, }; } // constructor /** - * Read 32 bit integer from input buffer - * @param {object} buf - source buffer - * @param {number} off - offset in buffer - * @return 32 bit integer number - */ + * Read 32 bit integer from input buffer + * @param {object} buf - source buffer + * @param {number} off - offset in buffer + * @return 32 bit integer number + */ readIntFromBuffer(buf, off) { let res = 0; if (this.m_littleEndian) { - res = ((buf[off + 0]) | + res = + buf[off + 0] | // eslint-disable-next-line (buf[off + 1] << 8) | // eslint-disable-next-line (buf[off + 2] << 16) | // eslint-disable-next-line - (buf[off + 3] << 24)); + (buf[off + 3] << 24); } else { - res = ((buf[off + 3]) | + res = + buf[off + 3] | // eslint-disable-next-line (buf[off + 2] << 8) | // eslint-disable-next-line (buf[off + 1] << 16) | // eslint-disable-next-line - (buf[off + 0] << 24)); + (buf[off + 0] << 24); } return res; } /** - * Read 16 bit short integer from input buffer - * @param {object} buf - source buffer - * @param {number} off - offset in buffer - * @return 16 bit short integer number - */ + * Read 16 bit short integer from input buffer + * @param {object} buf - source buffer + * @param {number} off - offset in buffer + * @return 16 bit short integer number + */ readShortFromBuffer(buf, off) { let res = 0; if (this.m_littleEndian) { // eslint-disable-next-line - res = ((buf[off + 0]) | (buf[off + 1] << 8)); + res = buf[off + 0] | (buf[off + 1] << 8); } else { // eslint-disable-next-line - res = ((buf[off + 1]) | (buf[off + 0] << 8)); + res = buf[off + 1] | (buf[off + 0] << 8); } return res; } /** - * Read 32 bit float from input buffer - * @param {object} buf - source buffer - * @param {number} off - offset in buffer - * @return float number, loaded from buffer - */ + * Read 32 bit float from input buffer + * @param {object} buf - source buffer + * @param {number} off - offset in buffer + * @return float number, loaded from buffer + */ readFloatFromBuffer(buf, off) { const BYTES_IN_FLOAT = 4; const arBuf = new ArrayBuffer(BYTES_IN_FLOAT); @@ -127,27 +133,27 @@ class LoaderNifti { } /** - * Read from local file buffer - * @param {object} volDst - Destination volume object to be fiiied - * @param {object} arrBuf - source byte buffer - * @param {func} callbackProgress - function invoked during read - * @param {func} callbackComplete - function invoked after reading - * @return true, if success - */ + * Read from local file buffer + * @param {object} volDst - Destination volume object to be fiiied + * @param {object} arrBuf - source byte buffer + * @param {func} callbackProgress - function invoked during read + * @param {func} callbackComplete - function invoked after reading + * @return true, if success + */ readFromBuffer(volDst, arrBuf, callbackProgress, callbackComplete) { const bufBytes = new Uint8Array(arrBuf); const bufLen = bufBytes.length; const MIN_BUF_SIZE = 8; - const MAX_BUF_SIZE = (1024 * 1024 * 230); + const MAX_BUF_SIZE = 1024 * 1024 * 230; if (bufLen < MIN_BUF_SIZE) { if (callbackComplete) { - callbackComplete(LoadResult.ERROR_TOO_SMALL_DATA_SIZE , null, 0, null); + callbackComplete(LoadResult.ERROR_TOO_SMALL_DATA_SIZE, null, 0, null); } return false; } if (bufLen >= MAX_BUF_SIZE) { if (callbackComplete) { - callbackComplete(LoadResult.ERROR_TOO_LARGE_DATA_SIZE , null, 0, null); + callbackComplete(LoadResult.ERROR_TOO_LARGE_DATA_SIZE, null, 0, null); } return false; } @@ -168,7 +174,7 @@ class LoaderNifti { let bufOff = 0; let headSize = this.readIntFromBuffer(bufBytes, bufOff); - if (headSize > (2 << 24)) { + if (headSize > 2 << 24) { this.m_littleEndian = false; headSize = this.readIntFromBuffer(bufBytes, bufOff); } @@ -238,12 +244,11 @@ class LoaderNifti { const NIFTI_DATA_TYPE_UINT16 = 512; let isDataTypeCorrect = 0; - isDataTypeCorrect |= (dataType === NIFTI_DATA_TYPE_UINT8); - isDataTypeCorrect |= (dataType === NIFTI_DATA_TYPE_INT16); - isDataTypeCorrect |= (dataType === NIFTI_DATA_TYPE_FLOAT32); - isDataTypeCorrect |= (dataType === NIFTI_DATA_TYPE_INT8); - isDataTypeCorrect |= (dataType === NIFTI_DATA_TYPE_UINT16); - + isDataTypeCorrect |= dataType === NIFTI_DATA_TYPE_UINT8; + isDataTypeCorrect |= dataType === NIFTI_DATA_TYPE_INT16; + isDataTypeCorrect |= dataType === NIFTI_DATA_TYPE_FLOAT32; + isDataTypeCorrect |= dataType === NIFTI_DATA_TYPE_INT8; + isDataTypeCorrect |= dataType === NIFTI_DATA_TYPE_UINT16; if (!isDataTypeCorrect) { console.log(`Nifti header read. This data type (${dataType}) is not supported`); @@ -255,8 +260,7 @@ class LoaderNifti { const BIT_PIXELS_8 = 8; const BIT_PIXELS_16 = 16; const BIT_PIXELS_32 = 32; - const isSupported = (bitPix === BIT_PIXELS_8) | - (bitPix === BIT_PIXELS_16) | (bitPix === BIT_PIXELS_32); + const isSupported = (bitPix === BIT_PIXELS_8) | (bitPix === BIT_PIXELS_16) | (bitPix === BIT_PIXELS_32); if (!isSupported) { console.log(`Nifti wrong bitPix: ${bitPix}, but should be 8,16 or 32`); if (callbackComplete) { @@ -303,8 +307,8 @@ class LoaderNifti { let isGoodSym = true; const CODE_MIN = 20; const CODE_MAX = 255; - for (let i = 0; (i < MAX_STR_DECS) && isGoodSym; i++) { - isGoodSym = ((arrDesc[i] >= CODE_MIN) && (arrDesc[i] < CODE_MAX)); + for (let i = 0; i < MAX_STR_DECS && isGoodSym; i++) { + isGoodSym = arrDesc[i] >= CODE_MIN && arrDesc[i] < CODE_MAX; if (isGoodSym) { strDescr = strDescr.concat(String.fromCharCode(arrDesc[i])); } @@ -331,11 +335,12 @@ class LoaderNifti { const MAG_0 = 110; const MAG_1 = 43; const MAG_2 = 49; - const isCorrectMagic = (bufBytes[bufOff + 0] === MAG_0) && + const isCorrectMagic = + bufBytes[bufOff + 0] === MAG_0 && // eslint-disable-next-line - (bufBytes[bufOff + 1] === MAG_1) && + bufBytes[bufOff + 1] === MAG_1 && // eslint-disable-next-line - (bufBytes[bufOff + 2] === MAG_2); + bufBytes[bufOff + 2] === MAG_2; if (!isCorrectMagic) { // eslint-disable-next-line console.log(`Nifti hdr bad magic: ${bufBytes[bufOff + 0]}, ${bufBytes[bufOff + 1]}, ${bufBytes[bufOff + 2]}`); @@ -353,7 +358,7 @@ class LoaderNifti { let pwr2; let pwrFinish = false; // eslint-disable-next-line - for (pwr2 = 29; (pwr2 >= 0) && (!pwrFinish); pwr2--) { + for (pwr2 = 29; pwr2 >= 0 && !pwrFinish; pwr2--) { const val = 1 << pwr2; if (val < numVoxels) { pwrFinish = true; @@ -373,7 +378,7 @@ class LoaderNifti { // scan min max in array let valMax = 0; j = 0; - if ((dataType === NIFTI_DATA_TYPE_INT16) || (dataType === NIFTI_DATA_TYPE_UINT16)) { + if (dataType === NIFTI_DATA_TYPE_INT16 || dataType === NIFTI_DATA_TYPE_UINT16) { for (i = 0; i < numVoxels; i++) { const val = this.readShortFromBuffer(bufBytes, dataOff + j); // eslint-disable-next-line @@ -382,22 +387,22 @@ class LoaderNifti { valMax = val; } // progress update - if (callbackProgress && ((i & progressMask) === 0) && (i > 0)) { + if (callbackProgress && (i & progressMask) === 0 && i > 0) { const ratio = 0.0 + 0.5 * (i / numVoxels); callbackProgress(ratio); } } // for (i) al voxels } - if ((dataType === NIFTI_DATA_TYPE_INT8) || (dataType === NIFTI_DATA_TYPE_UINT8)) { + if (dataType === NIFTI_DATA_TYPE_INT8 || dataType === NIFTI_DATA_TYPE_UINT8) { for (i = 0; i < numVoxels; i++) { const val = bufBytes[dataOff + j]; // eslint-disable-next-line - j ++; + j++; if (val > valMax) { valMax = val; } // progress update - if (callbackProgress && ((i & progressMask) === 0) && (i > 0)) { + if (callbackProgress && (i & progressMask) === 0 && i > 0) { const ratio = 0.0 + 0.5 * (i / numVoxels); callbackProgress(ratio); } @@ -413,7 +418,7 @@ class LoaderNifti { valMax = val; } // progress update - if (callbackProgress && ((i & progressMask) === 0) && (i > 0)) { + if (callbackProgress && (i & progressMask) === 0 && i > 0) { const ratio = 0.0 + 0.5 * (i / numVoxels); callbackProgress(ratio); } @@ -429,12 +434,12 @@ class LoaderNifti { histArray[i] = 0.0; } j = 0; - if ((dataType === NIFTI_DATA_TYPE_INT16) || (dataType === NIFTI_DATA_TYPE_UINT16)) { + if (dataType === NIFTI_DATA_TYPE_INT16 || dataType === NIFTI_DATA_TYPE_UINT16) { for (i = 0; i < numVoxels; i++) { const val = this.readShortFromBuffer(bufBytes, dataOff + j); // eslint-disable-next-line j += 2; - histArray[val] ++; + histArray[val]++; } } // if if (dataType === NIFTI_DATA_TYPE_FLOAT32) { @@ -442,19 +447,19 @@ class LoaderNifti { const val = Math.floor(this.readFloatFromBuffer(bufBytes, dataOff + j)); // eslint-disable-next-line j += 4; - histArray[val] ++; + histArray[val]++; } } // if - if ((dataType === NIFTI_DATA_TYPE_INT8) || (dataType === NIFTI_DATA_TYPE_UINT8)) { + if (dataType === NIFTI_DATA_TYPE_INT8 || dataType === NIFTI_DATA_TYPE_UINT8) { for (i = 0; i < numVoxels; i++) { const val = bufBytes[dataOff + j]; // eslint-disable-next-line - j ++; - histArray[val] ++; + j++; + histArray[val]++; } } // if - const histogram = new UiHistogram(); + const histogram = new HistogramUtils(); histogram.assignArray(valMax, histArray); const HIST_SMOOTH_SIGMA = 0.8; @@ -492,7 +497,7 @@ class LoaderNifti { return false; } j = 0; - if ((dataType === NIFTI_DATA_TYPE_INT16) || (dataType === NIFTI_DATA_TYPE_UINT16)) { + if (dataType === NIFTI_DATA_TYPE_INT16 || dataType === NIFTI_DATA_TYPE_UINT16) { for (i = 0; i < numVoxels; i++) { let val = this.readShortFromBuffer(bufBytes, dataOff + j); // eslint-disable-next-line @@ -500,27 +505,27 @@ class LoaderNifti { // scale down to [0..255] val = (val * scale) >> ACC_DEGREE; // check [0..255] range for some voxels out from histogram peak - val = (val <= MAX_BYTE) ? val : MAX_BYTE; + val = val <= MAX_BYTE ? val : MAX_BYTE; dataArray[i] = val; // progress update - if (callbackProgress && ((i & progressMask) === 0) && (i > 0)) { + if (callbackProgress && (i & progressMask) === 0 && i > 0) { const ratio = 0.5 + 0.5 * (i / numVoxels); callbackProgress(ratio); } } // for (i) all voxels } // if 16 bit - if ((dataType === NIFTI_DATA_TYPE_INT8) || (dataType === NIFTI_DATA_TYPE_UINT8)) { + if (dataType === NIFTI_DATA_TYPE_INT8 || dataType === NIFTI_DATA_TYPE_UINT8) { for (i = 0; i < numVoxels; i++) { let val = bufBytes[dataOff + j]; // eslint-disable-next-line - j ++; + j++; // scale down to [0..255] val = (val * scale) >> ACC_DEGREE; // check [0..255] range for some voxels out from histogram peak - val = (val <= MAX_BYTE) ? val : MAX_BYTE; + val = val <= MAX_BYTE ? val : MAX_BYTE; dataArray[i] = val; // progress update - if (callbackProgress && ((i & progressMask) === 0) && (i > 0)) { + if (callbackProgress && (i & progressMask) === 0 && i > 0) { const ratio = 0.5 + 0.5 * (i / numVoxels); callbackProgress(ratio); } @@ -534,17 +539,16 @@ class LoaderNifti { // scale down to [0..255] val = (val * scale) >> ACC_DEGREE; // check [0..255] range for some voxels out from histogram peak - val = (val <= MAX_BYTE) ? val : MAX_BYTE; + val = val <= MAX_BYTE ? val : MAX_BYTE; dataArray[i] = val; // progress update - if (callbackProgress && ((i & progressMask) === 0) && (i > 0)) { + if (callbackProgress && (i & progressMask) === 0 && i > 0) { const ratio = 0.5 + 0.5 * (i / numVoxels); callbackProgress(ratio); } } // for (i) all voxels } // if 16 bit - let xyDim = this.m_xDim * this.m_yDim; /* // Scale down volume by slices @@ -581,7 +585,8 @@ class LoaderNifti { } */ // clear borders - let x; let y; + let x; + let y; let z; const zOffMin = 0 * xyDim; const zOffMax = (this.m_zDim - 1) * xyDim; @@ -594,16 +599,16 @@ class LoaderNifti { off = zOffMax + yOff + x; dataArray[off] = 0; } // for (x) - } // for (y) + } // for (y) const xOffMin = 0; const xOffMax = this.m_xDim - 1; for (z = 0; z < this.m_zDim; z++) { const zOff = z * xyDim; for (y = 0; y < this.m_yDim; y++) { let off; - off = zOff + (y * this.m_xDim) + xOffMin; + off = zOff + y * this.m_xDim + xOffMin; dataArray[off] = 0; - off = zOff + (y * this.m_xDim) + xOffMax; + off = zOff + y * this.m_xDim + xOffMax; dataArray[off] = 0; } } @@ -632,7 +637,7 @@ class LoaderNifti { volDst.m_boxSize = this.m_boxSize; console.log(`Nifti header read OK. Volume pixels = ${this.m_xDim} * ${this.m_yDim} * ${this.m_zDim}`); - + // Finally invoke user callback after file was read const KTX_GL_RED = 0x1903; const KTX_UNSIGNED_BYTE = 0x1401; @@ -657,26 +662,28 @@ class LoaderNifti { } // end of readFromBuffer /** - * - * Read Nifti file from URL - * @param {object} volDst volume to read - * @param {string} strUrl from where - * @param {Function} callbackProgress invoke during loading - * @param {Function} callbackComplete invoke at the end with final success code - */ + * + * Read Nifti file from URL + * @param {object} volDst volume to read + * @param {string} strUrl from where + * @param {Function} callbackProgress invoke during loading + * @param {Function} callbackComplete invoke at the end with final success code + */ readFromUrl(volDst, strUrl, callbackProgress, callbackComplete) { console.log(`LoadedNifti. staring read ${strUrl}`); this.m_fileLoader = new FileLoader(strUrl); - this.m_fileLoader.readFile((arrBuf) => { - const okRead = this.readFromBuffer(volDst, arrBuf, callbackProgress, callbackComplete); - return okRead; - }, (errMsg) => { - console.log(`LoadedNifti. Error read file: ${errMsg}`); - callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); - }); + this.m_fileLoader.readFile( + (arrBuf) => { + const okRead = this.readFromBuffer(volDst, arrBuf, callbackProgress, callbackComplete); + return okRead; + }, + (errMsg) => { + console.log(`LoadedNifti. Error read file: ${errMsg}`); + callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); + } + ); return true; } // end of readFromUrl - } // end class LoaderNifti export default LoaderNifti; diff --git a/src/engine/loaders/LoaderUrlDicom.js b/src/engine/loaders/LoaderUrlDicom.js new file mode 100644 index 00000000..ef9aa0eb --- /dev/null +++ b/src/engine/loaders/LoaderUrlDicom.js @@ -0,0 +1,61 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import StoreActionType from '../../store/ActionTypes'; +import ViewMode from '../../store/ViewMode'; +import Modes3d from '../../store/Modes3d'; + +const NEED_TEXTURE_SIZE_4X = true; + +class LoaderUrlDicom { + constructor(store) { + this.m_store = store; + this.m_errors = []; + this.m_loaders = []; + + this.callbackReadProgress = this.callbackReadProgress.bind(this); + this.m_fileName = '???'; + } + + /** + * Progress read callback + * + * @param ratio01 + */ + callbackReadProgress(ratio01) { + const ratioPrc = Math.floor(ratio01); + const store = this.m_store; + if (ratioPrc >= 0.99) { + // console.log(`callbackReadProgress. hide on = ${ratio01}`); + store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); + } else { + store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: ratioPrc }); + } + } // callback progress + + /** + * On the end of success loading dicom folder + * + * @param {object} volume - destination volume + * @param {string} fileNameIn - short file name for readed + */ + finalizeSuccessLoadedVolume(volume, fileNameIn) { + if (volume.m_dataArray !== null) { + if (NEED_TEXTURE_SIZE_4X) { + volume.makeDimensions4x(); + } + // invoke notification + const store = this.m_store; + store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volume }); + store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); + store.dispatch({ type: StoreActionType.SET_FILENAME, fileName: fileNameIn }); + store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: [] }); + store.dispatch({ type: StoreActionType.SET_MODE_VIEW, viewMode: ViewMode.VIEW_2D }); + store.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); + } + } +} // end class LoaderUrlDicom + +export default LoaderUrlDicom; diff --git a/src/engine/loaders/RoiPalette256.js b/src/engine/loaders/RoiPalette256.js new file mode 100644 index 00000000..cef3b55a --- /dev/null +++ b/src/engine/loaders/RoiPalette256.js @@ -0,0 +1,40 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import { getPalette } from './RoiPaletteItems'; + +export const getPalette256 = () => { + const palette = getPalette(); + + const PAL_SIZE = 256; + const MAX_PAL_COLOR = 255.0; + const BYTES_PER_COLOR = 4; + const OFFS_0 = 0; + const OFFS_1 = 1; + const OFFS_2 = 2; + const OFFS_3 = 3; + let palette256 = new Uint8Array(PAL_SIZE * BYTES_PER_COLOR); + let i; + // init palette with black colors + for (i = 0; i < PAL_SIZE * BYTES_PER_COLOR; i++) { + palette256[i] = 0; + } + // load colors + const numPalColors = palette.length; + for (i = 0; i < numPalColors; i++) { + const strIndexPalette = palette[i].roiId; + const strColor = palette[i].roiColor; + const arrColor = strColor.split(' '); + const rCol = Math.floor(parseFloat(arrColor[OFFS_0]) * MAX_PAL_COLOR); + const gCol = Math.floor(parseFloat(arrColor[OFFS_1]) * MAX_PAL_COLOR); + const bCol = Math.floor(parseFloat(arrColor[OFFS_2]) * MAX_PAL_COLOR); + const aCol = 255; + const ind = parseInt(strIndexPalette, 10) * BYTES_PER_COLOR; + palette256[ind + OFFS_0] = rCol; + palette256[ind + OFFS_1] = gCol; + palette256[ind + OFFS_2] = bCol; + palette256[ind + OFFS_3] = aCol; + } + return palette256; +}; diff --git a/src/engine/loaders/RoiPaletteItems.js b/src/engine/loaders/RoiPaletteItems.js new file mode 100644 index 00000000..9217956f --- /dev/null +++ b/src/engine/loaders/RoiPaletteItems.js @@ -0,0 +1,664 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +export const roiPaletteItems = [ + { + name: 'amygdala', + roiColor: '0.247059 0.584314 0.270588 1', + roiId: 139, + position: 'right', + isBrain: true, + }, + { + name: 'amygdala', + roiColor: '0.309804 0.929412 0.054902 1', + roiId: 118, + position: 'left', + isBrain: true, + }, + { + name: 'angular gyrus', + roiColor: '0.686275 0.231373 0.152941 1', + roiId: 19, + position: 'right', + isBrain: true, + }, + { + name: 'angular gyrus', + roiColor: '0.811765 0.486275 0.117647 1', + roiId: 159, + position: 'left', + isBrain: true, + }, + { + name: 'anterior limb of internal capsule', + roiColor: '0.309804 0.203922 0.462745 1', + roiId: 128, + position: 'right', + isBrain: true, + }, + { + name: 'anterior limb of internal capsule', + roiColor: '0.435294 0.733333 0.027451 1', + roiId: 43, + position: 'left', + isBrain: true, + }, + { + roiColor: '0.937255 0.94902 0.513725 1', + roiId: 20, + name: 'brain stem', + isBrain: true, + }, + { + name: 'caudate nucleus', + roiColor: '0.74902 0.278431 0.141176 1', + roiId: 53, + position: 'right', + isBrain: true, + }, + { + name: 'caudate nucleus', + roiColor: '0.184314 0.0745098 0.356863 1', + roiId: 39, + position: 'left', + isBrain: true, + }, + { + name: 'cerebellum', + roiColor: '0.811765 0.458824 0.952941 1', + roiId: 76, + position: 'right', + isBrain: true, + }, + { + name: 'cerebellum', + roiColor: '0.247059 0.113725 0.843137 1', + roiId: 67, + position: 'left', + isBrain: true, + }, + { + name: 'cingulate region', + roiColor: '0.623529 0.45098 0.666667 1', + roiId: 7, + position: 'right', + isBrain: true, + }, + { + name: 'cingulate region', + roiColor: '0.937255 0.631373 0.505882 1', + roiId: 27, + position: 'left', + isBrain: true, + }, + { + roiColor: '0.937255 0.301961 0.470588 1', + roiId: 133, + name: 'corpus callosum', + isBrain: true, + }, + { + name: 'cuneus', + roiColor: '0.435294 0.513725 0.768627 1', + roiId: 175, + position: 'right', + isBrain: true, + }, + { + name: 'cuneus', + roiColor: '0.937255 0.729412 0.192157 1', + roiId: 54, + position: 'left', + isBrain: true, + }, + { + name: 'fornix', + roiColor: '0.937255 0.415686 0.847059 1', + roiId: 254, + position: 'right', + isBrain: true, + }, + { + name: 'fornix', + roiColor: '0.811765 0.67451 0.980392 1', + roiId: 29, + position: 'left', + isBrain: true, + }, + { + roiColor: '0.247059 0.466667 0.105882 1', + roiId: 233, + name: 'fourth ventricle', + isBrain: true, + }, + { + name: 'frontal lobe WM', + roiColor: '0.560784 0.290196 0.215686 1', + roiId: 17, + position: 'right', + isBrain: true, + }, + { + name: 'frontal lobe WM', + roiColor: '0.498039 0.662745 0.101961 1', + roiId: 30, + position: 'left', + isBrain: true, + }, + { + name: 'globus palladus', + roiColor: '0.0588235 0.843137 0.168627 1', + roiId: 11, + position: 'right', + isBrain: true, + }, + { + name: 'globus palladus', + roiColor: '0.247059 0.74902 0.447059 1', + roiId: 12, + position: 'left', + isBrain: true, + }, + { + name: 'hippocampal formation', + roiColor: '0.498039 0.709804 0.619608 1', + roiId: 36, + position: 'right', + isBrain: true, + }, + { + name: 'hippocampal formation', + roiColor: '0.121569 0.4 0.972549 1', + roiId: 101, + position: 'left', + isBrain: true, + }, + { + name: 'inferior frontal gyrus', + roiColor: '0.247059 0.85098 0.0666667 1', + roiId: 75, + position: 'right', + isBrain: true, + }, + { + name: 'inferior frontal gyrus', + roiColor: '0.937255 0.662745 0.329412 1', + roiId: 15, + position: 'left', + isBrain: true, + }, + { + name: 'inferior occipital gyrus', + roiColor: '0.0588235 0.643137 0.643137 1', + roiId: 97, + position: 'right', + isBrain: true, + }, + { + name: 'inferior occipital gyrus', + roiColor: '0.247059 0.411765 0.568627 1', + roiId: 37, + position: 'left', + isBrain: true, + }, + { + name: 'inferior temporal gyrus', + roiColor: '0.247059 0.00392157 0.796078 1', + roiId: 140, + position: 'right', + isBrain: true, + }, + { + name: 'inferior temporal gyrus', + roiColor: '0.87451 0.819608 0.541176 1', + roiId: 164, + position: 'left', + isBrain: true, + }, + { + name: 'insula', + roiColor: '0.623529 0.886275 0.356863 1', + roiId: 4, + position: 'right', + isBrain: true, + }, + { + name: 'insula', + roiColor: '0.560784 0.698039 0.12549 1', + roiId: 108, + position: 'left', + isBrain: true, + }, + { + name: 'lateral front-orbital gyrus', + roiColor: '0.435294 0.501961 0.203922 1', + roiId: 6, + position: 'right', + isBrain: true, + }, + { + name: 'lateral front-orbital gyrus', + roiColor: '1 0.8 0.00784314 1', + roiId: 90, + position: 'left', + isBrain: true, + }, + { + name: 'lateral occipitotemporal gyrus', + roiColor: '0.0588235 0.027451 0.470588 1', + roiId: 99, + position: 'right', + isBrain: true, + }, + { + name: 'lateral occipitotemporal gyrus', + roiColor: '0.937255 0.101961 0.913725 1', + roiId: 196, + position: 'left', + isBrain: true, + }, + { + name: 'lateral ventricle', + roiColor: '0.435294 0.176471 0.568627 1', + roiId: 8, + position: 'right', + isBrain: true, + }, + { + name: 'lateral ventricle', + roiColor: '0.74902 0.764706 0.247059 1', + roiId: 3, + position: 'left', + isBrain: true, + }, + { + name: 'lingual gyrus', + roiColor: '0.435294 0.458824 0.47451 1', + roiId: 112, + position: 'right', + isBrain: true, + }, + { + name: 'lingual gyrus', + roiColor: '0.811765 0.0941176 0.301961 1', + roiId: 69, + position: 'left', + isBrain: true, + }, + { + name: 'medial front-orbital gyrus', + roiColor: '0.87451 0.364706 0.384314 1', + roiId: 1, + position: 'right', + isBrain: true, + }, + { + name: 'medial front-orbital gyrus', + roiColor: '0.811765 0.160784 0.247059 1', + roiId: 85, + position: 'left', + isBrain: true, + }, + { + name: 'medial frontal gyrus', + roiColor: '0.435294 0.615686 0.0705882 1', + roiId: 114, + position: 'right', + isBrain: true, + }, + { + name: 'medial frontal gyrus', + roiColor: '0.184314 0.372549 0.423529 1', + roiId: 9, + position: 'left', + isBrain: true, + }, + { + name: 'medial occipitotemporal gyrus', + roiColor: '0.247059 0.368627 0.211765 1', + roiId: 165, + position: 'right', + isBrain: true, + }, + { + name: 'medial occipitotemporal gyrus', + roiColor: '1 0.843137 0.254902 1', + roiId: 119, + position: 'left', + isBrain: true, + }, + { + name: 'middle frontal gyrus', + roiColor: '0.623529 0.905882 0.113725 1', + roiId: 2, + position: 'right', + isBrain: true, + }, + { + name: 'middle frontal gyrus', + roiColor: '0.686275 0.0901961 0.811765 1', + roiId: 50, + position: 'left', + isBrain: true, + }, + { + name: 'middle occipital gyrus', + roiColor: '0.686275 0.933333 0.698039 1', + roiId: 63, + position: 'right', + isBrain: true, + }, + { + name: 'middle occipital gyrus', + roiColor: '0.435294 0.0588235 0.964706 1', + roiId: 154, + position: 'left', + isBrain: true, + }, + { + name: 'middle temporal gyrus', + roiColor: '0.937255 0.498039 0.67451 1', + roiId: 130, + position: 'right', + isBrain: true, + }, + { + name: 'middle temporal gyrus', + roiColor: '0.498039 0.768627 0.439216 1', + roiId: 64, + position: 'left', + isBrain: true, + }, + { + name: 'nucleus accumbens', + roiColor: '1 0.807843 0.529412 1', + roiId: 25, + position: 'right', + isBrain: true, + }, + { + name: 'nucleus accumbens', + roiColor: '0.0588235 0.65098 0.0509804 1', + roiId: 72, + position: 'left', + isBrain: true, + }, + { + name: 'occipital lobe WM', + roiColor: '0.0588235 0.368627 0.552941 1', + roiId: 45, + position: 'right', + isBrain: true, + }, + { + name: 'occipital lobe WM', + roiColor: '0.0588235 0.639216 0.839216 1', + roiId: 73, + position: 'left', + isBrain: true, + }, + { + name: 'occipital pole', + roiColor: '0.74902 0.494118 0.419608 1', + roiId: 132, + position: 'right', + isBrain: true, + }, + { + name: 'occipital pole', + roiColor: '0.247059 0.807843 0.74902 1', + roiId: 251, + position: 'left', + isBrain: true, + }, + { + name: 'parahippocampal gyrus', + roiColor: '0.121569 0.847059 0.00392157 1', + roiId: 125, + position: 'right', + isBrain: true, + }, + { + name: 'parahippocampal gyrus', + roiColor: '0.247059 0.0705882 0.321569 1', + roiId: 18, + position: 'left', + isBrain: true, + }, + { + name: 'parietal lobe WM', + roiColor: '1 0.4 0.223529 1', + roiId: 105, + position: 'right', + isBrain: true, + }, + { + name: 'parietal lobe WM', + roiColor: '0.309804 0.678431 0.639216 1', + roiId: 57, + position: 'left', + isBrain: true, + }, + { + name: 'postcentral gyrus', + roiColor: '0.560784 0.478431 0.2 1', + roiId: 110, + position: 'right', + isBrain: true, + }, + { + name: 'postcentral gyrus', + roiColor: '0.498039 0.576471 0.027451 1', + roiId: 74, + position: 'left', + isBrain: true, + }, + { + name: 'posterior limb of internal capsule inc. cerebral peduncle', + roiColor: '1 0.917647 0.576471 1', + roiId: 35, + position: 'right', + isBrain: true, + }, + { + name: 'posterior limb of internal capsule inc. cerebral peduncle', + roiColor: '0.435294 0.490196 0.0784314 1', + roiId: 34, + position: 'left', + isBrain: true, + }, + { + name: 'precentral gyrus', + roiColor: '0.184314 0.709804 0.615686 1', + roiId: 5, + position: 'right', + isBrain: true, + }, + { + name: 'precentral gyrus', + roiColor: '0.87451 0.560784 1 1', + roiId: 80, + position: 'left', + isBrain: true, + }, + { + name: 'precuneus', + roiColor: '1 0.654902 0.223529 1', + roiId: 32, + position: 'right', + isBrain: true, + }, + { + name: 'precuneus', + roiColor: '1 0 0.211765 1', + roiId: 56, + position: 'left', + isBrain: true, + }, + { + name: 'putamen', + roiColor: '1 0.831373 0.227451 1', + roiId: 16, + position: 'right', + isBrain: true, + }, + { + name: 'putamen', + roiColor: '0.372549 0.678431 0.32549 1', + roiId: 14, + position: 'left', + isBrain: true, + }, + { + name: 'subthalamic nucleus', + roiColor: '0.184314 0.545098 0.619608 1', + roiId: 23, + position: 'right', + isBrain: true, + }, + { + name: 'subthalamic nucleus', + roiColor: '0.309804 0.686275 0.243137 1', + roiId: 33, + position: 'left', + isBrain: true, + }, + { + name: 'superior frontal gyrus', + roiColor: '0.87451 0.380392 0.768627 1', + roiId: 10, + position: 'right', + isBrain: true, + }, + { + name: 'superior frontal gyrus', + roiColor: '1 0.113725 0.396078 1', + roiId: 70, + position: 'left', + isBrain: true, + }, + { + name: 'superior occipital gyrus', + roiColor: '0.372549 0.0431373 0.537255 1', + roiId: 38, + position: 'right', + isBrain: true, + }, + { + name: 'superior occipital gyrus', + roiColor: '0.623529 0.301961 0.2 1', + roiId: 98, + position: 'left', + isBrain: true, + }, + { + name: 'superior parietal lobule', + roiColor: '0.247059 0.843137 0.407843 1', + roiId: 88, + position: 'right', + isBrain: true, + }, + { + name: 'superior parietal lobule', + roiColor: '0.87451 0.533333 0.254902 1', + roiId: 52, + position: 'left', + isBrain: true, + }, + { + name: 'superior temporal gyrus', + roiColor: '0.498039 0.721569 0.996078 1', + roiId: 145, + position: 'right', + isBrain: true, + }, + { + name: 'superior temporal gyrus', + roiColor: '1 0.67451 0.45098 1', + roiId: 61, + position: 'left', + isBrain: true, + }, + { + name: 'supramarginal gyrus', + roiColor: '0.87451 0.45098 0.270588 1', + roiId: 60, + position: 'right', + isBrain: true, + }, + { + name: 'supramarginal gyrus', + roiColor: '0.623529 0.0235294 0.654902 1', + roiId: 41, + position: 'left', + isBrain: true, + }, + { + name: 'temporal lobe WM', + roiColor: '0.498039 0.603922 0.768627 1', + roiId: 59, + position: 'right', + isBrain: true, + }, + { + name: 'temporal lobe WM', + roiColor: '0.87451 0.411765 0.368627 1', + roiId: 83, + position: 'left', + isBrain: true, + }, + { + name: 'thalamus', + roiColor: '0.0588235 0.796078 0.866667 1', + roiId: 203, + position: 'right', + isBrain: true, + }, + { + name: 'thalamus', + roiColor: '0.74902 0.984314 0.341176 1', + roiId: 102, + position: 'left', + isBrain: true, + }, + { + roiColor: '0.811765 0.258824 0.823529 1', + roiId: 232, + name: 'third ventricle', + isBrain: true, + }, + { + name: 'uncus', + roiColor: '0.121569 0.352941 0.196078 1', + roiId: 26, + position: 'right', + isBrain: true, + }, + { + name: 'uncus', + roiColor: '0.623529 0.117647 0.14902 1', + roiId: 62, + position: 'left', + isBrain: true, + }, + { + name: 'xxx_brain_internal', + roiColor: '0.8 0.8 0.1 1', + roiId: 150, + position: 'left', + isBrain: true, + }, + { + name: 'xxx_brain_core', + roiColor: '0.2 0.8 0.2 1', + roiId: 250, + position: 'left', + isBrain: true, + }, +]; + +export const getPalette = () => { + return roiPaletteItems; +}; diff --git a/src/demo/engine/loaders/dicomdict.js b/src/engine/loaders/dicomdict.js similarity index 74% rename from src/demo/engine/loaders/dicomdict.js rename to src/engine/loaders/dicomdict.js index 85968816..ef129f00 100644 --- a/src/demo/engine/loaders/dicomdict.js +++ b/src/engine/loaders/dicomdict.js @@ -1,30 +1,14 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Dicom tags description -* @module lib/scripts/loaders/dicomdict -*/ - + * Dicom tags description + * @module lib/scripts/loaders/dicomdict + */ export default class DicomDictionary { - constructor() { this.TAGS = [ /* eslint-disable */ @@ -51,15 +35,15 @@ export default class DicomDictionary { [0x0008, 0x0014, 'UI', 'InstanceCreatorUID'], [0x0008, 0x0016, 'UI', 'SOPClassUID'], [0x0008, 0x0018, 'UI', 'SOPInstanceUID'], - [0x0008, 0x001A, 'UI', 'RelatedGeneralSOPClassUID'], - [0x0008, 0x001B, 'UI', 'OriginalSpecializedSOPClassUID'], + [0x0008, 0x001a, 'UI', 'RelatedGeneralSOPClassUID'], + [0x0008, 0x001b, 'UI', 'OriginalSpecializedSOPClassUID'], [0x0008, 0x0020, 'DA', 'StudyDate'], [0x0008, 0x0021, 'DA', 'SeriesDate'], [0x0008, 0x0022, 'DA', 'AcquisitionDate'], [0x0008, 0x0023, 'DA', 'ContentDate'], [0x0008, 0x0024, 'DA', 'OverlayDate'], [0x0008, 0x0025, 'DA', 'CurveDate'], - [0x0008, 0x002A, 'DT', 'AcquisitionDateTime'], + [0x0008, 0x002a, 'DT', 'AcquisitionDateTime'], [0x0008, 0x0030, 'TM', 'StudyTime'], [0x0008, 0x0031, 'TM', 'SeriesTime'], [0x0008, 0x0032, 'TM', 'AcquisitionTime'], @@ -82,7 +66,7 @@ export default class DicomDictionary { [0x0008, 0x0090, 'XX', 'ReferringPhysicansName'], [0x0008, 0x1010, 'XX', 'StationName'], [0x0008, 0x1030, 'XX', 'StudyDescription'], - [0x0008, 0x103E, 'LO', 'SeriesDescription'], + [0x0008, 0x103e, 'LO', 'SeriesDescription'], [0x0008, 0x1040, 'XX', 'InstitutionDepartmentName'], [0x0008, 0x1050, 'XX', 'PerformingPhysicansName'], [0x0008, 0x1060, '"XX', '"Unkown'], @@ -95,19 +79,19 @@ export default class DicomDictionary { [0x0008, 0x2111, '"XX', '"DerivationDescription'], [0x0008, 0x2112, '"XX', '"SourceImageSequence'], - + [0x0009, 0x0010, 'LO', 'PrivateCreator'], [0x0009, 0x0011, '??', '"Unknown'], [0x0009, 0x0012, '??', '"Unknown'], - + [0x0009, 0x1001, 'XX', 'PrivateTag'], [0x0009, 0x1002, 'XX', 'PrivateTag'], [0x0009, 0x1004, 'XX', 'PrivateTag'], [0x0009, 0x1027, 'XX', 'PrivateTag'], [0x0009, 0x1030, 'XX', 'PrivateTag'], [0x0009, 0x1031, 'XX', 'PrivateTag'], - [0x0009, 0x10E3, 'XX', 'PrivateTag'], - [0x0009, 0x10E9, 'XX', 'PrivateTag'], + [0x0009, 0x10e3, 'XX', 'PrivateTag'], + [0x0009, 0x10e9, 'XX', 'PrivateTag'], [0x0010, 0x0000, 'UL', 'PatientGroupLength'], [0x0010, 0x0010, 'PN', 'PatientName'], @@ -142,11 +126,11 @@ export default class DicomDictionary { [0x0010, 0x2154, 'SH', 'PatientTelephoneNumbers'], [0x0010, 0x2160, 'SH', 'EthnicGroup'], [0x0010, 0x2180, 'SH', 'Occupation'], - [0x0010, 0x21A0, 'CS', 'SmokingStatus'], - [0x0010, 0x21B0, 'LT', 'AdditionalPatientHistory'], - [0x0010, 0x21C0, 'US', 'PregnancyStatus'], - [0x0010, 0x21D0, 'DA', 'LastMenstrualDate'], - [0x0010, 0x21F0, 'LO', 'PatientReligiousPreference'], + [0x0010, 0x21a0, 'CS', 'SmokingStatus'], + [0x0010, 0x21b0, 'LT', 'AdditionalPatientHistory'], + [0x0010, 0x21c0, 'US', 'PregnancyStatus'], + [0x0010, 0x21d0, 'DA', 'LastMenstrualDate'], + [0x0010, 0x21f0, 'LO', 'PatientReligiousPreference'], [0x0010, 0x2201, 'LO', 'PatientSpeciesDescription'], [0x0010, 0x2202, 'SQ', 'PatientSpeciesCodeSequence'], [0x0010, 0x2203, 'CS', 'PatientSexNeutered'], @@ -188,31 +172,31 @@ export default class DicomDictionary { [0x0018, 0x0094, 'XX', 'ProcentPhaseFieldOfView'], [0x0018, 0x0095, 'XX', 'PixelBandwidth'], [0x0018, 0x1000, 'XX', 'DeviceSerialNumber'], - [0x0018, 0x1002, "??", 'DeviceUID'], - [0x0018, 0x1003, "??", 'DeviceID'], - [0x0018, 0x1004, "??", 'PlateID'], - [0x0018, 0x1005, "??", 'GeneratorID'], - [0x0018, 0x1006, "??", 'GridID'], - [0x0018, 0x1007, "??", '"CassetteID'], - [0x0018, 0x1008, "??", 'GantryID'], - [0x0018, 0x1010, "??", 'SecondaryCaptureDeviceID'], - [0x0018, 0x1011, "??", 'HardcopyCreationDeviceID'], - [0x0018, 0x1012, "??", 'DateOfSecondaryCapture'], - [0x0018, 0x1014, "??", 'TimeOfSecondaryCapture'], - [0x0018, 0x1016, "??", 'SecondaryCaptureDeviceManufacturer'], - [0x0018, 0x1017, "??", 'HardcopyDeviceManufacturer'], - [0x0018, 0x1018, "??", 'SecondaryCaptureDeviceModelName'], - [0x0018, 0x1019, "??", 'SecondaryCaptureDeviceSoftwareVers'], - [0x0018, 0x101A, "??", 'HardcopyDeviceSoftwareVersion'], - [0x0018, 0x101B, "??", 'HardcopyDeviceModelName'], - + [0x0018, 0x1002, '??', 'DeviceUID'], + [0x0018, 0x1003, '??', 'DeviceID'], + [0x0018, 0x1004, '??', 'PlateID'], + [0x0018, 0x1005, '??', 'GeneratorID'], + [0x0018, 0x1006, '??', 'GridID'], + [0x0018, 0x1007, '??', '"CassetteID'], + [0x0018, 0x1008, '??', 'GantryID'], + [0x0018, 0x1010, '??', 'SecondaryCaptureDeviceID'], + [0x0018, 0x1011, '??', 'HardcopyCreationDeviceID'], + [0x0018, 0x1012, '??', 'DateOfSecondaryCapture'], + [0x0018, 0x1014, '??', 'TimeOfSecondaryCapture'], + [0x0018, 0x1016, '??', 'SecondaryCaptureDeviceManufacturer'], + [0x0018, 0x1017, '??', 'HardcopyDeviceManufacturer'], + [0x0018, 0x1018, '??', 'SecondaryCaptureDeviceModelName'], + [0x0018, 0x1019, '??', 'SecondaryCaptureDeviceSoftwareVers'], + [0x0018, 0x101a, '??', 'HardcopyDeviceSoftwareVersion'], + [0x0018, 0x101b, '??', 'HardcopyDeviceModelName'], + [0x0018, 0x1020, 'XX', 'SoftwareVersions'], [0x0018, 0x1030, 'XX', 'ProtocolName'], [0x0018, 0x1081, 'XX', '"LowR-RValue'], [0x0018, 0x1082, 'XX', '"HiR-RValue'], [0x0018, 0x1083, 'XX', '"IntervalsAcquired'], [0x0018, 0x1084, 'XX', '"IntervalsRejected'], - + [0x0018, 0x1088, 'XX', 'HeartRate'], [0x0018, 0x1090, 'XX', 'CardiacNumberOfImages'], [0x0018, 0x1094, 'XX', 'TriggerWindow'], @@ -232,7 +216,7 @@ export default class DicomDictionary { [0x0018, 0x1164, 'XX', '"unknown'], [0x0018, 0x1166, 'XX', '"unknown'], [0x0018, 0x1168, 'XX', '"unknown'], - + [0x0018, 0x1170, 'XX', 'GeneratorPower'], [0x0018, 0x1180, 'XX', '"Unknown'], [0x0018, 0x1190, 'XX', 'FocalSpot'], @@ -256,7 +240,7 @@ export default class DicomDictionary { [0x0018, 0x1622, 'XX', '"ShutterPresentationValue'], [0x0018, 0x1623, 'XX', '"ShutterOverlayGroup'], [0x0018, 0x1624, 'XX', '"ShutterPresentationColorCIELabVal'], - + [0x0018, 0x1700, 'XX', 'Unknown'], [0x0018, 0x1702, 'XX', 'Unknown'], [0x0018, 0x1704, 'XX', 'Unknown'], @@ -271,7 +255,7 @@ export default class DicomDictionary { [0x0018, 0x5100, 'XX', 'PatientPosition'], [0x0018, 0x5101, 'XX', 'ViewPosition'], [0x0018, 0x6000, 'XX', 'Unknown'], - + [0x0018, 0x9301, 'XX', 'CTAcquisitionTypeSequence'], [0x0018, 0x9302, 'XX', 'AcquisitionType'], [0x0018, 0x9303, 'XX', 'TubeAngle'], @@ -282,7 +266,7 @@ export default class DicomDictionary { [0x0018, 0x9308, 'XX', 'CTTableDynamicsSequence'], [0x0018, 0x9309, 'XX', 'TableSpeed'], [0x0018, 0x9310, 'XX', 'TableFeedPerRotation'], - + [0x0018, 0x9311, 'XX', 'SpiralPitchFactor'], [0x0018, 0x9312, 'XX', 'CTGeometrySequence'], [0x0018, 0x9313, 'XX', 'DataCollectionCenterPatient'], @@ -303,12 +287,12 @@ export default class DicomDictionary { [0x0018, 0x9328, 'XX', 'ExposureTimeInMilliSec'], [0x0018, 0x9329, 'XX', 'CTImageFrameTypeSequence'], [0x0018, 0x9330, 'XX', 'XRayTubeCurrentInMilliAmps'], - + [0x0019, 0x0010, 'LO', 'PrivateCreator'], [0x0019, 0x1002, 'XX', 'NumberOfCellsInDetector'], [0x0019, 0x1003, 'XX', 'CellsNumberAtTheta'], [0x0019, 0x1004, 'XX', 'CellsSpacing'], - [0x0019, 0x100F, 'XX', 'HorizFrameOfRef'], + [0x0019, 0x100f, 'XX', 'HorizFrameOfRef'], [0x0019, 0x1011, 'XX', 'SeriesContrast'], [0x0019, 0x1012, 'XX', 'LastPSeq'], [0x0019, 0x1013, 'XX', 'StartNumberOfBaseLine'], @@ -318,19 +302,19 @@ export default class DicomDictionary { [0x0019, 0x1017, 'XX', 'SeriesPlane'], [0x0019, 0x1018, 'XX', 'FirstScanRas'], [0x0019, 0x1019, 'XX', 'FirstScanLocation'], - [0x0019, 0x101A, 'XX', 'LastScanRas'], - [0x0019, 0x101B, 'XX', 'LastScanLoc'], - [0x0019, 0x101E, 'XX', 'DisplayFieldOfView'], + [0x0019, 0x101a, 'XX', 'LastScanRas'], + [0x0019, 0x101b, 'XX', 'LastScanLoc'], + [0x0019, 0x101e, 'XX', 'DisplayFieldOfView'], [0x0019, 0x1023, 'XX', 'TableSpeed'], [0x0019, 0x1024, 'XX', 'MidScanTime'], [0x0019, 0x1025, 'XX', 'MidScanFlag'], [0x0019, 0x1026, 'XX', 'DegreesOfAzimuth'], [0x0019, 0x1027, 'XX', 'GantryPeriod'], - [0x0019, 0x102A, 'XX', 'XRayOnPosition'], - [0x0019, 0x102B, 'XX', 'XRayOffPosition'], - [0x0019, 0x102C, 'XX', 'NumberOfTriggers'], - [0x0019, 0x102E, 'XX', 'AngleOfFirstView'], - [0x0019, 0x102F, 'XX', 'TriggerFrequency'], + [0x0019, 0x102a, 'XX', 'XRayOnPosition'], + [0x0019, 0x102b, 'XX', 'XRayOffPosition'], + [0x0019, 0x102c, 'XX', 'NumberOfTriggers'], + [0x0019, 0x102e, 'XX', 'AngleOfFirstView'], + [0x0019, 0x102f, 'XX', 'TriggerFrequency'], [0x0019, 0x1039, 'XX', 'ScanFovType'], [0x0019, 0x1040, 'XX', 'StatReconFlag'], [0x0019, 0x1041, 'XX', 'ComputeType'], @@ -338,29 +322,29 @@ export default class DicomDictionary { [0x0019, 0x1043, 'XX', 'TotalSegmentsRequested'], [0x0019, 0x1044, 'XX', 'InterscanDelay'], [0x0019, 0x1047, 'XX', 'ViewCompressionFactor'], - [0x0019, 0x104A, 'XX', 'TotalNoOfRefChannels'], - [0x0019, 0x104B, 'XX', 'DataSizeForScanData'], + [0x0019, 0x104a, 'XX', 'TotalNoOfRefChannels'], + [0x0019, 0x104b, 'XX', 'DataSizeForScanData'], [0x0019, 0x1052, 'XX', 'ReconPostProcflag'], [0x0019, 0x1057, 'XX', 'CTWaterNumber'], [0x0019, 0x1058, 'XX', 'CTBoneNumber'], - [0x0019, 0x105A, 'XX', 'AcquisitionDuration'], - [0x0019, 0x105E, 'XX', 'NumberOfChannels'], - [0x0019, 0x105F, 'XX', 'IncrementBetweenChannels'], + [0x0019, 0x105a, 'XX', 'AcquisitionDuration'], + [0x0019, 0x105e, 'XX', 'NumberOfChannels'], + [0x0019, 0x105f, 'XX', 'IncrementBetweenChannels'], [0x0019, 0x1060, 'XX', 'StartingView'], [0x0019, 0x1061, 'XX', 'NumberOfViews'], [0x0019, 0x1062, 'XX', 'IncrementBetweenViews'], - [0x0019, 0x106A, 'XX', 'DependantOnNoViewsProcessed'], - [0x0019, 0x107D, 'DS', 'SecondEcho'], - [0x0019, 0x107E, 'SS', 'NumberOfEchoes'], - [0x0019, 0x107F, 'DS', 'TableDelta'], + [0x0019, 0x106a, 'XX', 'DependantOnNoViewsProcessed'], + [0x0019, 0x107d, 'DS', 'SecondEcho'], + [0x0019, 0x107e, 'SS', 'NumberOfEchoes'], + [0x0019, 0x107f, 'DS', 'TableDelta'], [0x0019, 0x1081, 'SS', 'Contiguous'], [0x0019, 0x1084, 'DS', 'PeakSAR'], [0x0019, 0x1087, 'DS', 'CardiacRepetitionTime'], [0x0019, 0x1088, 'SS', 'ImagesPerCardiacCycle'], - [0x0019, 0x108A, 'SS', 'ActualReceiveGainAnalog'], - [0x0019, 0x108B, 'SS', 'ActualReceiveGainDigital'], - [0x0019, 0x108D, 'DS', 'DelayAfterTrigger'], - [0x0019, 0x108F, 'SS', 'Swappf'], + [0x0019, 0x108a, 'SS', 'ActualReceiveGainAnalog'], + [0x0019, 0x108b, 'SS', 'ActualReceiveGainDigital'], + [0x0019, 0x108d, 'DS', 'DelayAfterTrigger'], + [0x0019, 0x108f, 'SS', 'Swappf'], [0x0019, 0x1090, 'SS', 'PauseInterval'], [0x0019, 0x1091, 'DS', 'PulseTime'], [0x0019, 0x1092, 'SL', 'SliceOffsetOnFreqAxis'], @@ -369,70 +353,70 @@ export default class DicomDictionary { [0x0019, 0x1095, 'SS', 'AnalogReceiverGain'], [0x0019, 0x1096, 'SS', 'DigitalReceiverGain'], [0x0019, 0x1097, 'SL', 'BitmapDefiningCVs'], - [0x0019, 0x109B, 'SS', 'PulseSeqMode'], - [0x0019, 0x109C, 'LO', 'PulseSeqName'], - [0x0019, 0x109D, 'DT', 'PulseSeqDate'], - [0x0019, 0x109E, 'LO', 'InternalPulseSeqName'], - [0x0019, 0x109F, 'SS', 'TransmittingCoil'], - [0x0019, 0x10A0, 'SS', 'SurfaceCoilType'], - [0x0019, 0x10A1, 'SS', 'ExtremityCoilFlag'], - [0x0019, 0x10A2, 'SL', 'RawDataRunNumber'], - [0x0019, 0x10A3, 'UL', 'CalibratedFieldStrength'], - [0x0019, 0x10A4, 'SS', 'SATFatWaterBone'], - [0x0019, 0x10A7, 'DS', 'UserData01'], - [0x0019, 0x10A8, 'DS', 'UserData02'], - [0x0019, 0x10A9, 'DS', 'UserData03'], - [0x0019, 0x10AA, 'DS', 'UserData04'], - [0x0019, 0x10AB, 'DS', 'UserData05'], - [0x0019, 0x10AC, 'DS', 'UserData06'], - [0x0019, 0x10AD, 'DS', 'UserData07'], - [0x0019, 0x10AE, 'DS', 'UserData08'], - [0x0019, 0x10AF, 'DS', 'UserData09'], - [0x0019, 0x10B0, 'DS', 'UserData10'], - [0x0019, 0x10B1, 'DS', 'UserData11'], - [0x0019, 0x10B2, 'DS', 'UserData12'], - [0x0019, 0x10B3, 'DS', 'UserData13'], - [0x0019, 0x10B4, 'DS', 'UserData14'], - [0x0019, 0x10B5, 'DS', 'UserData15'], - [0x0019, 0x10B6, 'DS', 'UserData16'], - [0x0019, 0x10B7, 'DS', 'UserData17'], - [0x0019, 0x10B8, 'DS', 'UserData18'], - [0x0019, 0x10B9, 'DS', 'UserData19'], - [0x0019, 0x10BA, 'DS', 'UserData20'], - [0x0019, 0x10BB, 'DS', 'UserData21'], - [0x0019, 0x10BC, 'DS', 'UserData22'], - [0x0019, 0x10BD, 'DS', 'UserData23'], - [0x0019, 0x10BE, 'DS', 'ProjectionAngle'], - [0x0019, 0x10C0, 'SS', 'SaturationPlanes'], - [0x0019, 0x10C2, 'SS', 'SATLocationR'], - [0x0019, 0x10C3, 'SS', 'SATLocationL'], - [0x0019, 0x10C4, 'SS', 'SATLocationA'], - [0x0019, 0x10C5, 'SS', 'SATLocationP'], - [0x0019, 0x10C6, 'SS', 'SATLocationH'], - [0x0019, 0x10C7, 'SS', 'SATLocationF'], - [0x0019, 0x10C8, 'SS', 'SATThicknessR-L'], - [0x0019, 0x10C9, 'SS', 'SATThicknessA-P'], - [0x0019, 0x10CA, 'SS', 'SATThicknessH-F'], - [0x0019, 0x10CB, 'SS', 'PrescribedFlowAxis'], - [0x0019, 0x10CC, 'SS', 'VelocityEncoding'], - [0x0019, 0x10CD, 'SS', 'ThicknessDisclaimer'], - [0x0019, 0x10CE, 'SS', 'PrescanType'], - [0x0019, 0x10CF, 'SS', 'PrescanStatus'], - [0x0019, 0x10D2, 'SS', 'ProjectionAlgorithm'], - [0x0019, 0x10D3, 'SH', 'ProjectionAlgorithm'], - [0x0019, 0x10D5, 'SS', 'FractionalEcho'], - [0x0019, 0x10D7, 'SS', 'CardiacPhases'], - [0x0019, 0x10D8, 'SS', 'VariableEchoflag'], - [0x0019, 0x10D9, 'DS', 'ConcatenatedSAT'], - [0x0019, 0x10DF, 'DS', 'UserData'], - [0x0019, 0x10E0, 'DS', 'UserData'], - [0x0019, 0x10E2, 'DS', 'VelocityEncodeScale'], - [0x0019, 0x10F2, 'SS', 'FastPhases'], - [0x0019, 0x10F9, 'DS', 'TransmissionGain'], + [0x0019, 0x109b, 'SS', 'PulseSeqMode'], + [0x0019, 0x109c, 'LO', 'PulseSeqName'], + [0x0019, 0x109d, 'DT', 'PulseSeqDate'], + [0x0019, 0x109e, 'LO', 'InternalPulseSeqName'], + [0x0019, 0x109f, 'SS', 'TransmittingCoil'], + [0x0019, 0x10a0, 'SS', 'SurfaceCoilType'], + [0x0019, 0x10a1, 'SS', 'ExtremityCoilFlag'], + [0x0019, 0x10a2, 'SL', 'RawDataRunNumber'], + [0x0019, 0x10a3, 'UL', 'CalibratedFieldStrength'], + [0x0019, 0x10a4, 'SS', 'SATFatWaterBone'], + [0x0019, 0x10a7, 'DS', 'UserData01'], + [0x0019, 0x10a8, 'DS', 'UserData02'], + [0x0019, 0x10a9, 'DS', 'UserData03'], + [0x0019, 0x10aa, 'DS', 'UserData04'], + [0x0019, 0x10ab, 'DS', 'UserData05'], + [0x0019, 0x10ac, 'DS', 'UserData06'], + [0x0019, 0x10ad, 'DS', 'UserData07'], + [0x0019, 0x10ae, 'DS', 'UserData08'], + [0x0019, 0x10af, 'DS', 'UserData09'], + [0x0019, 0x10b0, 'DS', 'UserData10'], + [0x0019, 0x10b1, 'DS', 'UserData11'], + [0x0019, 0x10b2, 'DS', 'UserData12'], + [0x0019, 0x10b3, 'DS', 'UserData13'], + [0x0019, 0x10b4, 'DS', 'UserData14'], + [0x0019, 0x10b5, 'DS', 'UserData15'], + [0x0019, 0x10b6, 'DS', 'UserData16'], + [0x0019, 0x10b7, 'DS', 'UserData17'], + [0x0019, 0x10b8, 'DS', 'UserData18'], + [0x0019, 0x10b9, 'DS', 'UserData19'], + [0x0019, 0x10ba, 'DS', 'UserData20'], + [0x0019, 0x10bb, 'DS', 'UserData21'], + [0x0019, 0x10bc, 'DS', 'UserData22'], + [0x0019, 0x10bd, 'DS', 'UserData23'], + [0x0019, 0x10be, 'DS', 'ProjectionAngle'], + [0x0019, 0x10c0, 'SS', 'SaturationPlanes'], + [0x0019, 0x10c2, 'SS', 'SATLocationR'], + [0x0019, 0x10c3, 'SS', 'SATLocationL'], + [0x0019, 0x10c4, 'SS', 'SATLocationA'], + [0x0019, 0x10c5, 'SS', 'SATLocationP'], + [0x0019, 0x10c6, 'SS', 'SATLocationH'], + [0x0019, 0x10c7, 'SS', 'SATLocationF'], + [0x0019, 0x10c8, 'SS', 'SATThicknessR-L'], + [0x0019, 0x10c9, 'SS', 'SATThicknessA-P'], + [0x0019, 0x10ca, 'SS', 'SATThicknessH-F'], + [0x0019, 0x10cb, 'SS', 'PrescribedFlowAxis'], + [0x0019, 0x10cc, 'SS', 'VelocityEncoding'], + [0x0019, 0x10cd, 'SS', 'ThicknessDisclaimer'], + [0x0019, 0x10ce, 'SS', 'PrescanType'], + [0x0019, 0x10cf, 'SS', 'PrescanStatus'], + [0x0019, 0x10d2, 'SS', 'ProjectionAlgorithm'], + [0x0019, 0x10d3, 'SH', 'ProjectionAlgorithm'], + [0x0019, 0x10d5, 'SS', 'FractionalEcho'], + [0x0019, 0x10d7, 'SS', 'CardiacPhases'], + [0x0019, 0x10d8, 'SS', 'VariableEchoflag'], + [0x0019, 0x10d9, 'DS', 'ConcatenatedSAT'], + [0x0019, 0x10df, 'DS', 'UserData'], + [0x0019, 0x10e0, 'DS', 'UserData'], + [0x0019, 0x10e2, 'DS', 'VelocityEncodeScale'], + [0x0019, 0x10f2, 'SS', 'FastPhases'], + [0x0019, 0x10f9, 'DS', 'TransmissionGain'], [0x0020, 0x0000, 'UL', 'RelationshipGroupLength'], - [0x0020, 0x000D, 'UI', 'StudyInstanceID'], - [0x0020, 0x000E, 'UI', 'SeriesInstanceID'], + [0x0020, 0x000d, 'UI', 'StudyInstanceID'], + [0x0020, 0x000e, 'UI', 'SeriesInstanceID'], [0x0020, 0x0010, 'IS', 'StudyID'], [0x0020, 0x0011, 'IS', 'SeriesNumber'], [0x0020, 0x0012, 'IS', 'AcquisionNumber'], @@ -460,8 +444,8 @@ export default class DicomDictionary { [0x0021, 0x1035, 'XX', 'SeriesFromWhichPrescribed'], [0x0021, 0x1036, 'XX', 'ImageFromWhichPrescribed'], [0x0021, 0x1037, 'XX', 'ScreenFormat'], - [0x0021, 0x104A, 'XX', 'AnatomicalReferenceForScout'], - [0x0021, 0x104F, 'XX', 'LocationsInAcquisition'], + [0x0021, 0x104a, 'XX', 'AnatomicalReferenceForScout'], + [0x0021, 0x104f, 'XX', 'LocationsInAcquisition'], [0x0021, 0x1050, 'XX', 'GraphicallyPrescribed'], [0x0021, 0x1051, 'XX', 'RotationFromSourceXRot'], [0x0021, 0x1052, 'XX', 'RotationFromSourceYRot'], @@ -472,12 +456,12 @@ export default class DicomDictionary { [0x0021, 0x1057, 'XX', 'IntegerSlop'], [0x0021, 0x1058, 'XX', 'IntegerSlop'], [0x0021, 0x1059, 'XX', 'IntegerSlop'], - [0x0021, 0x105A, 'XX', 'IntegerSlop'], - [0x0021, 0x105B, 'XX', 'FloatSlop'], - [0x0021, 0x105C, 'XX', 'FloatSlop'], - [0x0021, 0x105D, 'XX', 'FloatSlop'], - [0x0021, 0x105E, 'XX', 'FloatSlop'], - [0x0021, 0x105F, 'XX', 'FloatSlop'], + [0x0021, 0x105a, 'XX', 'IntegerSlop'], + [0x0021, 0x105b, 'XX', 'FloatSlop'], + [0x0021, 0x105c, 'XX', 'FloatSlop'], + [0x0021, 0x105d, 'XX', 'FloatSlop'], + [0x0021, 0x105e, 'XX', 'FloatSlop'], + [0x0021, 0x105f, 'XX', 'FloatSlop'], [0x0021, 0x1081, 'XX', 'AutoWindowLevelAlpha'], [0x0021, 0x1082, 'XX', 'AutoWindowLevelBeta'], [0x0021, 0x1083, 'XX', 'AutoWindowLevelWindow'], @@ -506,16 +490,16 @@ export default class DicomDictionary { [0x0025, 0x1017, 'SL', 'SeriesCompleteFlag'], [0x0025, 0x1018, 'SL', 'NumberOfImagesArchived'], [0x0025, 0x1019, 'SL', 'LastImageNumberUsed'], - [0x0025, 0x101A, 'SH', 'PrimaryReceiverSuiteAndHost'], - [0x0025, 0x101B, 'OB', 'ProtocolDataBlock'], + [0x0025, 0x101a, 'SH', 'PrimaryReceiverSuiteAndHost'], + [0x0025, 0x101b, 'OB', 'ProtocolDataBlock'], [0x0027, 0x0010, 'LO', 'PrivateCreator'], [0x0027, 0x1006, 'XX', 'ImageArchiveFlag'], [0x0027, 0x1010, 'XX', 'ScoutType'], - [0x0027, 0x101C, 'XX', 'VmaMamp'], - [0x0027, 0x101D, 'XX', 'VmaPhase'], - [0x0027, 0x101E, 'XX', 'VmaMod'], - [0x0027, 0x101F, 'XX', 'VmaClip'], + [0x0027, 0x101c, 'XX', 'VmaMamp'], + [0x0027, 0x101d, 'XX', 'VmaPhase'], + [0x0027, 0x101e, 'XX', 'VmaMod'], + [0x0027, 0x101f, 'XX', 'VmaClip'], [0x0027, 0x1020, 'XX', 'SmartScanOnOffFlag'], [0x0027, 0x1030, 'XX', 'ForeignImageRevision'], [0x0027, 0x1031, 'XX', 'ImagingMode'], @@ -533,10 +517,10 @@ export default class DicomDictionary { [0x0027, 0x1047, 'XX', 'NormalSCoord'], [0x0027, 0x1048, 'XX', 'RCoordOfTopRightCorner'], [0x0027, 0x1049, 'XX', 'ACoordOfTopRightCorner'], - [0x0027, 0x104A, 'XX', 'SCoordOfTopRightCorner'], - [0x0027, 0x104B, 'XX', 'RCoordOfBottomRightCorner'], - [0x0027, 0x104C, 'XX', 'ACoordOfBottomRightCorner'], - [0x0027, 0x104D, 'XX', 'SCoordOfBottomRightCorner'], + [0x0027, 0x104a, 'XX', 'SCoordOfTopRightCorner'], + [0x0027, 0x104b, 'XX', 'RCoordOfBottomRightCorner'], + [0x0027, 0x104c, 'XX', 'ACoordOfBottomRightCorner'], + [0x0027, 0x104d, 'XX', 'SCoordOfBottomRightCorner'], [0x0027, 0x1050, 'XX', 'TableStartLocation'], [0x0027, 0x1051, 'XX', 'TableEndLocation'], [0x0027, 0x1060, 'FL', 'ImageDimensionX'], @@ -588,7 +572,7 @@ export default class DicomDictionary { [0x0038, 0x0010, 'XX', 'AdmissionId'], [0x0038, 0x0050, 'XX', 'SpecialNeeds'], [0x0038, 0x0500, 'XX', 'PatientState'], - + [0x0040, 0x0000, 'UL', 'TextGroupLength'], [0x0040, 0x0242, 'XX', 'PerformedStationName'], [0x0040, 0x0243, 'XX', 'PerformedLocation'], @@ -599,7 +583,7 @@ export default class DicomDictionary { [0x0040, 0x0255, 'LO', 'PerformedProcedureTypeDescription'], [0x0040, 0x0280, 'XX', '"CommentsOnPerformedProcedureStep'], [0x0040, 0x0321, 'XX', 'FilmConsumptionSequence'], - + [0x0040, 0x1001, 'XX', 'RequestedProcedureId'], [0x0040, 0x1002, 'XX', 'Unknown'], [0x0040, 0x1003, 'XX', 'Unknown'], @@ -610,7 +594,7 @@ export default class DicomDictionary { [0x0040, 0x2400, 'XX', 'ImagingServiceRequestComments'], [0x0040, 0x3001, 'XX', 'Unknown'], - + [0x0043, 0x0010, 'LO', 'PrivateCreator'], [0x0043, 0x1001, 'XX', 'BitmapOfPrescanOptions'], [0x0043, 0x1002, 'XX', 'GradientOffsetInX'], @@ -621,12 +605,12 @@ export default class DicomDictionary { [0x0043, 0x1007, 'XX', 'ViewsPerSegment'], [0x0043, 0x1008, 'XX', 'RespiratoryRateBpm'], [0x0043, 0x1009, 'XX', 'RespiratoryTriggerPoint'], - [0x0043, 0x100A, 'XX', 'TypeOfReceiverUsed'], - [0x0043, 0x100B, 'XX', 'PeakRateOfChangeOfGradientField'], - [0x0043, 0x100C, 'XX', 'LimitsInUnitsOfPercent'], - [0x0043, 0x100D, 'XX', 'PSDEstimatedLimit'], - [0x0043, 0x100E, 'XX', 'PSDEstimatedLimitInTeslaPerSecond'], - [0x0043, 0x100F, 'XX', 'Saravghead'], + [0x0043, 0x100a, 'XX', 'TypeOfReceiverUsed'], + [0x0043, 0x100b, 'XX', 'PeakRateOfChangeOfGradientField'], + [0x0043, 0x100c, 'XX', 'LimitsInUnitsOfPercent'], + [0x0043, 0x100d, 'XX', 'PSDEstimatedLimit'], + [0x0043, 0x100e, 'XX', 'PSDEstimatedLimitInTeslaPerSecond'], + [0x0043, 0x100f, 'XX', 'Saravghead'], [0x0043, 0x1010, 'XX', 'WindowValue'], [0x0043, 0x1011, 'XX', 'TotalInputViews'], [0x0043, 0x1012, 'XX', 'XRayChain'], @@ -637,12 +621,12 @@ export default class DicomDictionary { [0x0043, 0x1017, 'XX', 'IBHImageScaleFactors'], [0x0043, 0x1018, 'XX', 'BBHCoefficients'], [0x0043, 0x1019, 'XX', 'NumberOfBBHChainsToBlend'], - [0x0043, 0x101A, 'XX', 'StartingChannelNumber'], - [0x0043, 0x101B, 'XX', 'PpscanParameters'], - [0x0043, 0x101C, 'XX', 'GEImageIntegrity'], - [0x0043, 0x101D, 'XX', 'LevelValue'], - [0x0043, 0x101E, 'XX', 'DeltaStartTime'], - [0x0043, 0x101F, 'XX', 'MaxOverrangesInAView'], + [0x0043, 0x101a, 'XX', 'StartingChannelNumber'], + [0x0043, 0x101b, 'XX', 'PpscanParameters'], + [0x0043, 0x101c, 'XX', 'GEImageIntegrity'], + [0x0043, 0x101d, 'XX', 'LevelValue'], + [0x0043, 0x101e, 'XX', 'DeltaStartTime'], + [0x0043, 0x101f, 'XX', 'MaxOverrangesInAView'], [0x0043, 0x1020, 'XX', 'AvgOverrangesAllViews'], [0x0043, 0x1021, 'XX', 'CorrectedAfterGlowTerms'], [0x0043, 0x1025, 'XX', 'ReferenceChannels'], @@ -650,12 +634,12 @@ export default class DicomDictionary { [0x0043, 0x1027, 'XX', 'ScanPitchRatio'], [0x0043, 0x1028, 'XX', 'UniqueImageIden'], [0x0043, 0x1029, 'XX', 'HistogramTables'], - [0x0043, 0x102A, 'XX', 'UserDefinedData'], - [0x0043, 0x102B, 'XX', 'PrivateScanOptions'], - [0x0043, 0x102C, 'XX', 'EffectiveEchoSpacing'], - [0x0043, 0x102D, 'XX', 'StringSlopField1'], - [0x0043, 0x102E, 'XX', 'StringSlopField2'], - [0x0043, 0x102F, 'XX', 'RawDataType'], + [0x0043, 0x102a, 'XX', 'UserDefinedData'], + [0x0043, 0x102b, 'XX', 'PrivateScanOptions'], + [0x0043, 0x102c, 'XX', 'EffectiveEchoSpacing'], + [0x0043, 0x102d, 'XX', 'StringSlopField1'], + [0x0043, 0x102e, 'XX', 'StringSlopField2'], + [0x0043, 0x102f, 'XX', 'RawDataType'], [0x0043, 0x1030, 'XX', 'RawDataType'], [0x0043, 0x1031, 'XX', 'RACordOfTargetReconCenter'], [0x0043, 0x1032, 'XX', 'RawDataType'], @@ -676,31 +660,31 @@ export default class DicomDictionary { [0x0043, 0x1047, 'XX', 'DASCalFrequency'], [0x0043, 0x1048, 'XX', 'DASRegXm'], [0x0043, 0x1049, 'XX', 'DASAutoZero'], - [0x0043, 0x104A, 'XX', 'StartingChannelOfView'], - [0x0043, 0x104B, 'XX', 'DASXmPattern'], - [0x0043, 0x104C, 'XX', 'TGGCTriggerMode'], - [0x0043, 0x104D, 'XX', 'StartScanToXrayOnDelay'], - [0x0043, 0x104E, 'XX', 'DurationOfXrayOn'], + [0x0043, 0x104a, 'XX', 'StartingChannelOfView'], + [0x0043, 0x104b, 'XX', 'DASXmPattern'], + [0x0043, 0x104c, 'XX', 'TGGCTriggerMode'], + [0x0043, 0x104d, 'XX', 'StartScanToXrayOnDelay'], + [0x0043, 0x104e, 'XX', 'DurationOfXrayOn'], [0x0043, 0x1060, 'XX', 'SlopInt10_17'], [0x0043, 0x1061, 'XX', 'ScannerStudyEntityUID'], [0x0043, 0x1062, 'XX', 'ScannerStudyID'], - [0x0043, 0x106F, 'XX', 'ScannerTableEntry'], - [0x0043, 0x107D, 'US', 'ReconModeFlagWord '], + [0x0043, 0x106f, 'XX', 'ScannerTableEntry'], + [0x0043, 0x107d, 'US', 'ReconModeFlagWord '], [0x0043, 0x1080, 'LO', 'CoilIDData'], [0x0043, 0x1081, 'LO', 'GECoilName'], [0x0043, 0x1082, 'LO', 'SystemConfigurationInformation'], [0x0043, 0x1083, 'DS', 'AssetRFactors'], [0x0043, 0x1084, 'LO', 'AdditionalAssetData'], [0x0043, 0x1089, 'LO', 'GoverningBodyAndSARDefinition'], - [0x0043, 0x108A, 'CS', 'PrivateInPlanePhaseEncodingDirection'], + [0x0043, 0x108a, 'CS', 'PrivateInPlanePhaseEncodingDirection'], [0x0043, 0x1090, 'LO', 'SARDefinition'], [0x0043, 0x1091, 'DS', 'SARValue'], [0x0043, 0x1095, 'LO', 'PrescanReuseString'], [0x0043, 0x1096, 'CS', 'ContentQualification'], [0x0043, 0x1097, 'LO', 'ImageFilteringParameters'], - [0x0043, 0x109A, 'IS', 'RxStackIdentification'], - [0x0043, 0x10AA, 'LO', 'AdditionalFilteringParameters'], - [0x0043, 0x10B1, 'SS', 'ExcitationMode'], + [0x0043, 0x109a, 'IS', 'RxStackIdentification'], + [0x0043, 0x10aa, 'LO', 'AdditionalFilteringParameters'], + [0x0043, 0x10b1, 'SS', 'ExcitationMode'], [0x0045, 0x0010, 'LO', 'PrivateCreator'], [0x0045, 0x1001, 'XX', 'NumberOfMacroRowsInDetector'], @@ -711,12 +695,12 @@ export default class DicomDictionary { [0x0045, 0x1007, 'XX', 'ZSmoothingFactor'], [0x0045, 0x1008, 'XX', 'ViewWeightingMode'], [0x0045, 0x1009, 'XX', 'SigmaRowNumberWhichRowsWereUsed'], - [0x0045, 0x100A, 'XX', 'MinimumDasValueFoundInTheScanData'], - [0x0045, 0x100B, 'XX', 'MaximumOffsetShiftValueUsed'], - [0x0045, 0x100C, 'XX', 'NumberOfViewsShifted'], - [0x0045, 0x100D, 'XX', 'ZTrackingFlag'], - [0x0045, 0x100E, 'XX', 'MeanZError'], - [0x0045, 0x100F, 'XX', 'ZTrackingMaximumError'], + [0x0045, 0x100a, 'XX', 'MinimumDasValueFoundInTheScanData'], + [0x0045, 0x100b, 'XX', 'MaximumOffsetShiftValueUsed'], + [0x0045, 0x100c, 'XX', 'NumberOfViewsShifted'], + [0x0045, 0x100d, 'XX', 'ZTrackingFlag'], + [0x0045, 0x100e, 'XX', 'MeanZError'], + [0x0045, 0x100f, 'XX', 'ZTrackingMaximumError'], [0x0045, 0x1010, 'XX', 'StartingViewForRow2a'], [0x0045, 0x1011, 'XX', 'NumberOfViewsInRow2a'], [0x0045, 0x1012, 'XX', 'StartingViewForRow1a'], @@ -730,7 +714,6 @@ export default class DicomDictionary { [0x0045, 0x1022, 'XX', 'PrivateTag'], [0x0045, 0x1032, 'XX', 'PrivateTag'], - [0x0053, 0x0010, 'LO', 'PrivateCreator'], [0x0053, 0x1020, 'XX', 'PrivateTag'], [0x0053, 0x1040, 'XX', 'PrivateTag'], @@ -761,16 +744,16 @@ export default class DicomDictionary { } // constructor /** - * Get vr string code from group + element codes - * @param {number} group - group of the tag - * @param {number} element - element of the tag - * return {string} vr - */ + * Get vr string code from group + element codes + * @param {number} group - group of the tag + * @param {number} element - element of the tag + * return {string} vr + */ getVr(group, element) { let vr = ''; const numTags = this.TAGS.length; for (let i = 0; i < numTags; i++) { - if ((this.TAGS[i][0] === group) && (this.TAGS[i][1] === element)) { + if (this.TAGS[i][0] === group && this.TAGS[i][1] === element) { vr = this.TAGS[i][2]; } } // for (i) all @@ -781,16 +764,16 @@ export default class DicomDictionary { } // get VR /** - * Get descripotion string from group + element codes - * @param {number} group - group of the tag - * @param {number} element - element of the tag - * return {string} description - */ + * Get descripotion string from group + element codes + * @param {number} group - group of the tag + * @param {number} element - element of the tag + * return {string} description + */ getTextDesc(group, element) { let tagDesc = '?'; const numTags = this.TAGS.length; for (let i = 0; i < numTags; i++) { - if ((this.TAGS[i][0] === group) && (this.TAGS[i][1] === element)) { + if (this.TAGS[i][0] === group && this.TAGS[i][1] === element) { tagDesc = this.TAGS[i][3]; } } // for (i) all diff --git a/src/engine/loaders/dicominfo.js b/src/engine/loaders/dicominfo.js new file mode 100644 index 00000000..726ead27 --- /dev/null +++ b/src/engine/loaders/dicominfo.js @@ -0,0 +1,36 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Dicom info + * @module lib/scripts/loaders/dicominfo + */ + +/** + * Class @class DicomInfo for volume some important text data render + */ +class DicomInfo { + constructor() { + this.m_patientName = ''; + this.m_patientDateOfBirth = ''; + this.m_studyDescr = ''; + this.m_studyDate = ''; + this.m_seriesTime = ''; + this.m_seriesDescr = ''; + this.m_bodyPartExamined = ''; + this.m_institutionName = ''; + this.m_operatorsName = ''; + this.m_physicansName = ''; + + this.m_patientId = ''; + this.m_patientGender = ''; + this.m_acquisionTime = ''; + this.m_manufacturerName = ''; + // tags info for each slice. Each entry is DicomSliceInfo + this.m_sliceInfo = []; + } +} + +export default DicomInfo; diff --git a/src/engine/loaders/dicomserie.js b/src/engine/loaders/dicomserie.js new file mode 100644 index 00000000..778af73c --- /dev/null +++ b/src/engine/loaders/dicomserie.js @@ -0,0 +1,34 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +// +// +// + +import DicomSlice from './dicomslice'; + +const FLOAT_TOO_LARGE_VALUE = 555555555555.5; + +class DicomSerie { + constructor(hash) { + console.assert(hash !== undefined); + console.assert(typeof hash === 'number', 'hash shold be number'); + + this.m_hash = hash; + this.m_slices = []; + this.m_minSlice = +FLOAT_TOO_LARGE_VALUE; + this.m_maxSlice = -FLOAT_TOO_LARGE_VALUE; + } + + addSlice(slice) { + console.assert(slice !== undefined); + console.assert(slice instanceof DicomSlice, 'added slice should be DicomSlice object'); + this.m_slices.push(slice); + this.m_minSlice = slice.m_sliceNumber < this.m_minSlice ? slice.m_sliceNumber : this.m_minSlice; + this.m_maxSlice = slice.m_sliceNumber > this.m_maxSlice ? slice.m_sliceNumber : this.m_maxSlice; + } +} // end DicomSerie + +export default DicomSerie; diff --git a/src/demo/engine/loaders/dicomseriedescr.js b/src/engine/loaders/dicomseriedescr.js similarity index 66% rename from src/demo/engine/loaders/dicomseriedescr.js rename to src/engine/loaders/dicomseriedescr.js index 294cb699..835f84d8 100644 --- a/src/demo/engine/loaders/dicomseriedescr.js +++ b/src/engine/loaders/dicomseriedescr.js @@ -1,4 +1,7 @@ - +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ class DicomSerieDescr { constructor() { @@ -12,4 +15,4 @@ class DicomSerieDescr { this.m_studyDescr = ''; } } -export default DicomSerieDescr; \ No newline at end of file +export default DicomSerieDescr; diff --git a/src/demo/engine/loaders/dicomslice.js b/src/engine/loaders/dicomslice.js similarity index 73% rename from src/demo/engine/loaders/dicomslice.js rename to src/engine/loaders/dicomslice.js index 313db1ce..705bc9f7 100644 --- a/src/demo/engine/loaders/dicomslice.js +++ b/src/engine/loaders/dicomslice.js @@ -1,3 +1,7 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ // ******************************************************** // Imports @@ -5,14 +9,13 @@ import Hash from '../utils/Hash'; - // ******************************************************** // Class // ******************************************************** /** -* Class DicomSlice Single slice with info, used to detect series -*/ + * Class DicomSlice Single slice with info, used to detect series + */ class DicomSlice { constructor() { @@ -38,9 +41,8 @@ class DicomSlice { } buildHash() { - const strMix = this.m_patientName + this.m_studyDescr + - this.m_studyDate + this.m_seriesTime + - this.m_seriesDescr + this.m_bodyPartExamined; + const strMix = + this.m_patientName + this.m_studyDescr + this.m_studyDate + this.m_seriesTime + this.m_seriesDescr + this.m_bodyPartExamined; this.m_hash = Hash.getHash(strMix); } // end build hash } // end class DicomSlice diff --git a/src/engine/loaders/dicomsliceinfo.js b/src/engine/loaders/dicomsliceinfo.js new file mode 100644 index 00000000..295f5463 --- /dev/null +++ b/src/engine/loaders/dicomsliceinfo.js @@ -0,0 +1,23 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Dicom slice info + * @module lib/scripts/loaders/dicomsliceinfo + */ + +/** + * Class @class DicomSliceInfo slice information + */ +class DicomSliceInfo { + constructor() { + this.m_sliceName = ''; + this.m_fileName = ''; + // tags info for each slice. Each entry is DicomTagInfo + this.m_tags = []; + } +} + +export default DicomSliceInfo; diff --git a/src/demo/engine/loaders/dicomslicesvolume.js b/src/engine/loaders/dicomslicesvolume.js similarity index 86% rename from src/demo/engine/loaders/dicomslicesvolume.js rename to src/engine/loaders/dicomslicesvolume.js index 608e7143..56df551e 100644 --- a/src/demo/engine/loaders/dicomslicesvolume.js +++ b/src/engine/loaders/dicomslicesvolume.js @@ -1,3 +1,8 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + // ******************************************************** // Imports // ******************************************************** @@ -14,8 +19,8 @@ import DicomSerie from './dicomserie'; // ******************************************************** /** -* Class DicomSlicesVolume Collected volume (from slices) -*/ + * Class DicomSlicesVolume Collected volume (from slices) + */ class DicomSlicesVolume { constructor() { // @@ -39,7 +44,7 @@ class DicomSlicesVolume { // slice: DicomSlice addSlice(slice) { console.assert(slice !== undefined); - console.assert(slice instanceof DicomSlice, "should be DicomSlice object"); + console.assert(slice instanceof DicomSlice, 'should be DicomSlice object'); console.assert(slice.m_hash !== undefined); console.assert(slice.m_hash !== 0); let indSerie = this.getSerieIndex(slice); @@ -64,7 +69,6 @@ class DicomSlicesVolume { } // end for return -1; } // end get serie index - } // end class DicomSlicesVolume export default DicomSlicesVolume; diff --git a/src/demo/engine/loaders/dicomtag.js b/src/engine/loaders/dicomtag.js similarity index 65% rename from src/demo/engine/loaders/dicomtag.js rename to src/engine/loaders/dicomtag.js index 95e29d05..5e36cec1 100644 --- a/src/demo/engine/loaders/dicomtag.js +++ b/src/engine/loaders/dicomtag.js @@ -1,16 +1,19 @@ - +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ // ***************************************************************** -// Const +// Const // ***************************************************************** const TAG_TRANSFER_SYNTAX = [0x0002, 0x0010]; const TAG_META_LENGTH = [0x0002, 0x0000]; -const TAG_PIXEL_DATA = [0x7FE0, 0x0010]; +const TAG_PIXEL_DATA = [0x7fe0, 0x0010]; /** -* class DicomTag is used for parse tags inside dicom file structure -*/ + * class DicomTag is used for parse tags inside dicom file structure + */ class DicomTag { /** * @param {number} group - group in pair group:element @@ -22,14 +25,7 @@ class DicomTag { * @param {number} offsetEnd - offset in stream * @param {number} littleEndian - is in little endian mode numbers encoding */ - constructor(group, - element, - vr, - value, - offsetStart, - offsetValue, - offsetEnd, - littleEndian) { + constructor(group, element, vr, value, offsetStart, offsetValue, offsetEnd, littleEndian) { /** @property {number} m_group - group for group:element pair */ this.m_group = group; /** @property {number} m_element - element for group:element pair */ @@ -49,41 +45,41 @@ class DicomTag { } /** - * get value - * @return {object} data content of this tag - */ + * get value + * @return {object} data content of this tag + */ value() { return this.m_value; } /** - * check has transform syntax or not - * @return {boolean} is transform - */ + * check has transform syntax or not + * @return {boolean} is transform + */ isTransformSyntax() { - if ((this.m_group === TAG_TRANSFER_SYNTAX[0]) && (this.m_element === TAG_TRANSFER_SYNTAX[1])) { + if (this.m_group === TAG_TRANSFER_SYNTAX[0] && this.m_element === TAG_TRANSFER_SYNTAX[1]) { return true; } return false; } /** - * check is this tag meta - * @return {boolean} true, if this tag is meta tag - */ + * check is this tag meta + * @return {boolean} true, if this tag is meta tag + */ isMetaLength() { - if ((this.m_group === TAG_META_LENGTH[0]) && (this.m_element === TAG_META_LENGTH[1])) { + if (this.m_group === TAG_META_LENGTH[0] && this.m_element === TAG_META_LENGTH[1]) { return true; } return false; } /** - * check has image bits in this tag data - * @return {boolean} true, if image bits is inside tag data - */ + * check has image bits in this tag data + * @return {boolean} true, if image bits is inside tag data + */ isPixelData() { - if ((this.m_group === TAG_PIXEL_DATA[0]) && (this.m_element === TAG_PIXEL_DATA[1])) { + if (this.m_group === TAG_PIXEL_DATA[0] && this.m_element === TAG_PIXEL_DATA[1]) { return true; } return false; diff --git a/src/engine/loaders/dicomtaginfo.js b/src/engine/loaders/dicomtaginfo.js new file mode 100644 index 00000000..682f2777 --- /dev/null +++ b/src/engine/loaders/dicomtaginfo.js @@ -0,0 +1,22 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Dicom tag info + * @module lib/scripts/loaders/dicomtaginfo + */ + +/** + * Class @class DicomTagInfo tag descr + */ +class DicomTagInfo { + constructor() { + this.m_tag = ''; + this.m_attrName = ''; + this.m_attrValue = ''; + } +} + +export default DicomTagInfo; diff --git a/src/demo/engine/loaders/voltools.js b/src/engine/loaders/voltools.js similarity index 71% rename from src/demo/engine/loaders/voltools.js rename to src/engine/loaders/voltools.js index 6aca6913..fdc04534 100644 --- a/src/demo/engine/loaders/voltools.js +++ b/src/engine/loaders/voltools.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Math volume processing tools -* @module lib/scripts/loaders/voltools -*/ + * Math volume processing tools + * @module lib/scripts/loaders/voltools + */ // **************************************************************************** // Imports @@ -32,7 +18,7 @@ under the License. /** @constant {number} maximum smoothing neighbourhood size */ // eslint-disable-next-line -const GAUSS_SMOOTH_MAX_SIDE = (11 * 2 + 1); +const GAUSS_SMOOTH_MAX_SIDE = 11 * 2 + 1; /** @constant {number} maximum side for input volume */ const MAX_VOLUME_SIDE_INPUT = 4096; @@ -43,30 +29,24 @@ const MAX_VOLUME_SIDE_INPUT = 4096; /** Class VolumeTools for some volume math operations */ export default class VolumeTools { - /** - * Constructor create array for Gaussian weight koefficients - */ + * Constructor create array for Gaussian weight koefficients + */ constructor() { this.m_gaussWeights = new Float32Array(GAUSS_SMOOTH_MAX_SIDE * GAUSS_SMOOTH_MAX_SIDE * GAUSS_SMOOTH_MAX_SIDE); } /** - * Smooth volume (3d matrix) with given parameters - * @param {object} volBuffer - source volume - * @param {number} xDim - source volume x dimension - * @param {number} yDim - source volume y dimension - * @param {number} zDim - source volume z dimension - * @param {number} gaussRadius - radius for smoothing - * @param {number} gaussSigma - sigma koefficient for smoothing - * @return {number} 1, if everything fine - */ - gaussSmooth(volBuffer, - xDim, - yDim, - zDim, - gaussRadius, - gaussSigma) { + * Smooth volume (3d matrix) with given parameters + * @param {object} volBuffer - source volume + * @param {number} xDim - source volume x dimension + * @param {number} yDim - source volume y dimension + * @param {number} zDim - source volume z dimension + * @param {number} gaussRadius - radius for smoothing + * @param {number} gaussSigma - sigma koefficient for smoothing + * @return {number} 1, if everything fine + */ + gaussSmooth(volBuffer, xDim, yDim, zDim, gaussRadius, gaussSigma) { // eslint-disable-next-line const side = Math.floor(gaussRadius * 2 + 1); // check valid arguments @@ -81,13 +61,13 @@ export default class VolumeTools { } const SIGMA_MIN = 0.0; const SIGMA_MAX = 8.0; - if ((gaussSigma < SIGMA_MIN) || (gaussSigma > SIGMA_MAX)) { + if (gaussSigma < SIGMA_MIN || gaussSigma > SIGMA_MAX) { return ERR_BAD_SIGMA; } - if ((xDim <= 0) || (yDim <= 0) || (zDim <= 0)) { + if (xDim <= 0 || yDim <= 0 || zDim <= 0) { return ERR_DIM_NEGATIVE; } - if ((xDim > MAX_VOLUME_SIDE_INPUT) || (yDim > MAX_VOLUME_SIDE_INPUT) || (zDim > MAX_VOLUME_SIDE_INPUT)) { + if (xDim > MAX_VOLUME_SIDE_INPUT || yDim > MAX_VOLUME_SIDE_INPUT || zDim > MAX_VOLUME_SIDE_INPUT) { return ERR_DIM_LARGE; } // check valid buffer size @@ -122,13 +102,13 @@ export default class VolumeTools { for (let x = 0; x < side; x++) { const dx = x - gaussRadius; const dist2 = dx * dx + dy * dy + dz * dz; - const w = 1.0 / Math.exp((dist2) * koefSpatial); + const w = 1.0 / Math.exp(dist2 * koefSpatial); this.m_gaussWeights[off] = w; weightSum += this.m_gaussWeights[off]; off += 1; - } // for (x) - } // for (y) - } // for (z) + } // for (x) + } // for (y) + } // for (z) // Normalize gauss matrix const scale = 1.0 / weightSum; @@ -145,32 +125,32 @@ export default class VolumeTools { let offConv = 0; for (let dz = -gaussRadius; dz <= +gaussRadius; dz++) { let zz = z + dz; - zz = (zz < 0) ? 0 : zz; - zz = (zz >= zDim) ? (zDim - 1) : zz; + zz = zz < 0 ? 0 : zz; + zz = zz >= zDim ? zDim - 1 : zz; for (let dy = -gaussRadius; dy <= +gaussRadius; dy++) { let yy = y + dy; - yy = (yy < 0) ? 0 : yy; - yy = (yy >= yDim) ? (yDim - 1) : yy; + yy = yy < 0 ? 0 : yy; + yy = yy >= yDim ? yDim - 1 : yy; for (let dx = -gaussRadius; dx <= +gaussRadius; dx++) { let xx = x + dx; - xx = (xx < 0) ? 0 : xx; - xx = (xx >= xDim) ? (xDim - 1) : xx; + xx = xx < 0 ? 0 : xx; + xx = xx >= xDim ? xDim - 1 : xx; const w = this.m_gaussWeights[offConv]; offConv += 1; const offImage = zz * xyDim + yy * xDim + xx; const val = volBuffer[offImage]; sum += val * w; - } // for (dx) - } // for (dy) - } // for (dz) + } // for (dx) + } // for (dy) + } // for (dz) let iSum = Math.floor(sum); const MAX_BYTE = 255; - iSum = (iSum <= MAX_BYTE) ? iSum : MAX_BYTE; + iSum = iSum <= MAX_BYTE ? iSum : MAX_BYTE; const offImage = z * xyDim + y * xDim + x; volDst[offImage] = iSum; - } // for (x) - } // for (y) - } // for (z) + } // for (x) + } // for (y) + } // for (z) // copy filtered volume back to source // volBuffer.set(volDst, 0); @@ -182,13 +162,13 @@ export default class VolumeTools { } /** - * Smooth 1d histogram function - * @param {object} histSrc - source histogram - * @param {object} histDst - destination histogram - * @param {number} numEntries - number of entries in histogram - * @param {number} gaussSigma - sigma koefficient for smoothing - * @return {number} 1, if everything fine - */ + * Smooth 1d histogram function + * @param {object} histSrc - source histogram + * @param {object} histDst - destination histogram + * @param {number} numEntries - number of entries in histogram + * @param {number} gaussSigma - sigma koefficient for smoothing + * @return {number} 1, if everything fine + */ static buildSmoothedHistogram(histSrc, histDst, numEntries, gaussSigma) { // check args const ERR_NO_SRC = -1; @@ -210,7 +190,7 @@ export default class VolumeTools { } const SIGMA_MIN = 0.0; const SIGMA_MAX = 64.0; - if ((gaussSigma < SIGMA_MIN) || (gaussSigma > SIGMA_MAX)) { + if (gaussSigma < SIGMA_MIN || gaussSigma > SIGMA_MAX) { return ERR_SIGMA_RANGE; } @@ -229,10 +209,10 @@ export default class VolumeTools { // t in [-1..+1] let t = j / windowSize; // t in [0..1] - t = (t >= 0.0) ? t : -t; + t = t >= 0.0 ? t : -t; let idx = i + j; - idx = (idx >= 0) ? idx : 0; - idx = (idx < numEntries) ? idx : (numEntries - 1); + idx = idx >= 0 ? idx : 0; + idx = idx < numEntries ? idx : numEntries - 1; const val = histSrc[idx]; const koef = Math.exp(-t * gaussSigma); sum += val * koef; @@ -248,11 +228,11 @@ export default class VolumeTools { } // buildSmoothedHistogram /** - * Scale down xy plane twice - * @param {object} loader - Loader object - * @param {array} dataArray - sorce volume - * @return {array} modified (scalewd down) volume - */ + * Scale down xy plane twice + * @param {object} loader - Loader object + * @param {array} dataArray - sorce volume + * @return {array} modified (scalewd down) volume + */ static scaleDownXYtwice(loader, dataArray) { const VAL_2 = 2; const VAL_4 = 4; @@ -274,8 +254,9 @@ export default class VolumeTools { for (let x = 0; x < xDim; x++) { const xSrc = x + x; const offSrc = offSrcZ + offSrcY + xSrc; - const aveSrc = (dataArray[offSrc + 0] + dataArray[offSrc + 1] + - dataArray[offSrc + loader.m_xDim] + dataArray[offSrc + loader.m_xDim + 1]) / VAL_4; + const aveSrc = + (dataArray[offSrc + 0] + dataArray[offSrc + 1] + dataArray[offSrc + loader.m_xDim] + dataArray[offSrc + loader.m_xDim + 1]) / + VAL_4; dataNew[offDstZ + offDstY + x] = aveSrc; } // for x } // for y @@ -294,14 +275,14 @@ export default class VolumeTools { } /** - * Scale down - * @param {object} loader - Loader object - * @param {array} pixelSrc - source volume pixels - * @param {number} xDimDst - destination volume size on x - * @param {number} yDimDst - destination volume size on y - * @param {number} zDimDst - destination volume size on z - * @return {array} modified (scaled) volume - */ + * Scale down + * @param {object} loader - Loader object + * @param {array} pixelSrc - source volume pixels + * @param {number} xDimDst - destination volume size on x + * @param {number} yDimDst - destination volume size on y + * @param {number} zDimDst - destination volume size on z + * @return {array} modified (scaled) volume + */ static scaleTextureDown(loader, pixelsSrc, xDimDst, yDimDst, zDimDst) { const ACC_BITS = 10; const ACC_HALF = 1 << (ACC_BITS - 1); @@ -312,7 +293,7 @@ export default class VolumeTools { const yDimSrc = loader.m_yDim; const zDimSrc = loader.m_zDim; - const isCorrectDim = (xDimSrc > xDimDst) || (yDimSrc > yDimDst) || (zDimSrc > zDimDst); + const isCorrectDim = xDimSrc > xDimDst || yDimSrc > yDimDst || zDimSrc > zDimDst; if (!isCorrectDim) { return null; } @@ -350,26 +331,26 @@ export default class VolumeTools { sum += pixelsSrc[offSrc]; numPixels++; } // for (x) - } // for (y) - } // for (z) + } // for (y) + } // for (z) sum = Math.floor(sum / numPixels); pixelsDst[indDst++] = sum; } // for (xDst) - } // for (yDst) - } // for (zDst) + } // for (yDst) + } // for (zDst) loader.m_xDim = xDimDst; loader.m_yDim = yDimDst; loader.m_zDim = zDimDst; return pixelsDst; - } // end of scaleTextureDown + } // end of scaleTextureDown /** - * Scale down - * @param {array} pixelSrc - source volume pixels - * @param {number} xDimSrc - destination volume size on x - * @param {number} yDimSrc - destination volume size on y - * @param {number} zDimSrc - destination volume size on z - */ + * Scale down + * @param {array} pixelSrc - source volume pixels + * @param {number} xDimSrc - destination volume size on x + * @param {number} yDimSrc - destination volume size on y + * @param {number} zDimSrc - destination volume size on z + */ static scaleDown(pixelsSrc, xDimSrc, yDimSrc, zDimSrc, pixelsDst, xScale, yScale, zScale) { const xDimDst = Math.floor(xDimSrc / xScale); const yDimDst = Math.floor(yDimSrc / yScale); @@ -398,9 +379,9 @@ export default class VolumeTools { const val = pixelsSrc[offSrc]; valAve += val; numPixelsAve++; - } // for (xx) - } // for (yy) - } // for (zz) + } // for (xx) + } // for (yy) + } // for (zz) valAve /= numPixelsAve; pixelsDst[offDst++] = Math.floor(valAve); } // for (x) @@ -409,35 +390,27 @@ export default class VolumeTools { } /** - * Contrast enhance by unsharpen mask - * - * Wiki ref: https://en.wikipedia.org/wiki/Unsharp_masking - * - * main formula: sharpened = - * original + (original - blurred) * multiplier, if (original - blurred > EPS) - * original, otherwise - * - * @param {array} pixelsSrc - source volume pixels - * @param {number} xDim - volume size on x - * @param {number} yDim - volume size on y - * @param {number} zDim - volume size on z - * @param {array} pixelsDst - destination pixels - * @param {number} radSmooth - radius of smoothing for unsharp mask - * @param {number} sigmaSmooth - smoothing sigma for unsharp mask - * @param {number} multiplier - multiplier for formula above - * @return {number} 1, if OK - */ - static contrastEnchanceUnsharpMask(pixelsSrc, - xDim, - yDim, - zDim, - pixelsDst, - radSmooth, - sigmaSmooth, - multiplier, - needConsoleLog = false) { + * Contrast enhance by unsharpen mask + * + * Wiki ref: https://en.wikipedia.org/wiki/Unsharp_masking + * + * main formula: sharpened = + * original + (original - blurred) * multiplier, if (original - blurred > EPS) + * original, otherwise + * + * @param {array} pixelsSrc - source volume pixels + * @param {number} xDim - volume size on x + * @param {number} yDim - volume size on y + * @param {number} zDim - volume size on z + * @param {array} pixelsDst - destination pixels + * @param {number} radSmooth - radius of smoothing for unsharp mask + * @param {number} sigmaSmooth - smoothing sigma for unsharp mask + * @param {number} multiplier - multiplier for formula above + * @return {number} 1, if OK + */ + static contrastEnchanceUnsharpMask(pixelsSrc, xDim, yDim, zDim, pixelsDst, radSmooth, sigmaSmooth, multiplier, needConsoleLog = false) { // check input arguments - if ((typeof xDim !== 'number') || (typeof yDim !== 'number') || (typeof zDim !== 'number')) { + if (typeof xDim !== 'number' || typeof yDim !== 'number' || typeof zDim !== 'number') { return VolumeTools.VOLTOOLS_ERROR_BAD_NUMBER; } if (typeof pixelsSrc !== 'object') { @@ -453,11 +426,11 @@ export default class VolumeTools { if (multiplier >= MAX_POSSIBLE_MULTIPLIER) { return VolumeTools.VOLTOOLS_ERROR_BAD_MULTIPLIER; } - if ((xDim <= 1) || (yDim <= 1) || (zDim <= 1)) { + if (xDim <= 1 || yDim <= 1 || zDim <= 1) { return VolumeTools.VOLTOOLS_ERROR_BAD_DIMENSION; } const MAX_POSSIBLE_DIM = 4096; - if ((xDim >= MAX_POSSIBLE_DIM) || (yDim >= MAX_POSSIBLE_DIM) || (zDim >= MAX_POSSIBLE_DIM)) { + if (xDim >= MAX_POSSIBLE_DIM || yDim >= MAX_POSSIBLE_DIM || zDim >= MAX_POSSIBLE_DIM) { return VolumeTools.VOLTOOLS_ERROR_BAD_DIMENSION; } const TWO = 2; @@ -479,13 +452,13 @@ export default class VolumeTools { for (let x = 0; x < side; x++) { const dx = x - radSmooth; const dist2 = 1.0 * dx * dx + dy * dy + dz * dz; - const w = 1.0 / Math.exp((dist2) * koefSpatial); + const w = 1.0 / Math.exp(dist2 * koefSpatial); gaussWeights[off] = w; weightSum += gaussWeights[off]; off++; - } // for (x) - } // for (y) - } // for (z) + } // for (x) + } // for (y) + } // for (z) // Normalize gauss matrix const scale = 1.0 / weightSum; for (let x = 0; x < side3; x++) { @@ -499,22 +472,21 @@ export default class VolumeTools { let offConv = 0; for (let dz = -radSmooth; dz <= +radSmooth; dz++) { let z = zc + dz; - z = (z < 0) ? 0 : (z >= zDim) ? (zDim - 1) : z; + z = z < 0 ? 0 : z >= zDim ? zDim - 1 : z; const zOff = z * xyDim; for (let dy = -radSmooth; dy <= +radSmooth; dy++) { let y = yc + dy; - y = (y < 0) ? 0 : (y >= yDim) ? (yDim - 1) : y; + y = y < 0 ? 0 : y >= yDim ? yDim - 1 : y; const yOff = y * xDim; for (let dx = -radSmooth; dx <= +radSmooth; dx++) { let x = xc + dx; - x = (x < 0) ? 0 : (x >= xDim) ? (xDim - 1) : x; + x = x < 0 ? 0 : x >= xDim ? xDim - 1 : x; const w = gaussWeights[offConv]; offConv++; const offImage = x + yOff + zOff; const val = pixelsSrc[offImage]; valSmoothed += w * val; - } // for (dx) } // for (dy) } // for (dz) @@ -524,46 +496,45 @@ export default class VolumeTools { let val = pixelsSrc[off]; const valDif = val - valSmoothed; const MIN_DIF_UNSHARP_VAL = 2.0; - const valAdd = ((valDif > MIN_DIF_UNSHARP_VAL) || (valDif < -MIN_DIF_UNSHARP_VAL)) ? - (valDif * multiplier) : 0.0; - let valSharpened = val + valAdd; - valSharpened = (valSharpened < 0.0) ? 0.0 : valSharpened; + const valAdd = valDif > MIN_DIF_UNSHARP_VAL || valDif < -MIN_DIF_UNSHARP_VAL ? valDif * multiplier : 0.0; + let valSharpened = val + valAdd; + valSharpened = valSharpened < 0.0 ? 0.0 : valSharpened; val = Math.floor(valSharpened); const MAX_COLOR = 255; - val = (val > MAX_COLOR) ? MAX_COLOR : val; + val = val > MAX_COLOR ? MAX_COLOR : val; pixelsDst[off] = val; if (needConsoleLog) { const MASK_MANY = 16383; if ((off & MASK_MANY) === 0) { const HUNDR = 100.0; - const ratioPrc = off * HUNDR / (xDim * yDim * zDim); + const ratioPrc = (off * HUNDR) / (xDim * yDim * zDim); console.log(`contrastEnchanceUnsharpMask: ${ratioPrc} %`); } } // if ned console } // for (xc) - } // for (yc) - } // for (zc) + } // for (yc) + } // for (zc) return VolumeTools.VOLTOOLS_ERROR_OK; } /** - * Make texture size (z dimension) even number. - * Odd numbers are lead to render artifacts during 3d texture packing into 2d texture. - * @param {array} pixelsSrc - source volume pixels - * @param {number} xDim - volume size on x - * @param {number} yDim - volume size on y - * @param {number} zDim - volume size on z - */ + * Make texture size (z dimension) even number. + * Odd numbers are lead to render artifacts during 3d texture packing into 2d texture. + * @param {array} pixelsSrc - source volume pixels + * @param {number} xDim - volume size on x + * @param {number} yDim - volume size on y + * @param {number} zDim - volume size on z + */ static makeTextureSizeEven(pixelsSrc, xDim, yDim, zDim) { const BYTES_IN_DWORD = 4; const NUM3 = 3; - if (((xDim % BYTES_IN_DWORD) === 0) && ((yDim % BYTES_IN_DWORD) === 0) && ((zDim % BYTES_IN_DWORD) === 0)) { + if (xDim % BYTES_IN_DWORD === 0 && yDim % BYTES_IN_DWORD === 0 && zDim % BYTES_IN_DWORD === 0) { return pixelsSrc; } - const xDimNew = (xDim + NUM3) & (~NUM3); - const yDimNew = (yDim + NUM3) & (~NUM3); - const zDimNew = (zDim + NUM3) & (~NUM3); + const xDimNew = (xDim + NUM3) & ~NUM3; + const yDimNew = (yDim + NUM3) & ~NUM3; + const zDimNew = (zDim + NUM3) & ~NUM3; const numPixelsNew = xDimNew * yDimNew * zDimNew; const pixelsDst = new Uint8Array(numPixelsNew); @@ -593,15 +564,15 @@ export default class VolumeTools { } // makeTextureSizeEven /** - * Extract 2d texture from normal 3d array - * @param {number} xDim - volume dimension x - * @param {number} yDim - volume dimension x - * @param {number} zDim - volume dimension x - * @param {array} pixelsSrc - volume array of ARGB pixels (xDim * yDim * zDim) - * @param {number} sliceType - plane index. 0: x, 1: y, 2: z - * @param {number} sliceINdex - number of required slice - * @param {array} pixelsDst - result 2d image in ARGB format - */ + * Extract 2d texture from normal 3d array + * @param {number} xDim - volume dimension x + * @param {number} yDim - volume dimension x + * @param {number} zDim - volume dimension x + * @param {array} pixelsSrc - volume array of ARGB pixels (xDim * yDim * zDim) + * @param {number} sliceType - plane index. 0: x, 1: y, 2: z + * @param {number} sliceINdex - number of required slice + * @param {array} pixelsDst - result 2d image in ARGB format + */ static extract2dSliceFrom3dTexture(xDim, yDim, zDim, pixelsSrc, sliceType, sliceIndex, pixelsDst) { const BYTES_IN_DWORD = 4; const numPixVol = xDim * yDim * zDim; @@ -685,16 +656,16 @@ export default class VolumeTools { } // end of extract2dSliceFrom3dTexture /** - * Get 2d coordinate in tiled texture from original 3d coordinate - * @param {number} xDim - volume dimension x - * @param {number} yDim - volume dimension x - * @param {number} zDim - volume dimension x - * @param {number} tilesHor - number of tiles - * @param {number} fx - texture coordinate in 3d - * @param {number} fy - texture coordinate in 3d - * @param {number} fz - texture coordinate in 3d - * @param {object} vec2coord - output 2d coordinates - */ + * Get 2d coordinate in tiled texture from original 3d coordinate + * @param {number} xDim - volume dimension x + * @param {number} yDim - volume dimension x + * @param {number} zDim - volume dimension x + * @param {number} tilesHor - number of tiles + * @param {number} fx - texture coordinate in 3d + * @param {number} fy - texture coordinate in 3d + * @param {number} fz - texture coordinate in 3d + * @param {object} vec2coord - output 2d coordinates + */ static get2dCoordFromTiled3dCoord(xDim, yDim, zDim, tilesHor, fx, fy, fz, vec2coord) { const tileScale = 1.0 / tilesHor; let x = fx * tileScale; @@ -716,16 +687,16 @@ export default class VolumeTools { } /** - * Extract 2d texture from normal 3d array - * @param {number} xDim - volume dimension x - * @param {number} yDim - volume dimension x - * @param {number} zDim - volume dimension x - * @param {array} pixelsSrc - tiled 2d matrix of ARGB pixels, made from source 3d texture - * @param {number} sliceType - plane index. 0: x, 1: y, 2: z - * @param {number} sliceIndex - number of required slice - * @param {array} pixelsDst - result 2d image in ARGB format - * @param {number} isRoi - is palette should be applied to data or not - */ + * Extract 2d texture from normal 3d array + * @param {number} xDim - volume dimension x + * @param {number} yDim - volume dimension x + * @param {number} zDim - volume dimension x + * @param {array} pixelsSrc - tiled 2d matrix of ARGB pixels, made from source 3d texture + * @param {number} sliceType - plane index. 0: x, 1: y, 2: z + * @param {number} sliceIndex - number of required slice + * @param {array} pixelsDst - result 2d image in ARGB format + * @param {number} isRoi - is palette should be applied to data or not + */ static extract2dSliceFromTiled3dTexture(xDim, yDim, zDim, pixelsSrc, sliceType, sliceIndex, pixelsDst, isRoi) { const BYTES_IN_DWORD = 4; //const zDimSqrt = Math.ceil(Math.sqrt(zDim)); @@ -759,7 +730,7 @@ export default class VolumeTools { const fy = cx / w; const vec2coord = { x: 0.0, - y: 0.0 + y: 0.0, }; VolumeTools.get2dCoordFromTiled3dCoord(xDim, yDim, zDim, zDimSqrt, fx, fy, fz, vec2coord); const ux = Math.floor(vec2coord.x * xSize); @@ -794,7 +765,7 @@ export default class VolumeTools { const fx = cx / w; const vec2coord = { x: 0.0, - y: 0.0 + y: 0.0, }; VolumeTools.get2dCoordFromTiled3dCoord(xDim, yDim, zDim, zDimSqrt, fx, fy, fz, vec2coord); const ux = Math.floor(vec2coord.x * xSize); @@ -829,7 +800,7 @@ export default class VolumeTools { const fx = cx / w; const vec2coord = { x: 0.0, - y: 0.0 + y: 0.0, }; VolumeTools.get2dCoordFromTiled3dCoord(xDim, yDim, zDim, zDimSqrt, fx, fy, fz, vec2coord); const ux = Math.floor(vec2coord.x * xSize); @@ -854,10 +825,10 @@ export default class VolumeTools { } /** - * Test int value: is this 2^N - * @param {number} val - tested value - * @return {boolean} Is power of 2 or not - */ + * Test int value: is this 2^N + * @param {number} val - tested value + * @return {boolean} Is power of 2 or not + */ static isPowerOfTwo(val) { const MAX_PWR = 31; for (let i = 1; i < MAX_PWR; i++) { @@ -870,10 +841,10 @@ export default class VolumeTools { } /** - * Get closest power of 2: greater or equal then imput argument - * @param {number} val - tested value - * @return {number} Closest (greater or equal) power of two - */ + * Get closest power of 2: greater or equal then imput argument + * @param {number} val - tested value + * @return {number} Closest (greater or equal) power of two + */ static getGreatOrEqualPowerOfTwo(val) { const MAX_PWR = 31; for (let i = 1; i < MAX_PWR; i++) { @@ -882,7 +853,7 @@ export default class VolumeTools { return val; } const vpwrNext = 1 << (i + 1); - if ((val > vpwr) && (val < vpwrNext)) { + if (val > vpwr && val < vpwrNext) { return vpwrNext; } } @@ -890,10 +861,10 @@ export default class VolumeTools { } /** - * Get closest power of 2: less or equal then imput argument - * @param {number} val - tested value - * @return {number} Closest (less or equal) power of two - */ + * Get closest power of 2: less or equal then imput argument + * @param {number} val - tested value + * @return {number} Closest (less or equal) power of two + */ static getLessOrEqualPowerOfTwo(val) { const MAX_PWR = 31; for (let i = MAX_PWR; i > 0; i--) { @@ -902,7 +873,7 @@ export default class VolumeTools { return val; } const vpwrLess = 1 << (i - 1); - if ((val > vpwrLess) && (val < vpwr)) { + if (val > vpwrLess && val < vpwr) { return vpwrLess; } } @@ -910,15 +881,15 @@ export default class VolumeTools { } /** - * Make texture size equal to power of 2 for x, y dimensions - * @param {array} pixelsSrc - source volume pixels - * @param {number} xDimSrc - volume size on x - * @param {number} yDimSrc - volume size on y - * @param {number} zDimSrc - volume size on z - * @param {number} xDimDst - new x dimension - * @param {number} yDimDst - new y dimension - * @return {array} new array - */ + * Make texture size equal to power of 2 for x, y dimensions + * @param {array} pixelsSrc - source volume pixels + * @param {number} xDimSrc - volume size on x + * @param {number} yDimSrc - volume size on y + * @param {number} zDimSrc - volume size on z + * @param {number} xDimDst - new x dimension + * @param {number} yDimDst - new y dimension + * @return {array} new array + */ static makeTextureSizePowerOfTwoUp(pixelsSrc, xDimSrc, yDimSrc, zDimSrc, xDimDst, yDimDst) { const zDimDst = zDimSrc; const HALF = 2; @@ -928,12 +899,12 @@ export default class VolumeTools { if (yDimDst < yDimSrc) { console.log(`Error: ${yDimDst} < ${yDimSrc}`); } - const xShift = Math.floor((xDimDst - xDimSrc) / HALF); - const yShift = Math.floor((yDimDst - yDimSrc) / HALF); + const xShift = Math.floor((xDimDst - xDimSrc) / HALF); + const yShift = Math.floor((yDimDst - yDimSrc) / HALF); const numPixelsSrc = xDimSrc * yDimSrc * zDimSrc; const numBytesPerPixel = Math.floor(pixelsSrc.length / numPixelsSrc); const FOUR = 4; - if ((numBytesPerPixel !== 1) && (numBytesPerPixel !== FOUR)) { + if (numBytesPerPixel !== 1 && numBytesPerPixel !== FOUR) { console.log(`Error source volume bpp: = ${xDimSrc} * ${yDimSrc} * ${zDimSrc}, bpp = ${numBytesPerPixel}`); } const numPixelsDst = xDimDst * yDimDst * zDimDst * numBytesPerPixel; @@ -995,15 +966,15 @@ export default class VolumeTools { /** * - * Make texture size equal to power of 2 for x, y dimensions - * @param {array} pixelsSrc - source volume pixels - * @param {number} xDimSrc - volume size on x - * @param {number} yDimSrc - volume size on y - * @param {number} zDimSrc - volume size on z - * @param {number} xDimDst - new x dimension - * @param {number} yDimDst - new y dimension - * @return {array} new array - */ + * Make texture size equal to power of 2 for x, y dimensions + * @param {array} pixelsSrc - source volume pixels + * @param {number} xDimSrc - volume size on x + * @param {number} yDimSrc - volume size on y + * @param {number} zDimSrc - volume size on z + * @param {number} xDimDst - new x dimension + * @param {number} yDimDst - new y dimension + * @return {array} new array + */ static makeTextureSizePowerOfTwoDown(pixelsSrc, xDimSrc, yDimSrc, zDimSrc, xDimDst, yDimDst) { const zDimDst = zDimSrc; if (xDimDst >= xDimSrc) { @@ -1017,7 +988,7 @@ export default class VolumeTools { const numPixelsSrc = xDimSrc * yDimSrc * zDimSrc; const numBytesPerPixel = Math.floor(pixelsSrc.length / numPixelsSrc); const FOUR = 4; - if ((numBytesPerPixel !== 1) && (numBytesPerPixel !== FOUR)) { + if (numBytesPerPixel !== 1 && numBytesPerPixel !== FOUR) { console.log(`Error source volume bpp: = ${xDimSrc} * ${yDimSrc} * ${zDimSrc}, bpp = ${numBytesPerPixel}`); } const numPixelsDst = xDimDst * yDimDst * zDimDst * numBytesPerPixel; @@ -1031,23 +1002,22 @@ export default class VolumeTools { for (let z = 0; z < zDimDst; z++) { const zOffSrc = z * xDimSrc * yDimSrc; for (let y = 0; y < yDimDst; y++) { - const ySrcMin = Math.floor((y + 0) * yScale); const ySrcMax = Math.floor((y + 1) * yScale); for (let x = 0; x < xDimDst; x++) { - const xSrcMin = Math.floor((x + 0) * xScale); const xSrcMax = Math.floor((x + 1) * xScale); - let val = 0; let numPix = 0; + let val = 0; + let numPix = 0; for (let ySrc = ySrcMin; ySrc < ySrcMax; ySrc++) { for (let xSrc = xSrcMin; xSrc < xSrcMax; xSrc++) { - const offSrc = zOffSrc + (ySrc * xDimSrc) + xSrc; + const offSrc = zOffSrc + ySrc * xDimSrc + xSrc; val += pixelsSrc[offSrc]; numPix++; - } // for xSrc - } // for ySrc + } // for xSrc + } // for ySrc val /= numPix; pixelsDst[offDst] = val; offDst++; @@ -1058,29 +1028,32 @@ export default class VolumeTools { for (let z = 0; z < zDimDst; z++) { const zOffSrc = z * xDimSrc * yDimSrc; for (let y = 0; y < yDimDst; y++) { - const ySrcMin = Math.floor((y + 0) * yScale); const ySrcMax = Math.floor((y + 1) * yScale); for (let x = 0; x < xDimDst; x++, offDst++) { - const xSrcMin = Math.floor((x + 0) * xScale); const xSrcMax = Math.floor((x + 1) * xScale); - let valA = 0; let valR = 0; - let valG = 0; let valB = 0; + let valA = 0; + let valR = 0; + let valG = 0; + let valB = 0; let numPix = 0; for (let ySrc = ySrcMin; ySrc < ySrcMax; ySrc++) { for (let xSrc = xSrcMin; xSrc < xSrcMax; xSrc++) { - let offSrc = (zOffSrc + (ySrc * xDimSrc) + xSrc) * FOUR; - valB += pixelsSrc[offSrc]; offSrc++; - valG += pixelsSrc[offSrc]; offSrc++; - valR += pixelsSrc[offSrc]; offSrc++; + let offSrc = (zOffSrc + ySrc * xDimSrc + xSrc) * FOUR; + valB += pixelsSrc[offSrc]; + offSrc++; + valG += pixelsSrc[offSrc]; + offSrc++; + valR += pixelsSrc[offSrc]; + offSrc++; valA += pixelsSrc[offSrc]; numPix++; - } // for xSrc - } // for ySrc + } // for xSrc + } // for ySrc valB /= numPix; valG /= numPix; valR /= numPix; @@ -1093,7 +1066,6 @@ export default class VolumeTools { offDst++; pixelsDst[offDst] = valA; offDst++; - } // for (x) source } // for (y) source } // for (z) source @@ -1137,15 +1109,15 @@ export default class VolumeTools { } /** - * Scan volume for non-empty box (with non-zero voxels) - * fill resul in [0..1] range. Use 8 as "black" color barrier - * @param {array} pixelsSrc - source volume pixels - * @param {number} xDim - volume size on x - * @param {number} yDim - volume size on y - * @param {number} zDim - volume size on z - * @param {number} boxMin - Object (x,y,z) with minumim non-empty box coords - * @param {number} boxMax - Object (x,y,z) with maximum non-empty box coords - */ + * Scan volume for non-empty box (with non-zero voxels) + * fill resul in [0..1] range. Use 8 as "black" color barrier + * @param {array} pixelsSrc - source volume pixels + * @param {number} xDim - volume size on x + * @param {number} yDim - volume size on y + * @param {number} zDim - volume size on z + * @param {number} boxMin - Object (x,y,z) with minumim non-empty box coords + * @param {number} boxMax - Object (x,y,z) with maximum non-empty box coords + */ static detectNonEmptyBox(pixelsSrc, xDim, yDim, zDim, boxMin, boxMax) { const MIN_VAL_BARRIER = 8; const TWICE = 2; @@ -1167,11 +1139,11 @@ export default class VolumeTools { const numBytesPerPixel = Math.floor(pixelsSrc.length / (xDim * yDim * zDim)); if (numBytesPerPixel === 1) { isEmpty = true; - for (x = 0; (x < xDimHalf) && isEmpty; x++) { + for (x = 0; x < xDimHalf && isEmpty; x++) { // check is empty plane - for (y = 0; (y < yDim) && (isEmpty); y++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; + for (y = 0; y < yDim && isEmpty; y++) { + for (z = 0; z < zDim && isEmpty; z++) { + const off = z * xyDim + y * xDim + x; if (pixelsSrc[off] > MIN_VAL_BARRIER) { isEmpty = false; } @@ -1181,11 +1153,11 @@ export default class VolumeTools { xBorderMin = x; isEmpty = true; - for (x = xDim - 1; (x > xDimHalf) && (isEmpty); x--) { + for (x = xDim - 1; x > xDimHalf && isEmpty; x--) { // check is empty plane - for (y = 0; (y < yDim) && (isEmpty); y++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; + for (y = 0; y < yDim && isEmpty; y++) { + for (z = 0; z < zDim && isEmpty; z++) { + const off = z * xyDim + y * xDim + x; if (pixelsSrc[off] > MIN_VAL_BARRIER) { isEmpty = false; } @@ -1195,11 +1167,11 @@ export default class VolumeTools { xBorderMax = x; isEmpty = true; - for (y = 0; (y < yDimHalf) && (isEmpty); y++) { + for (y = 0; y < yDimHalf && isEmpty; y++) { // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; + for (x = 0; x < xDim && isEmpty; x++) { + for (z = 0; z < zDim && isEmpty; z++) { + const off = z * xyDim + y * xDim + x; if (pixelsSrc[off] > MIN_VAL_BARRIER) { isEmpty = false; } @@ -1209,11 +1181,11 @@ export default class VolumeTools { yBorderMin = y; isEmpty = true; - for (y = yDim - 1; (y > yDimHalf) && (isEmpty); y--) { + for (y = yDim - 1; y > yDimHalf && isEmpty; y--) { // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; + for (x = 0; x < xDim && isEmpty; x++) { + for (z = 0; z < zDim && isEmpty; z++) { + const off = z * xyDim + y * xDim + x; if (pixelsSrc[off] > MIN_VAL_BARRIER) { isEmpty = false; } @@ -1223,11 +1195,11 @@ export default class VolumeTools { yBorderMax = y; isEmpty = true; - for (z = 0; (z < zDimHalf) && (isEmpty); z++) { + for (z = 0; z < zDimHalf && isEmpty; z++) { // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (y = 0; (y < yDim) && (isEmpty); y++) { - const off = (z * xyDim) + (y * xDim) + x; + for (x = 0; x < xDim && isEmpty; x++) { + for (y = 0; y < yDim && isEmpty; y++) { + const off = z * xyDim + y * xDim + x; if (pixelsSrc[off] > MIN_VAL_BARRIER) { isEmpty = false; } @@ -1237,11 +1209,11 @@ export default class VolumeTools { zBorderMin = z; isEmpty = true; - for (z = zDim - 1; (z > zDimHalf) && (isEmpty); z--) { + for (z = zDim - 1; z > zDimHalf && isEmpty; z--) { // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (y = 0; (y < yDim) && (isEmpty); y++) { - const off = (z * xyDim) + (y * xDim) + x; + for (x = 0; x < xDim && isEmpty; x++) { + for (y = 0; y < yDim && isEmpty; y++) { + const off = z * xyDim + y * xDim + x; if (pixelsSrc[off] > MIN_VAL_BARRIER) { isEmpty = false; } @@ -1253,11 +1225,11 @@ export default class VolumeTools { // 4 bpp image scan const OFF_3 = 3; isEmpty = true; - for (x = 0; (x < xDimHalf) && isEmpty; x++) { + for (x = 0; x < xDimHalf && isEmpty; x++) { // check is empty plane - for (y = 0; (y < yDim) && (isEmpty); y++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; + for (y = 0; y < yDim && isEmpty; y++) { + for (z = 0; z < zDim && isEmpty; z++) { + const off = z * xyDim + y * xDim + x; if (pixelsSrc[off * FOUR + OFF_3] > MIN_VAL_BARRIER) { isEmpty = false; } @@ -1267,11 +1239,11 @@ export default class VolumeTools { xBorderMin = x; isEmpty = true; - for (x = xDim - 1; (x > xDimHalf) && (isEmpty); x--) { + for (x = xDim - 1; x > xDimHalf && isEmpty; x--) { // check is empty plane - for (y = 0; (y < yDim) && (isEmpty); y++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; + for (y = 0; y < yDim && isEmpty; y++) { + for (z = 0; z < zDim && isEmpty; z++) { + const off = z * xyDim + y * xDim + x; if (pixelsSrc[off * FOUR + OFF_3] > MIN_VAL_BARRIER) { isEmpty = false; } @@ -1281,11 +1253,11 @@ export default class VolumeTools { xBorderMax = x; isEmpty = true; - for (y = 0; (y < yDimHalf) && (isEmpty); y++) { + for (y = 0; y < yDimHalf && isEmpty; y++) { // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; + for (x = 0; x < xDim && isEmpty; x++) { + for (z = 0; z < zDim && isEmpty; z++) { + const off = z * xyDim + y * xDim + x; if (pixelsSrc[off * FOUR + OFF_3] > MIN_VAL_BARRIER) { isEmpty = false; } @@ -1295,11 +1267,11 @@ export default class VolumeTools { yBorderMin = y; isEmpty = true; - for (y = yDim - 1; (y > yDimHalf) && (isEmpty); y--) { + for (y = yDim - 1; y > yDimHalf && isEmpty; y--) { // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (z = 0; (z < zDim) && (isEmpty); z++) { - const off = (z * xyDim) + (y * xDim) + x; + for (x = 0; x < xDim && isEmpty; x++) { + for (z = 0; z < zDim && isEmpty; z++) { + const off = z * xyDim + y * xDim + x; if (pixelsSrc[off * FOUR + OFF_3] > MIN_VAL_BARRIER) { isEmpty = false; } @@ -1309,11 +1281,11 @@ export default class VolumeTools { yBorderMax = y; isEmpty = true; - for (z = 0; (z < zDimHalf) && (isEmpty); z++) { + for (z = 0; z < zDimHalf && isEmpty; z++) { // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (y = 0; (y < yDim) && (isEmpty); y++) { - const off = (z * xyDim) + (y * xDim) + x; + for (x = 0; x < xDim && isEmpty; x++) { + for (y = 0; y < yDim && isEmpty; y++) { + const off = z * xyDim + y * xDim + x; if (pixelsSrc[off * FOUR + OFF_3] > MIN_VAL_BARRIER) { isEmpty = false; } @@ -1323,11 +1295,11 @@ export default class VolumeTools { zBorderMin = z; isEmpty = true; - for (z = zDim - 1; (z > zDimHalf) && (isEmpty); z--) { + for (z = zDim - 1; z > zDimHalf && isEmpty; z--) { // check is empty plane - for (x = 0; (x < xDim) && (isEmpty); x++) { - for (y = 0; (y < yDim) && (isEmpty); y++) { - const off = (z * xyDim) + (y * xDim) + x; + for (x = 0; x < xDim && isEmpty; x++) { + for (y = 0; y < yDim && isEmpty; y++) { + const off = z * xyDim + y * xDim + x; if (pixelsSrc[off * FOUR + OFF_3] > MIN_VAL_BARRIER) { isEmpty = false; } @@ -1343,7 +1315,6 @@ export default class VolumeTools { boxMax.y = yBorderMax / yDim; boxMax.z = zBorderMax / zDim; } - } // class VolumeTools VolumeTools.VOLTOOLS_ERROR_OK = 1; diff --git a/src/demo/engine/orbitcontrol.js b/src/engine/orbitcontrol.js similarity index 89% rename from src/demo/engine/orbitcontrol.js rename to src/engine/orbitcontrol.js index 89dd8c67..f572ead5 100644 --- a/src/demo/engine/orbitcontrol.js +++ b/src/engine/orbitcontrol.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Orbit control -* @module lib/scripts/controls/orbitcontrol -*/ + * Orbit control + * @module lib/scripts/controls/orbitcontrol + */ // ****************************************************************** // imports @@ -35,7 +21,7 @@ import * as THREE from 'three'; const CONTROL_CAMERA_MIN_ZOOM = 0.3; const CONTROL_CAMERA_MAX_ZOOM = 2.5; const CONTROL_CAMERA_ROTATION_SPEED = 0.008; -const CONTROL_CAMERA_ZOOM_SPEED = 0.2; +const CONTROL_CAMERA_ZOOM_SPEED = 0.5; // ****************************************************************** // class @@ -43,11 +29,10 @@ const CONTROL_CAMERA_ZOOM_SPEED = 0.2; /** Class Graphics2d is used for simple debug style 2d render */ export default class OrbitControl { - /** - * Initialize render - * @return {Object} Intsance of this class (singleton) - */ + * Initialize render + * @return {Object} Intsance of this class (singleton) + */ constructor(domElem, camera, scene, mesh, meshRotationCallback) { this.m_callback = meshRotationCallback; this.m_mesh = mesh; @@ -118,7 +103,7 @@ export default class OrbitControl { } // time update const curTimeMs = new Date().getTime(); - this.m_prevTime = (this.m_prevTime > 0) ? this.m_prevTime : curTimeMs; + this.m_prevTime = this.m_prevTime > 0 ? this.m_prevTime : curTimeMs; this.m_deltaTime = curTimeMs - this.m_prevTime; this.m_prevTime = curTimeMs; if (!this.m_mesh) { @@ -153,7 +138,7 @@ export default class OrbitControl { this.m_prevMouse = { x: xMouse, y: yMouse }; this.m_spherical.set(0, 0, 0); this.m_sphericalDelta.set(0, 0, 0); - this.m_prevTime = new Date().getTime();// -1; + this.m_prevTime = new Date().getTime(); // -1; this.ctrlKey = ctrlKey; } @@ -288,7 +273,6 @@ export default class OrbitControl { this.m_camera.lookAt(this.m_target); this.m_camera.updateMatrixWorld(); } - } // class OrbitControl.EVENT_BUTTON_NA = -1; diff --git a/src/demo/engine/savers/SaverNifti.js b/src/engine/savers/SaverNifti.js similarity index 89% rename from src/demo/engine/savers/SaverNifti.js rename to src/engine/savers/SaverNifti.js index b99ab150..afbbc4ab 100644 --- a/src/demo/engine/savers/SaverNifti.js +++ b/src/engine/savers/SaverNifti.js @@ -1,3 +1,8 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview SaverNifti * @author Epam @@ -33,25 +38,22 @@ class SaverNifti { } static fpsToDimInfo(freq, phase, slice) { - const res = (freq & 0x3) | - ((phase & 0x3) << 2) | - ((slice & 0x3) << 4); + const res = (freq & 0x3) | ((phase & 0x3) << 2) | ((slice & 0x3) << 4); return res; } /** - * Write nifti file data to buffer array - * @param {object} volumeData - array of intensities (uint8) - * @param {object} volumeSize - pixel and physical size - * @return {Object} ArrayBuffer with file content - */ + * Write nifti file data to buffer array + * @param {object} volumeData - array of intensities (uint8) + * @param {object} volumeSize - pixel and physical size + * @return {Object} ArrayBuffer with file content + */ static writeBuffer(volumeData, volumeSize) { - // check input data const xDim = volumeSize.x; const yDim = volumeSize.y; const zDim = volumeSize.z; - if ((xDim <= 0) || (yDim <= 0) || (zDim <= 0)) { + if (xDim <= 0 || yDim <= 0 || zDim <= 0) { console.log(`SaverNifti. volume pixels dim is bad: ${xDim} * ${yDim} * ${zDim} `); } const xGrid = volumeSize.pixdim1; @@ -59,10 +61,10 @@ class SaverNifti { const zGrid = volumeSize.pixdim3; const TOO_MUCH = 5.0; const TOO_MIN = 0.00001; - if ((xGrid > TOO_MUCH) || (yGrid > TOO_MUCH) || (zGrid > TOO_MUCH)) { + if (xGrid > TOO_MUCH || yGrid > TOO_MUCH || zGrid > TOO_MUCH) { console.log(`SaverNifti. volume grid size is too much: ${xGrid} * ${yGrid} * ${zGrid} `); } - if ((xGrid < TOO_MIN) || (yGrid < TOO_MIN) || (zGrid < TOO_MIN)) { + if (xGrid < TOO_MIN || yGrid < TOO_MIN || zGrid < TOO_MIN) { console.log(`SaverNifti. volume grid size is too min: ${xGrid} * ${yGrid} * ${zGrid} `); } if (volumeData.length !== xDim * yDim * zDim) { @@ -74,8 +76,8 @@ class SaverNifti { let valMax = TOO_SMALL_VAL; const numPixels = xDim * yDim * zDim; for (let i = 0; i < numPixels; i++) { - valMin = (volumeData[i] < valMin) ? volumeData[i] : valMin; - valMax = (volumeData[i] > valMax) ? volumeData[i] : valMax; + valMin = volumeData[i] < valMin ? volumeData[i] : valMin; + valMax = volumeData[i] > valMax ? volumeData[i] : valMax; } const TOO_MIN_RANGE = 60; if (valMax - valMin < TOO_MIN_RANGE) { diff --git a/src/demo/engine/shaders/backface.frag b/src/engine/shaders/backface.frag similarity index 100% rename from src/demo/engine/shaders/backface.frag rename to src/engine/shaders/backface.frag diff --git a/src/demo/engine/shaders/backface.vert b/src/engine/shaders/backface.vert similarity index 100% rename from src/demo/engine/shaders/backface.vert rename to src/engine/shaders/backface.vert diff --git a/src/demo/engine/shaders/blur.frag b/src/engine/shaders/blur.frag similarity index 100% rename from src/demo/engine/shaders/blur.frag rename to src/engine/shaders/blur.frag diff --git a/src/demo/engine/shaders/blur.vert b/src/engine/shaders/blur.vert similarity index 100% rename from src/demo/engine/shaders/blur.vert rename to src/engine/shaders/blur.vert diff --git a/src/demo/engine/shaders/clipplane.frag b/src/engine/shaders/clipplane.frag similarity index 100% rename from src/demo/engine/shaders/clipplane.frag rename to src/engine/shaders/clipplane.frag diff --git a/src/demo/engine/shaders/clipplane.vert b/src/engine/shaders/clipplane.vert similarity index 100% rename from src/demo/engine/shaders/clipplane.vert rename to src/engine/shaders/clipplane.vert diff --git a/src/demo/engine/shaders/createAO.frag b/src/engine/shaders/createAO.frag similarity index 100% rename from src/demo/engine/shaders/createAO.frag rename to src/engine/shaders/createAO.frag diff --git a/src/demo/engine/shaders/createAO.vert b/src/engine/shaders/createAO.vert similarity index 100% rename from src/demo/engine/shaders/createAO.vert rename to src/engine/shaders/createAO.vert diff --git a/src/demo/engine/shaders/frontface.frag b/src/engine/shaders/frontface.frag similarity index 100% rename from src/demo/engine/shaders/frontface.frag rename to src/engine/shaders/frontface.frag diff --git a/src/demo/engine/shaders/frontface.vert b/src/engine/shaders/frontface.vert similarity index 100% rename from src/demo/engine/shaders/frontface.vert rename to src/engine/shaders/frontface.vert diff --git a/src/demo/engine/shaders/interpolation.frag b/src/engine/shaders/interpolation.frag similarity index 100% rename from src/demo/engine/shaders/interpolation.frag rename to src/engine/shaders/interpolation.frag diff --git a/src/demo/engine/shaders/interpolation.vert b/src/engine/shaders/interpolation.vert similarity index 100% rename from src/demo/engine/shaders/interpolation.vert rename to src/engine/shaders/interpolation.vert diff --git a/src/demo/engine/shaders/rendertotexture.frag b/src/engine/shaders/rendertotexture.frag similarity index 100% rename from src/demo/engine/shaders/rendertotexture.frag rename to src/engine/shaders/rendertotexture.frag diff --git a/src/demo/engine/shaders/rendertotexture.vert b/src/engine/shaders/rendertotexture.vert similarity index 100% rename from src/demo/engine/shaders/rendertotexture.vert rename to src/engine/shaders/rendertotexture.vert diff --git a/src/demo/engine/shaders/ssao.frag b/src/engine/shaders/ssao.frag similarity index 100% rename from src/demo/engine/shaders/ssao.frag rename to src/engine/shaders/ssao.frag diff --git a/src/demo/engine/shaders/ssao.vert b/src/engine/shaders/ssao.vert similarity index 100% rename from src/demo/engine/shaders/ssao.vert rename to src/engine/shaders/ssao.vert diff --git a/src/demo/engine/shaders/volumerender.frag b/src/engine/shaders/volumerender.frag similarity index 100% rename from src/demo/engine/shaders/volumerender.frag rename to src/engine/shaders/volumerender.frag diff --git a/src/demo/engine/shaders/volumerender.vert b/src/engine/shaders/volumerender.vert similarity index 100% rename from src/demo/engine/shaders/volumerender.vert rename to src/engine/shaders/volumerender.vert diff --git a/src/demo/engine/shaders/wirecull.frag b/src/engine/shaders/wirecull.frag similarity index 100% rename from src/demo/engine/shaders/wirecull.frag rename to src/engine/shaders/wirecull.frag diff --git a/src/demo/engine/shaders/wirecull.vert b/src/engine/shaders/wirecull.vert similarity index 100% rename from src/demo/engine/shaders/wirecull.vert rename to src/engine/shaders/wirecull.vert diff --git a/src/demo/engine/tools23d/angletool.js b/src/engine/tools23d/angletool.js similarity index 55% rename from src/demo/engine/tools23d/angletool.js rename to src/engine/tools23d/angletool.js index 657785da..4c04128c 100644 --- a/src/demo/engine/tools23d/angletool.js +++ b/src/engine/tools23d/angletool.js @@ -1,21 +1,7 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 2d angle tool @@ -112,8 +98,15 @@ export default class AngleTool { const line2 = new Line2D(this.m_scene, this.m_lineWidth, x1, y1, x3, y3, this.m_linesMaterial); this.m_angles[i].line1 = line1; this.m_angles[i].line2 = line2; - this.m_angles[i].text.updateText(x1, y1, this.m_textWidthScr, - MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + this.m_angles[i].text.updateText( + x1, + y1, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_CENTER, + this.m_textBgColor, + this.m_textColor + ); this.m_scene.add(this.m_angles[i].text); } } @@ -127,43 +120,42 @@ export default class AngleTool { const xZ = (x + (1 - 1 / zoom)) * zoom + posX; const yZ = (y - (1 - 1 / zoom)) * zoom + posY; switch (this.m_state) { - case angleToolState.WAITING: - this.m_xStart = x; - this.m_yStart = y; + case angleToolState.WAITING: + this.m_xStart = x; + this.m_yStart = y; - const line1 = new Line2D(this.m_scene, this.m_lineWidth, x, y, x, y, this.m_linesMaterial); - const line2 = new Line2D(this.m_scene, this.m_lineWidth, x, y, x, y, this.m_linesMaterial); - const strMsg = '0°'; - const text = new MeshText2D(strMsg); - text.updateText(x, y, this.m_textWidthScr, MeshText2D.ALIGN_CENTER, - MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); - this.m_scene.add(text); - this.m_angles.push({ line1, line2, text }); - this.m_vertexes.push({ xZ, yZ }); - this.m_state = angleToolState.FIRST_LINE; - break; - case angleToolState.FIRST_LINE: - // check pushed line has non-zero length - const dx = x - this.m_xStart; - const dy = y - this.m_yStart; - const ESTIMATED_MIN_SCREEN_SIZE = 400.0; - const MIN_PIXELS_DIST = 1.0 / ESTIMATED_MIN_SCREEN_SIZE; - if (dx * dx + dy * dy > MIN_PIXELS_DIST * MIN_PIXELS_DIST) { - this.m_state = angleToolState.SECOND_LINE; - } - this.m_vertexes.push({ xZ, yZ }); - break; - case angleToolState.SECOND_LINE: - this.m_xStart = -1; - this.m_yStart = -1; - this.m_firstVector.x = 0; - this.m_firstVector.y = 0; - this.m_state = angleToolState.WAITING; - this.m_vertexes.push({ xZ, yZ }); - break; - default: - console.log('Unexpected angle tool state'); - break; + const line1 = new Line2D(this.m_scene, this.m_lineWidth, x, y, x, y, this.m_linesMaterial); + const line2 = new Line2D(this.m_scene, this.m_lineWidth, x, y, x, y, this.m_linesMaterial); + const strMsg = '0°'; + const text = new MeshText2D(strMsg); + text.updateText(x, y, this.m_textWidthScr, MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + this.m_scene.add(text); + this.m_angles.push({ line1, line2, text }); + this.m_vertexes.push({ xZ, yZ }); + this.m_state = angleToolState.FIRST_LINE; + break; + case angleToolState.FIRST_LINE: + // check pushed line has non-zero length + const dx = x - this.m_xStart; + const dy = y - this.m_yStart; + const ESTIMATED_MIN_SCREEN_SIZE = 400.0; + const MIN_PIXELS_DIST = 1.0 / ESTIMATED_MIN_SCREEN_SIZE; + if (dx * dx + dy * dy > MIN_PIXELS_DIST * MIN_PIXELS_DIST) { + this.m_state = angleToolState.SECOND_LINE; + } + this.m_vertexes.push({ xZ, yZ }); + break; + case angleToolState.SECOND_LINE: + this.m_xStart = -1; + this.m_yStart = -1; + this.m_firstVector.x = 0; + this.m_firstVector.y = 0; + this.m_state = angleToolState.WAITING; + this.m_vertexes.push({ xZ, yZ }); + break; + default: + console.log('Unexpected angle tool state'); + break; } // end switch } @@ -175,49 +167,60 @@ export default class AngleTool { onMouseMove(x, y) { let angle = null; switch (this.m_state) { - case angleToolState.WAITING: - break; - case angleToolState.FIRST_LINE: { - angle = this.m_angles.pop(); - this.m_scene.remove(angle.line1.getRenderObject()); - const line1 = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, this.m_yStart, x, y, - this.m_linesMaterial); - this.m_firstVector.x = x - this.m_xStart; - this.m_firstVector.y = y - this.m_yStart; - angle.line1 = line1; - this.m_angles.push(angle); - break; - } - case angleToolState.SECOND_LINE: { - const len1 = Math.sqrt(this.m_firstVector.x * this.m_firstVector.x + - this.m_firstVector.y * this.m_firstVector.y); - const len2 = Math.sqrt((x - this.m_xStart) * (x - this.m_xStart) + (y - this.m_yStart) * (y - this.m_yStart)); - // check both lines are too small - const TOO_SMALL_VEC_LEN_MULT = 1.0e-5; - if (len1 * len2 < TOO_SMALL_VEC_LEN_MULT) { + case angleToolState.WAITING: + break; + case angleToolState.FIRST_LINE: { + angle = this.m_angles.pop(); + this.m_scene.remove(angle.line1.getRenderObject()); + const line1 = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, this.m_yStart, x, y, this.m_linesMaterial); + this.m_firstVector.x = x - this.m_xStart; + this.m_firstVector.y = y - this.m_yStart; + angle.line1 = line1; + this.m_angles.push(angle); break; } - angle = this.m_angles.pop(); - this.m_scene.remove(angle.line2.getRenderObject()); - const line2 = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, this.m_yStart, x, y, - this.m_linesMaterial); - this.m_scene.remove(angle.text); - const strMsg = `${(Math.acos((this.m_firstVector.x * (x - this.m_xStart) + - // eslint-disable-next-line - this.m_firstVector.y * (y - this.m_yStart)) / (len1 * len2)) / Math.PI * 180).toFixed(2)}°`; - const text = new MeshText2D(strMsg); - const Y_SHIFT_UP = 0.02; - text.updateText(this.m_xStart, this.m_yStart - Y_SHIFT_UP, this.m_textWidthScr, MeshText2D.ALIGN_CENTER, - MeshText2D.ALIGN_TOP, this.m_textBgColor, this.m_textColor); - this.m_scene.add(text); - angle.line2 = line2; - angle.text = text; - this.m_angles.push(angle); - break; - } - default: - console.log('Unexpected angle tool state'); - break; + case angleToolState.SECOND_LINE: { + const len1 = Math.sqrt(this.m_firstVector.x * this.m_firstVector.x + this.m_firstVector.y * this.m_firstVector.y); + const len2 = Math.sqrt((x - this.m_xStart) * (x - this.m_xStart) + (y - this.m_yStart) * (y - this.m_yStart)); + // check both lines are too small + const TOO_SMALL_VEC_LEN_MULT = 1.0e-5; + if (len1 * len2 < TOO_SMALL_VEC_LEN_MULT) { + break; + } + angle = this.m_angles.pop(); + this.m_scene.remove(angle.line2.getRenderObject()); + const line2 = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, this.m_yStart, x, y, this.m_linesMaterial); + this.m_scene.remove(angle.text); + const strMsg = `${( + (Math.acos( + (this.m_firstVector.x * (x - this.m_xStart) + + // eslint-disable-next-line + this.m_firstVector.y * (y - this.m_yStart)) / + (len1 * len2) + ) / + Math.PI) * + 180 + ).toFixed(2)}°`; + const text = new MeshText2D(strMsg); + const Y_SHIFT_UP = 0.02; + text.updateText( + this.m_xStart, + this.m_yStart - Y_SHIFT_UP, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_TOP, + this.m_textBgColor, + this.m_textColor + ); + this.m_scene.add(text); + angle.line2 = line2; + angle.text = text; + this.m_angles.push(angle); + break; + } + default: + console.log('Unexpected angle tool state'); + break; } // end switch } diff --git a/src/demo/engine/tools23d/areatool.js b/src/engine/tools23d/areatool.js similarity index 79% rename from src/demo/engine/tools23d/areatool.js rename to src/engine/tools23d/areatool.js index 0ffbe7bb..68b7515a 100644 --- a/src/demo/engine/tools23d/areatool.js +++ b/src/engine/tools23d/areatool.js @@ -1,21 +1,7 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 2d area tool @@ -115,8 +101,15 @@ export default class AreaTool { const line = new Line2D(this.m_scene, this.m_lineWidth, xS, yS, xE, yE, this.m_linesMaterial); this.m_distances[i].line = line; if (this.m_distances[i].text != null) { - this.m_distances[i].text.updateText(0.5 * (xS + xE) - 0.00, 0.5 * (yS + yE) - 0.00, this.m_textWidthScr, - MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + this.m_distances[i].text.updateText( + 0.5 * (xS + xE) - 0.0, + 0.5 * (yS + yE) - 0.0, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_CENTER, + this.m_textBgColor, + this.m_textColor + ); this.m_scene.add(this.m_distances[i].text); } } @@ -127,7 +120,8 @@ export default class AreaTool { * @param (float) xPixelSize - canvas pixel size in mm for x axis * @param (float) yPixelSize - canvas pixel size in mm for y axis */ - setPixelSize(xPixelSize, yPixelSize) { // in mm + setPixelSize(xPixelSize, yPixelSize) { + // in mm this.m_xPixelSize = xPixelSize; this.m_yPixelSize = yPixelSize; } @@ -149,10 +143,14 @@ export default class AreaTool { * @return {Array} coordinate point of intersection and information about the belonging point of a straight line */ lineIntersect(point1, point2, point3, point4) { - const x1 = point1.x, y1 = point1.y; - const x2 = point2.x, y2 = point2.y; - const x3 = point3.x, y3 = point3.y; - const x4 = point4.x, y4 = point4.y; + const x1 = point1.x, + y1 = point1.y; + const x2 = point2.x, + y2 = point2.y; + const x3 = point3.x, + y3 = point3.y; + const x4 = point4.x, + y4 = point4.y; const denom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1); if (denom === 0 || (x2 === x3 && y2 === y3)) { return null; @@ -167,7 +165,7 @@ export default class AreaTool { x, y, seg1, - seg2 + seg2, }; } @@ -186,10 +184,14 @@ export default class AreaTool { sum1 += this.m_vertexes[i].x * this.m_vertexes[i + 1].y * this.m_xPixelSize * this.m_yPixelSize; sum2 += this.m_vertexes[i + 1].x * this.m_vertexes[i].y * this.m_xPixelSize * this.m_yPixelSize; } - result = (0.5 * Math.abs(sum1 - + this.m_vertexes[length - 1].x * this.m_vertexes[this.last_length].y * this.m_xPixelSize * this.m_yPixelSize - - sum2 - this.m_vertexes[this.last_length].x * this.m_vertexes[length - 1].y - * this.m_xPixelSize * this.m_yPixelSize)); + result = + 0.5 * + Math.abs( + sum1 + + this.m_vertexes[length - 1].x * this.m_vertexes[this.last_length].y * this.m_xPixelSize * this.m_yPixelSize - + sum2 - + this.m_vertexes[this.last_length].x * this.m_vertexes[length - 1].y * this.m_xPixelSize * this.m_yPixelSize + ); const endl = length - 1; const begin = this.last_length; @@ -209,12 +211,18 @@ export default class AreaTool { * @param (float) yText - y coordinate of text */ drawLine(vertex1, vertex2, str, xText, yText) { - const line = new Line2D(this.m_scene, this.m_lineWidth, - vertex1.x, vertex1.y, vertex2.x, vertex2.y, this.m_linesMaterial); + const line = new Line2D(this.m_scene, this.m_lineWidth, vertex1.x, vertex1.y, vertex2.x, vertex2.y, this.m_linesMaterial); const strMsg = str; const text = new MeshText2D(strMsg); - text.updateText(xText, yText, this.m_textWidthScr, - MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + text.updateText( + xText, + yText, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_CENTER, + this.m_textBgColor, + this.m_textColor + ); this.m_scene.add(text); this.m_distances.push({ line, text }); } @@ -239,7 +247,8 @@ export default class AreaTool { if (this.connect_line === true) { x = this.m_vertexes[this.last_length].x; y = this.m_vertexes[this.last_length].y; - let xText = x, yText = y; + let xText = x, + yText = y; if (x >= this.m_vertexes[this.last_length].x) { xText += INDENTATION; } else { @@ -259,8 +268,13 @@ export default class AreaTool { this.m_vertexes.pop(); length = this.m_vertexes.length; this.m_area = this.calculateArea(length) * zoom * zoom; - this.drawLine(this.m_vertexes[length - 1], this.m_vertexes[this.last_length], - `${this.m_area.toFixed(ACCURACY)} mm^2`, xText, yText); + this.drawLine( + this.m_vertexes[length - 1], + this.m_vertexes[this.last_length], + `${this.m_area.toFixed(ACCURACY)} mm^2`, + xText, + yText + ); this.m_runningState = false; this.connect_line = false; this.last_length = length; @@ -271,16 +285,22 @@ export default class AreaTool { const xE = (this.m_distances[i].line.getxE() + (1 - 1 / zoom)) * zoom + posX; const yE = (this.m_distances[i].line.getyE() - (1 - 1 / zoom)) * zoom + posY; this.m_vertexes2.push({ - xS, yS, xE, yE + xS, + yS, + xE, + yE, }); } } else { /**checking for point of intersection between new line and every line in array*/ - for (i = this.last_length; - i < (length - this.last_length - MINIMUM_LENGTH_OF_VERTEX) + this.last_length; i++) { + for (i = this.last_length; i < length - this.last_length - MINIMUM_LENGTH_OF_VERTEX + this.last_length; i++) { /** getting result of intersection*/ - const result = this.lineIntersect(this.m_vertexes[i], - this.m_vertexes[i + 1], this.m_vertexes[length - MINIMUM_LENGTH_OF_VERTEX], this.m_vertexes[length - 1]); + const result = this.lineIntersect( + this.m_vertexes[i], + this.m_vertexes[i + 1], + this.m_vertexes[length - MINIMUM_LENGTH_OF_VERTEX], + this.m_vertexes[length - 1] + ); if (result !== null) { if (result.seg1 === true && result.seg2 === true) { x = result.x; @@ -304,17 +324,30 @@ export default class AreaTool { this.m_area = this.calculateArea(length) * zoom * zoom; /**redraw lines with new coordinates and print area*/ for (i = this.last_length; i < length - 1; i++) { - this.drawLine(this.m_vertexes[i], this.m_vertexes[i + 1], ' ', - 0.5 * (this.m_vertexes[i + 1].x + this.m_vertexes[i].x) - - 0.00, 0.5 * (this.m_vertexes[i + 1].y + this.m_vertexes[i].y) - 0.00); + this.drawLine( + this.m_vertexes[i], + this.m_vertexes[i + 1], + ' ', + 0.5 * (this.m_vertexes[i + 1].x + this.m_vertexes[i].x) - 0.0, + 0.5 * (this.m_vertexes[i + 1].y + this.m_vertexes[i].y) - 0.0 + ); } /** connect first and last point*/ - this.drawLine(this.m_vertexes[length - 1], this.m_vertexes[this.last_length], ' ', - 0.5 * (this.m_vertexes[length - 1].x + this.m_vertexes[this.last_length].x) - - 0.00, 0.5 * (this.m_vertexes[length - 1].y + this.m_vertexes[this.last_length].y) - 0.00); + this.drawLine( + this.m_vertexes[length - 1], + this.m_vertexes[this.last_length], + ' ', + 0.5 * (this.m_vertexes[length - 1].x + this.m_vertexes[this.last_length].x) - 0.0, + 0.5 * (this.m_vertexes[length - 1].y + this.m_vertexes[this.last_length].y) - 0.0 + ); /** drawing size of area on screen*/ - this.drawLine(this.m_vertexes[length - 1], this.m_vertexes[this.last_length], - `${this.m_area.toFixed(ACCURACY)} mm^2`, x, y); + this.drawLine( + this.m_vertexes[length - 1], + this.m_vertexes[this.last_length], + `${this.m_area.toFixed(ACCURACY)} mm^2`, + x, + y + ); /**ending of intersection*/ this.m_runningState = false; this.last_length = length; @@ -325,7 +358,10 @@ export default class AreaTool { const xE = (this.m_distances[i].line.getxE() + (1 - 1 / zoom)) * zoom + posX; const yE = (this.m_distances[i].line.getyE() - (1 - 1 / zoom)) * zoom + posY; this.m_vertexes2.push({ - xS, yS, xE, yE + xS, + yS, + xE, + yE, }); } /** delete dublicated last line*/ @@ -367,11 +403,20 @@ export default class AreaTool { } let line = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, this.m_yStart, x, y, this.m_linesMaterial); this.m_distances.push({ line }); - if ((Math.abs(this.m_vertexes[this.last_length].x - x) < this.epsilon) && - (Math.abs(this.m_vertexes[this.last_length].y - y) < this.epsilon) && - this.m_vertexes.length > MINIMUM_LENGTH_OF_VERTEX) { - line = new Line2D(this.m_scene, this.m_lineWidth, this.m_vertexes[this.last_length].x - , this.m_vertexes[this.last_length].y, x, y, this.m_linesMaterial); + if ( + Math.abs(this.m_vertexes[this.last_length].x - x) < this.epsilon && + Math.abs(this.m_vertexes[this.last_length].y - y) < this.epsilon && + this.m_vertexes.length > MINIMUM_LENGTH_OF_VERTEX + ) { + line = new Line2D( + this.m_scene, + this.m_lineWidth, + this.m_vertexes[this.last_length].x, + this.m_vertexes[this.last_length].y, + x, + y, + this.m_linesMaterial + ); this.m_distances.push({ line }); this.connect_line = true; } @@ -390,7 +435,10 @@ export default class AreaTool { //const y = yS; //this.m_vertexes.push({ x, y }); this.m_vertexes2.push({ - xS, yS, xE, yE + xS, + yS, + xE, + yE, }); } } diff --git a/src/demo/engine/tools23d/canvastext.js b/src/engine/tools23d/canvastext.js similarity index 69% rename from src/demo/engine/tools23d/canvastext.js rename to src/engine/tools23d/canvastext.js index 6b4ab41a..78cd0934 100644 --- a/src/demo/engine/tools23d/canvastext.js +++ b/src/engine/tools23d/canvastext.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Text rendering to canvas -* @module lib/scripts/graphics2d/canvastext -*/ + * Text rendering to canvas + * @module lib/scripts/graphics2d/canvastext + */ // import * as THREE from 'three'; @@ -29,8 +15,8 @@ const FONT_FOR_TEXT_RENDER = '72px Arial'; /** Class CanvasText is used for render text to canvas via HTML5 interface */ export default class CanvasText { /** - * Initialize Canvas text renderer - */ + * Initialize Canvas text renderer + */ constructor() { this.m_textWidth = 0; this.m_textHeight = 0; @@ -68,10 +54,10 @@ export default class CanvasText { } /** - * Returns the smallest power of 2 that is greater than or equal to val. - * @param (number) val - value to search closest power of 2. - * @return {number} the smallest power of 2 that is greater than or equal to val - */ + * Returns the smallest power of 2 that is greater than or equal to val. + * @param (number) val - value to search closest power of 2. + * @return {number} the smallest power of 2 that is greater than or equal to val + */ static ceilPowerOfTwo(val) { const FAIL = -1; const MAX_PWR = 30; @@ -85,10 +71,10 @@ export default class CanvasText { } /** - * Initialize Canvas text renderer - * @param (strint) strTextToRender - text to render - * @return {Object} Canvas with rendered text - */ + * Initialize Canvas text renderer + * @param (strint) strTextToRender - text to render + * @return {Object} Canvas with rendered text + */ drawText(strTextToRender, strTextColor) { // clear screen this.m_canvas.width = 1024; @@ -105,12 +91,11 @@ export default class CanvasText { this.m_ctx.textBaseline = 'top'; this.m_ctx.lineWidth = 2; - const strText = (strTextToRender.length === 0) ? '?' : strTextToRender; + const strText = strTextToRender.length === 0 ? '?' : strTextToRender; this.m_textWidth = Math.floor(this.m_ctx.measureText(strText).width); this.m_textHeight = CanvasText.getFontHeight(FONT_FOR_TEXT_RENDER); - // set canvas size to desired dimension // this.m_canvas.width = THREE.Math.ceilPowerOfTwo(this.m_textWidth); // this.m_canvas.height = THREE.Math.ceilPowerOfTwo(this.m_textHeight); diff --git a/src/demo/engine/tools23d/circle2d.js b/src/engine/tools23d/circle2d.js similarity index 57% rename from src/demo/engine/tools23d/circle2d.js rename to src/engine/tools23d/circle2d.js index 1607b4e3..fd2da7f3 100644 --- a/src/demo/engine/tools23d/circle2d.js +++ b/src/engine/tools23d/circle2d.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Render 2d circle in scene -* @module app/scripts/graphics2d/circle2d -*/ + * Render 2d circle in scene + * @module app/scripts/graphics2d/circle2d + */ import * as THREE from 'three'; @@ -30,27 +16,24 @@ const CIRCLE_2D_Z_COORDINATE = 0.2; /** Class Circle2D is used for render circle in 2d mode */ export default class Circle2D { /** - * Constructor. Create a single circle 2d mode and add to scene on render - * @param (object) scene - Scene where object will be rendered - * @param (float) lineWidth - Line width in scale [-1..+1] - * @param (float) xCenter - Circle center, x coordinate - * @param (float) yCenter - Circle center, y coordinate - * @param (float) xRadius - Circle (ellipse) radius, x coordinate - * @param (float) yRadius - Circle (ellipse) radius, y coordinate - * @param (object) matColor2d - MaterialColor2d - */ + * Constructor. Create a single circle 2d mode and add to scene on render + * @param (object) scene - Scene where object will be rendered + * @param (float) lineWidth - Line width in scale [-1..+1] + * @param (float) xCenter - Circle center, x coordinate + * @param (float) yCenter - Circle center, y coordinate + * @param (float) xRadius - Circle (ellipse) radius, x coordinate + * @param (float) yRadius - Circle (ellipse) radius, y coordinate + * @param (object) matColor2d - MaterialColor2d + */ constructor(scene, lineWidth, xCenter, yCenter, xRadius, yRadius, matColor2d) { - this.createWithMaterial(scene, lineWidth, - xCenter, yCenter, xRadius, yRadius, matColor2d); + this.createWithMaterial(scene, lineWidth, xCenter, yCenter, xRadius, yRadius, matColor2d); this.m_xCenter = xCenter; this.m_yCenter = yCenter; this.m_xRadius = xRadius; this.m_yRadius = yRadius; } - createWithMaterial(scene, lineWidth, - xCenter, yCenter, xRadius, yRadius, - matColor2d) { + createWithMaterial(scene, lineWidth, xCenter, yCenter, xRadius, yRadius, matColor2d) { this.m_scene = scene; this.m_lineWidth = lineWidth; @@ -68,11 +51,10 @@ export default class Circle2D { const TWICE = 2; const M2PI = MPI * TWICE; // eslint-disable-next-line - const perimeterApprox = MPI * (XRAD + YRAD) * (1.0 + 3.0 * hP / (10 + Math.sqrt(4.0 - 3.0 * hP))); + const perimeterApprox = MPI * (XRAD + YRAD) * (1.0 + (3.0 * hP) / (10 + Math.sqrt(4.0 - 3.0 * hP))); let numAngles = Math.floor(perimeterApprox) + 1; const MIN_NUMBER_PIXELS_IN_CIRCLE = 4; - numAngles = (numAngles > MIN_NUMBER_PIXELS_IN_CIRCLE) ? - numAngles : MIN_NUMBER_PIXELS_IN_CIRCLE; + numAngles = numAngles > MIN_NUMBER_PIXELS_IN_CIRCLE ? numAngles : MIN_NUMBER_PIXELS_IN_CIRCLE; // console.log(`numAngles = ${numAngles}`); // create geometry holder @@ -90,7 +72,7 @@ export default class Circle2D { // for (let a = 0; a < numAngles; a++) { - const angle = M2PI * a / numAngles; + const angle = (M2PI * a) / numAngles; const x0 = xCenter + xRadius * Math.cos(angle); const y0 = yCenter + yRadius * Math.sin(angle); const x1 = xCenter + (xRadius + lineWidth) * Math.cos(angle); @@ -105,7 +87,7 @@ export default class Circle2D { const normal = new THREE.Vector3(0.0, 0.0, 1.0); for (let a = 0; a < numAngles; a++) { const is = a * TWICE; - const anext = (a + 1 < numAngles) ? (a + 1) : (0); + const anext = a + 1 < numAngles ? a + 1 : 0; const ie = anext * TWICE; // const faceA = new THREE.Face3(is, ie, ie + 1, normal); // const faceB = new THREE.Face3(ie + 1, is + 1, is, normal); @@ -120,41 +102,41 @@ export default class Circle2D { } /** - * Get object for further scene addition. Need to remove old circle from scene - * @return (object) geometry mesh object (circle) - */ + * Get object for further scene addition. Need to remove old circle from scene + * @return (object) geometry mesh object (circle) + */ getRenderObject() { return this.m_mesh; } /** - * Return coordinate x of circle center - * @return (float) x - */ + * Return coordinate x of circle center + * @return (float) x + */ getxCenter() { return this.m_xCenter; } /** - * Return coordinate y of circle center - * @return (float) y - */ + * Return coordinate y of circle center + * @return (float) y + */ getyCenter() { return this.m_yCenter; } /** - * Return x radius of circle - * @return (float) x - */ + * Return x radius of circle + * @return (float) x + */ getxRadius() { return this.m_xRadius; } /** - * Return y radius of circle - * @return (float) y - */ + * Return y radius of circle + * @return (float) y + */ getyRadius() { return this.m_yRadius; } diff --git a/src/demo/engine/tools23d/contrastbrightnesstool.js b/src/engine/tools23d/contrastbrightnesstool.js similarity index 58% rename from src/demo/engine/tools23d/contrastbrightnesstool.js rename to src/engine/tools23d/contrastbrightnesstool.js index a359ecb8..ddd10385 100644 --- a/src/demo/engine/tools23d/contrastbrightnesstool.js +++ b/src/engine/tools23d/contrastbrightnesstool.js @@ -1,21 +1,7 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 2d area tool @@ -23,7 +9,6 @@ under the License. */ export default class ContrastBrightnessTool { - /** * Initialize area tool * @param (float) m_x - position on x for changing contrast @@ -48,7 +33,8 @@ export default class ContrastBrightnessTool { this.m_COBRflag = false; } - setPixelSize(xPixelSize, yPixelSize) { // in mm + setPixelSize(xPixelSize, yPixelSize) { + // in mm this.m_xPixelSize = xPixelSize; this.m_yPixelSize = yPixelSize; } diff --git a/src/demo/engine/tools23d/deletetool.js b/src/engine/tools23d/deletetool.js similarity index 85% rename from src/demo/engine/tools23d/deletetool.js rename to src/engine/tools23d/deletetool.js index 6cf6de25..ac5d8f12 100644 --- a/src/demo/engine/tools23d/deletetool.js +++ b/src/engine/tools23d/deletetool.js @@ -1,21 +1,7 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 2d delete tool @@ -117,8 +103,15 @@ export default class DeleteTool { const yE = (this.m_vertexes[COUNT_POINTS * i + MODULO_1].yZ - posY) / zoom + (1 - 1 / zoom); const line = new Line2D(this.m_scene, this.m_lineWidth, xS, yS, xE, yE, this.m_linesMaterial); this.m_distances[i].line = line; - this.m_distances[i].text.updateText(0.5 * (xS + xE) - 0.00, 0.5 * (yS + yE) - 0.00, this.m_textWidthScr, - MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + this.m_distances[i].text.updateText( + 0.5 * (xS + xE) - 0.0, + 0.5 * (yS + yE) - 0.0, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_CENTER, + this.m_textBgColor, + this.m_textColor + ); this.m_scene.add(this.m_distances[i].text); } } @@ -135,7 +128,8 @@ export default class DeleteTool { * @param (float) xPixelSize - canvas pixel size in mm for x axis * @param (float) yPixelSize - canvas pixel size in mm for y axis */ - setPixelSize(xPixelSize, yPixelSize) { // in mm + setPixelSize(xPixelSize, yPixelSize) { + // in mm this.m_xPixelSize = xPixelSize; this.m_yPixelSize = yPixelSize; } @@ -242,7 +236,7 @@ export default class DeleteTool { console.log(`${checkedAreaDistance.count}`); let c = 0; for (let j = 0; j < areaLL.length; ++j) { - if ((areaLL[j].begin <= checkedAreaDistance.count) && (checkedAreaDistance.count <= areaLL[j].endl)) { + if (areaLL[j].begin <= checkedAreaDistance.count && checkedAreaDistance.count <= areaLL[j].endl) { c = j; break; } @@ -302,8 +296,23 @@ export default class DeleteTool { * @param (float) x - mouse x coordinate * @param (float) y - mouse y coordinate */ - onMouseDown(x, y, distancesV, anglesA, rectR, areaD, textT, vertexesD, vertexesA, vertexesR, vertexesAr, areaLL, - vertexesArr, arr, vertexesT) { + onMouseDown( + x, + y, + distancesV, + anglesA, + rectR, + areaD, + textT, + vertexesD, + vertexesA, + vertexesR, + vertexesAr, + areaLL, + vertexesArr, + arr, + vertexesT + ) { this.deleteLine(distancesV, vertexesD); this.deleteAngle(anglesA, vertexesA); this.deleteRect(rectR, vertexesR); @@ -390,34 +399,50 @@ export default class DeleteTool { const TYPE_RECTANGLE = 1; const TYPE_ANGLE = 2; const TYPE_AREA = 3; - if (((Math.abs(l.getxS() - x) < SPACE) && (Math.abs(l.getyS() - y) < SPACE)) - || (((Math.abs(l.getxE() - x) < SPACE) && (Math.abs(l.getyE() - y) < SPACE)))) { + if ( + (Math.abs(l.getxS() - x) < SPACE && Math.abs(l.getyS() - y) < SPACE) || + (Math.abs(l.getxE() - x) < SPACE && Math.abs(l.getyE() - y) < SPACE) + ) { console.log('AREA OF DESTRUCTION'); if (!this.isPointsExist) { const count = i; switch (type) { - case TYPE_DISTANCE: - this.m_checkedLines.push({ count }); - break; - case TYPE_RECTANGLE: - this.m_checkedAngles.push({ count }); - break; - case TYPE_ANGLE: - this.m_checkedRects.push({ count }); - break; - case TYPE_AREA: - this.m_checkedAreasDistances.push({ count }); - break; - default: - break; + case TYPE_DISTANCE: + this.m_checkedLines.push({ count }); + break; + case TYPE_RECTANGLE: + this.m_checkedAngles.push({ count }); + break; + case TYPE_ANGLE: + this.m_checkedRects.push({ count }); + break; + case TYPE_AREA: + this.m_checkedAreasDistances.push({ count }); + break; + default: + break; } // end switch const INDENTANTION = 0.005; - let point = new Line2D(this.m_scene, this.m_lineWidth, l.getxS(), l.getyS(), - l.getxS() + INDENTANTION, l.getyS() + INDENTANTION, this.m_pointMaterial); + let point = new Line2D( + this.m_scene, + this.m_lineWidth, + l.getxS(), + l.getyS(), + l.getxS() + INDENTANTION, + l.getyS() + INDENTANTION, + this.m_pointMaterial + ); this.m_point.push({ point }); - point = new Line2D(this.m_scene, this.m_lineWidth, l.getxE(), l.getyE(), - l.getxE() + INDENTANTION, l.getyE() + INDENTANTION, this.m_pointMaterial); + point = new Line2D( + this.m_scene, + this.m_lineWidth, + l.getxE(), + l.getyE(), + l.getxE() + INDENTANTION, + l.getyE() + INDENTANTION, + this.m_pointMaterial + ); this.m_point.push({ point }); } this.isOut = true; @@ -429,17 +454,13 @@ export default class DeleteTool { if (!this.isPointsExist) { const count = i; this.m_checkedText.push({ count }); - let point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMin, mesh.m_yMin, - mesh.m_xMin, mesh.m_yMax, this.m_pointMaterial); + let point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMin, mesh.m_yMin, mesh.m_xMin, mesh.m_yMax, this.m_pointMaterial); this.m_point.push({ point }); - point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMin, mesh.m_yMax, - mesh.m_xMax, mesh.m_yMax, this.m_pointMaterial); + point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMin, mesh.m_yMax, mesh.m_xMax, mesh.m_yMax, this.m_pointMaterial); this.m_point.push({ point }); - point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMax, mesh.m_yMax, - mesh.m_xMax, mesh.m_yMin, this.m_pointMaterial); + point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMax, mesh.m_yMax, mesh.m_xMax, mesh.m_yMin, this.m_pointMaterial); this.m_point.push({ point }); - point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMax, mesh.m_yMin, - mesh.m_xMin, mesh.m_yMin, this.m_pointMaterial); + point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMax, mesh.m_yMin, mesh.m_xMin, mesh.m_yMin, this.m_pointMaterial); this.m_point.push({ point }); } this.isOut = true; diff --git a/src/demo/engine/tools23d/distancetool.js b/src/engine/tools23d/distancetool.js similarity index 79% rename from src/demo/engine/tools23d/distancetool.js rename to src/engine/tools23d/distancetool.js index 69bf0aa4..4c8849d4 100644 --- a/src/demo/engine/tools23d/distancetool.js +++ b/src/engine/tools23d/distancetool.js @@ -1,21 +1,7 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 2d distance tool @@ -27,7 +13,6 @@ import MaterialColor2d from '../gfx/matcolor2d'; import Line2D from './line2d'; export default class DistanceTool { - /** * Initialize distance tool * @param (object) scene - scene object @@ -102,8 +87,15 @@ export default class DistanceTool { const yE = (this.m_vertexes[COUNT_POINTS * i + MODULO_1].yZ - posY) / zoom + (1 - 1 / zoom); const line = new Line2D(this.m_scene, this.m_lineWidth, xS, yS, xE, yE, this.m_linesMaterial); this.m_distances[i].line = line; - this.m_distances[i].text.updateText(0.5 * (xS + xE) - 0.00, 0.5 * (yS + yE) - 0.00, this.m_textWidthScr, - MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + this.m_distances[i].text.updateText( + 0.5 * (xS + xE) - 0.0, + 0.5 * (yS + yE) - 0.0, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_CENTER, + this.m_textBgColor, + this.m_textColor + ); this.m_scene.add(this.m_distances[i].text); } } @@ -120,7 +112,8 @@ export default class DistanceTool { * @param (float) xPixelSize - canvas pixel size in mm for x axis * @param (float) yPixelSize - canvas pixel size in mm for y axis */ - setPixelSize(xPixelSize, yPixelSize) { // in mm + setPixelSize(xPixelSize, yPixelSize) { + // in mm this.m_xPixelSize = xPixelSize; this.m_yPixelSize = yPixelSize; } @@ -149,8 +142,7 @@ export default class DistanceTool { const line = new Line2D(this.m_scene, this.m_lineWidth, x, y, x, y, this.m_linesMaterial); const strMsg = '0 mm'; const text = new MeshText2D(strMsg); - text.updateText(x, y, this.m_textWidthScr, MeshText2D.ALIGN_CENTER, - MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + text.updateText(x, y, this.m_textWidthScr, MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); this.m_scene.add(text); this.m_distances.push({ line, text }); this.m_vertexes.push({ xZ, yZ }); @@ -176,13 +168,24 @@ export default class DistanceTool { this.m_scene.remove(dist.line.getRenderObject()); const line = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, this.m_yStart, x, y, this.m_linesMaterial); this.m_scene.remove(dist.text); - const strMsg = `${(zoom * (Math.sqrt((x - this.m_xStart) * (x - this.m_xStart) - * this.m_xPixelSize * this.m_xPixelSize + - // eslint-disable-next-line - (y - this.m_yStart) * (y - this.m_yStart) * this.m_yPixelSize * this.m_yPixelSize))).toFixed(2)} mm`; + const strMsg = `${( + zoom * + Math.sqrt( + (x - this.m_xStart) * (x - this.m_xStart) * this.m_xPixelSize * this.m_xPixelSize + + // eslint-disable-next-line + (y - this.m_yStart) * (y - this.m_yStart) * this.m_yPixelSize * this.m_yPixelSize + ) + ).toFixed(2)} mm`; const text = new MeshText2D(strMsg); - text.updateText(0.5 * (x + this.m_xStart) - 0.00, 0.5 * (y + this.m_yStart) - 0.00, this.m_textWidthScr, - MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + text.updateText( + 0.5 * (x + this.m_xStart) - 0.0, + 0.5 * (y + this.m_yStart) - 0.0, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_CENTER, + this.m_textBgColor, + this.m_textColor + ); this.m_scene.add(text); this.m_distances.push({ line, text }); } diff --git a/src/demo/engine/tools23d/edittool.js b/src/engine/tools23d/edittool.js similarity index 70% rename from src/demo/engine/tools23d/edittool.js rename to src/engine/tools23d/edittool.js index 504bc69d..82291bc8 100644 --- a/src/demo/engine/tools23d/edittool.js +++ b/src/engine/tools23d/edittool.js @@ -1,21 +1,7 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 2d edit tool @@ -118,8 +104,15 @@ export default class EditTool { const yE = (this.m_vertexes[COUNT_POINTS * i + MODULO_1].yZ - posY) / zoom + (1 - 1 / zoom); const line = new Line2D(this.m_scene, this.m_lineWidth, xS, yS, xE, yE, this.m_linesMaterial); this.m_distances[i].line = line; - this.m_distances[i].text.updateText(0.5 * (xS + xE) - 0.00, 0.5 * (yS + yE) - 0.00, this.m_textWidthScr, - MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + this.m_distances[i].text.updateText( + 0.5 * (xS + xE) - 0.0, + 0.5 * (yS + yE) - 0.0, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_CENTER, + this.m_textBgColor, + this.m_textColor + ); this.m_scene.add(this.m_distances[i].text); } } @@ -136,7 +129,8 @@ export default class EditTool { * @param (float) xPixelSize - canvas pixel size in mm for x axis * @param (float) yPixelSize - canvas pixel size in mm for y axis */ - setPixelSize(xPixelSize, yPixelSize) { // in mm + setPixelSize(xPixelSize, yPixelSize) { + // in mm this.m_xPixelSize = xPixelSize; this.m_yPixelSize = yPixelSize; } @@ -195,14 +189,24 @@ export default class EditTool { this.m_scene.remove(distancesV[i].line.getRenderObject()); this.m_scene.remove(distancesV[i].text); distancesV[i].line = newLine; - const strMsg = `${(zoom * (Math.sqrt((newLine.getxS() - newLine.getxE()) * (newLine.getxS() - newLine.getxE()) - * this.m_xPixelSize * this.m_xPixelSize + - // eslint-disable-next-line - (newLine.getyS() - newLine.getyE()) * (newLine.getyS() - newLine.getyE()) * this.m_yPixelSize * this.m_yPixelSize))).toFixed(2)} mm`; + const strMsg = `${( + zoom * + Math.sqrt( + (newLine.getxS() - newLine.getxE()) * (newLine.getxS() - newLine.getxE()) * this.m_xPixelSize * this.m_xPixelSize + + // eslint-disable-next-line + (newLine.getyS() - newLine.getyE()) * (newLine.getyS() - newLine.getyE()) * this.m_yPixelSize * this.m_yPixelSize + ) + ).toFixed(2)} mm`; const text = new MeshText2D(strMsg); - text.updateText(0.5 * (newLine.getxS() + newLine.getxE()) - 0.00, - 0.5 * (newLine.getyS() + newLine.getyE()) - 0.00, this.m_textWidthScr, - MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + text.updateText( + 0.5 * (newLine.getxS() + newLine.getxE()) - 0.0, + 0.5 * (newLine.getyS() + newLine.getyE()) - 0.0, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_CENTER, + this.m_textBgColor, + this.m_textColor + ); distancesV[i].text = text; this.m_scene.add(distancesV[i].text); newLine = null; @@ -212,20 +216,30 @@ export default class EditTool { this.processingLine2(distancesV[i].line, x, y); } } - if (this.m_runningState) { // text: recalculate distance + if (this.m_runningState) { + // text: recalculate distance if (newLine != null && distancesV.length !== 0 && countLine !== -1) { this.m_scene.remove(distancesV[distancesV.length - 1].line.getRenderObject()); this.m_scene.remove(distancesV[distancesV.length - 1].text); distancesV[distancesV.length - 1].line = newLine; - const strMsg = `${(zoom * (Math.sqrt((newLine.getxS() - newLine.getxE()) - * (newLine.getxS() - newLine.getxE()) * this.m_xPixelSize * this.m_xPixelSize + - // eslint-disable-next-line - (newLine.getyS() - newLine.getyE()) * (newLine.getyS() - newLine.getyE()) - * this.m_yPixelSize * this.m_yPixelSize))).toFixed(ACCURACY)} mm`; + const strMsg = `${( + zoom * + Math.sqrt( + (newLine.getxS() - newLine.getxE()) * (newLine.getxS() - newLine.getxE()) * this.m_xPixelSize * this.m_xPixelSize + + // eslint-disable-next-line + (newLine.getyS() - newLine.getyE()) * (newLine.getyS() - newLine.getyE()) * this.m_yPixelSize * this.m_yPixelSize + ) + ).toFixed(ACCURACY)} mm`; const text = new MeshText2D(strMsg); - text.updateText(0.5 * (newLine.getxS() + newLine.getxE()) - 0.00, - 0.5 * (newLine.getyS() + newLine.getyE()) - 0.00, this.m_textWidthScr, - MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + text.updateText( + 0.5 * (newLine.getxS() + newLine.getxE()) - 0.0, + 0.5 * (newLine.getyS() + newLine.getyE()) - 0.0, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_CENTER, + this.m_textBgColor, + this.m_textColor + ); distancesV[distancesV.length - 1].text = text; this.m_scene.add(distancesV[distancesV.length - 1].text); newLine = null; @@ -283,11 +297,17 @@ export default class EditTool { console.log(`${areaTool.m_vertexes2[pos.endl].xS}`); const area = this.updateArea(areaTool.m_last_lengths, countLine, areaTool.m_vertexes2); - const strMsgAr = `${(area).toFixed(ACCURACY)} mm^2`; + const strMsgAr = `${area.toFixed(ACCURACY)} mm^2`; const textAr = new MeshText2D(strMsgAr); - textAr.updateText(0.5 * (areaD[pos.endl].line.getxS() + areaD[pos.endl].line.getxE()) - 0.00, - 0.5 * (areaD[pos.endl].line.getyS() + areaD[pos.endl].line.getyE()) - 0.00, this.m_textWidthScr, - MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + textAr.updateText( + 0.5 * (areaD[pos.endl].line.getxS() + areaD[pos.endl].line.getxE()) - 0.0, + 0.5 * (areaD[pos.endl].line.getyS() + areaD[pos.endl].line.getyE()) - 0.0, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_CENTER, + this.m_textBgColor, + this.m_textColor + ); areaD[pos.endl].text = textAr; this.m_scene.add(areaD[pos.endl].text); newLine = null; @@ -325,33 +345,53 @@ export default class EditTool { newLine2 = null; } this.m_scene.remove(anglesA[countLine].text); - const len1 = Math.sqrt((anglesA[countLine].line1.getxS() - anglesA[countLine].line1.getxE()) * - (anglesA[countLine].line1.getxS() - anglesA[countLine].line1.getxE()) + - (anglesA[countLine].line1.getyS() - anglesA[countLine].line1.getyE()) * - (anglesA[countLine].line1.getyS() - anglesA[countLine].line1.getyE())); - const len2 = Math.sqrt((anglesA[countLine].line2.getxS() - anglesA[countLine].line2.getxE()) * - (anglesA[countLine].line2.getxS() - anglesA[countLine].line2.getxE()) + - (anglesA[countLine].line2.getyS() - anglesA[countLine].line2.getyE()) * - (anglesA[countLine].line2.getyS() - anglesA[countLine].line2.getyE())); - const strMsg = `${(Math.acos(((anglesA[countLine].line1.getxS() - anglesA[countLine].line1.getxE()) * - (anglesA[countLine].line2.getxS() - anglesA[countLine].line2.getxE()) + - (anglesA[countLine].line1.getyS() - anglesA[countLine].line1.getyE()) * - (anglesA[countLine].line2.getyS() - anglesA[countLine].line2.getyE())) / - // eslint-disable-next-line - (len1 * len2)) / Math.PI * 180).toFixed(2)}°`; + const len1 = Math.sqrt( + (anglesA[countLine].line1.getxS() - anglesA[countLine].line1.getxE()) * + (anglesA[countLine].line1.getxS() - anglesA[countLine].line1.getxE()) + + (anglesA[countLine].line1.getyS() - anglesA[countLine].line1.getyE()) * + (anglesA[countLine].line1.getyS() - anglesA[countLine].line1.getyE()) + ); + const len2 = Math.sqrt( + (anglesA[countLine].line2.getxS() - anglesA[countLine].line2.getxE()) * + (anglesA[countLine].line2.getxS() - anglesA[countLine].line2.getxE()) + + (anglesA[countLine].line2.getyS() - anglesA[countLine].line2.getyE()) * + (anglesA[countLine].line2.getyS() - anglesA[countLine].line2.getyE()) + ); + const strMsg = `${( + (Math.acos( + ((anglesA[countLine].line1.getxS() - anglesA[countLine].line1.getxE()) * + (anglesA[countLine].line2.getxS() - anglesA[countLine].line2.getxE()) + + (anglesA[countLine].line1.getyS() - anglesA[countLine].line1.getyE()) * + (anglesA[countLine].line2.getyS() - anglesA[countLine].line2.getyE())) / + // eslint-disable-next-line + (len1 * len2) + ) / + Math.PI) * + 180 + ).toFixed(2)}°`; const textA = new MeshText2D(strMsg); const Y_SHIFT_UP = 0.02; - textA.updateText(anglesA[countLine].line1.getxS(), anglesA[countLine].line1.getyS() - Y_SHIFT_UP, - this.m_textWidthScr, MeshText2D.ALIGN_CENTER, - MeshText2D.ALIGN_TOP, this.m_textBgColor, this.m_textColor); + textA.updateText( + anglesA[countLine].line1.getxS(), + anglesA[countLine].line1.getyS() - Y_SHIFT_UP, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_TOP, + this.m_textBgColor, + this.m_textColor + ); anglesA[countLine].text = textA; this.m_scene.add(anglesA[countLine].text); } countLine = -1; for (let i = 0; i < textTool.m_textArr.length; ++i) { - if (textTool.m_textArr[i].m_xMin <= x && x <= textTool.m_textArr[i].m_xMax - && textTool.m_textArr[i].m_yMin <= y && y <= textTool.m_textArr[i].m_yMax) { + if ( + textTool.m_textArr[i].m_xMin <= x && + x <= textTool.m_textArr[i].m_xMax && + textTool.m_textArr[i].m_yMin <= y && + y <= textTool.m_textArr[i].m_yMax + ) { if (this.m_runningState) { textTool.move(i, x - this.m_xInnerShift, y + this.m_yInnerShift, zoom, posX, posY); } else { @@ -374,10 +414,10 @@ export default class EditTool { const CONSTRAINTS = 0.02; let newLine = null; if (this.m_runningState) { - if (((Math.abs(l.getxS() - x) < CONSTRAINTS) && (Math.abs(l.getyS() - y) < CONSTRAINTS))) { + if (Math.abs(l.getxS() - x) < CONSTRAINTS && Math.abs(l.getyS() - y) < CONSTRAINTS) { console.log('AREA OF EDITING 1'); newLine = new Line2D(this.m_scene, this.m_lineWidth, x, y, l.getxE(), l.getyE(), this.m_linesMaterial); - } else if (((Math.abs(l.getxE() - x) < CONSTRAINTS) && (Math.abs(l.getyE() - y) < CONSTRAINTS))) { + } else if (Math.abs(l.getxE() - x) < CONSTRAINTS && Math.abs(l.getyE() - y) < CONSTRAINTS) { console.log('AREA OF EDITING 2'); newLine = new Line2D(this.m_scene, this.m_lineWidth, l.getxS(), l.getyS(), x, y, this.m_linesMaterial); } @@ -389,15 +429,29 @@ export default class EditTool { let point; const CONSTRAINTS = 0.01; const INSTANSITY = 0.005; - if (((Math.abs(l.getxS() - x) < CONSTRAINTS) && (Math.abs(l.getyS() - y) < CONSTRAINTS))) { - point = new Line2D(this.m_scene, this.m_lineWidth, l.getxS(), l.getyS(), l.getxS() + INSTANSITY, - l.getyS() + INSTANSITY, this.m_pointMaterial); + if (Math.abs(l.getxS() - x) < CONSTRAINTS && Math.abs(l.getyS() - y) < CONSTRAINTS) { + point = new Line2D( + this.m_scene, + this.m_lineWidth, + l.getxS(), + l.getyS(), + l.getxS() + INSTANSITY, + l.getyS() + INSTANSITY, + this.m_pointMaterial + ); this.m_point.push({ point }); this.isOut = true; } - if ((((Math.abs(l.getxE() - x) < CONSTRAINTS) && (Math.abs(l.getyE() - y) < CONSTRAINTS)))) { - point = new Line2D(this.m_scene, this.m_lineWidth, l.getxE(), l.getyE(), l.getxE() + INSTANSITY, - l.getyE() + INSTANSITY, this.m_pointMaterial); + if (Math.abs(l.getxE() - x) < CONSTRAINTS && Math.abs(l.getyE() - y) < CONSTRAINTS) { + point = new Line2D( + this.m_scene, + this.m_lineWidth, + l.getxE(), + l.getyE(), + l.getxE() + INSTANSITY, + l.getyE() + INSTANSITY, + this.m_pointMaterial + ); this.m_point.push({ point }); this.isOut = true; } @@ -405,17 +459,13 @@ export default class EditTool { processingText(mesh) { if (!this.isPointsExist) { - let point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMin, mesh.m_yMin, - mesh.m_xMin, mesh.m_yMax, this.m_pointMaterial); + let point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMin, mesh.m_yMin, mesh.m_xMin, mesh.m_yMax, this.m_pointMaterial); this.m_point.push({ point }); - point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMin, mesh.m_yMax, - mesh.m_xMax, mesh.m_yMax, this.m_pointMaterial); + point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMin, mesh.m_yMax, mesh.m_xMax, mesh.m_yMax, this.m_pointMaterial); this.m_point.push({ point }); - point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMax, mesh.m_yMax, - mesh.m_xMax, mesh.m_yMin, this.m_pointMaterial); + point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMax, mesh.m_yMax, mesh.m_xMax, mesh.m_yMin, this.m_pointMaterial); this.m_point.push({ point }); - point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMax, mesh.m_yMin, - mesh.m_xMin, mesh.m_yMin, this.m_pointMaterial); + point = new Line2D(this.m_scene, this.m_lineWidth, mesh.m_xMax, mesh.m_yMin, mesh.m_xMin, mesh.m_yMin, this.m_pointMaterial); this.m_point.push({ point }); } this.isOut = true; @@ -441,15 +491,19 @@ export default class EditTool { let sum1 = 0; let sum2 = 0; for (let j = 0; j < array.length; ++j) { - if ((array[j].begin <= numLine) && (numLine <= array[j].endl)) { + if (array[j].begin <= numLine && numLine <= array[j].endl) { for (let i = array[j].begin; i < array[j].endl; ++i) { sum1 += vertexes[i].xS * vertexes[i + 1].yS * this.m_xPixelSize * this.m_yPixelSize; sum2 += vertexes[i + 1].xS * vertexes[i].yS * this.m_xPixelSize * this.m_yPixelSize; } - const result = (0.5 * Math.abs(sum1 - + vertexes[array[j].endl].xS * vertexes[array[j].begin].yS * this.m_xPixelSize * this.m_yPixelSize - - sum2 - vertexes[array[j].begin].xS * vertexes[array[j].endl].yS - * this.m_xPixelSize * this.m_yPixelSize)); + const result = + 0.5 * + Math.abs( + sum1 + + vertexes[array[j].endl].xS * vertexes[array[j].begin].yS * this.m_xPixelSize * this.m_yPixelSize - + sum2 - + vertexes[array[j].begin].xS * vertexes[array[j].endl].yS * this.m_xPixelSize * this.m_yPixelSize + ); return result; } } @@ -458,7 +512,7 @@ export default class EditTool { num(array, numLine) { for (let j = 0; j < array.length; ++j) { - if ((array[j].begin <= numLine) && (numLine <= array[j].endl)) { + if (array[j].begin <= numLine && numLine <= array[j].endl) { return array[j]; } } diff --git a/src/demo/engine/tools23d/filtertool.js b/src/engine/tools23d/filtertool.js similarity index 64% rename from src/demo/engine/tools23d/filtertool.js rename to src/engine/tools23d/filtertool.js index 0b3aad50..71a657ab 100644 --- a/src/demo/engine/tools23d/filtertool.js +++ b/src/engine/tools23d/filtertool.js @@ -1,21 +1,7 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 2d area tool @@ -23,7 +9,6 @@ under the License. */ export default class FilterTool { - /** * Initialize area tool * @param (float) m_x - position on x for changing contrast diff --git a/src/engine/tools23d/graphics23d.js b/src/engine/tools23d/graphics23d.js new file mode 100644 index 00000000..f7ecf102 --- /dev/null +++ b/src/engine/tools23d/graphics23d.js @@ -0,0 +1,448 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * 2d simplest graphics engine + * @module app/scripts/graphics2d/graphics23d + */ + +import * as THREE from 'three'; + +import DistanceTool from './distancetool'; + +/** Possible 2d tools */ +const tools2d = { + INTENSITY: 'intensity', + DISTANCE: 'distance', + ANGLE: 'angle', + AREA: 'area', + RECT: 'rect', + TEXT: 'text', + GRAD: 'grad', + COBR: 'cobr', + BIFI: 'bifi', + ZOOM: 'zoom', + DELETE: 'delete', + EDIT: 'edit', +}; + +/** Class Graphics2d is used for simple debug style 2d render */ +export default class Graphics23d { + /** + * Initialize render + * @param (object) container - object container for 3d rendering + * @param (int) width - 2d canvas width + * @param (int) height - 2d canvas height + * @return {Object} Intsance of this class (singleton) + */ + constructor(scene, width, height) { + this.m_width = width; + this.m_height = height; + this.m_material = null; + this.m_mesh = null; + console.log(`Graphics2d create size = ${width} * ${height}`); + this.m_scene = scene; + + this.m_materialsTex2d = null; + this.m_material = null; + + //construct edit and move tools + this.m_zoom = 1; + this.m_savePosX = 0; + this.m_savePosY = 0; + this.m_posX = 0; + this.m_posY = 0; + this.m_move = false; + this.m_wProjScreen = width; + this.m_hProjScreen = height; + + this.m_showTileTexture = false; + + // prepare for render 2d lines on screen + const xw = 1.0 / width; + const yw = 1.0 / height; + const TWICE = 2.0; + this.m_lineWidth = TWICE * (xw > yw ? xw : yw); + this.m_lineWidth = 0.002; + + this.m_textTime = -1000; + this.m_text = null; + this.m_toolType = tools2d.DISTANCE; + this.m_distanceTool = new DistanceTool(this.m_scene, this.m_lineWidth); + } // end of constructor + + set2dToolType(toolType) { + this.m_toolType = toolType; + } + + /** + * Callback on file loaded + */ + onFileLoaded() { + this.m_distanceTool.clearLines(); + this.m_angleTool.clearLines(); + this.m_areaTool.clearLines(); + this.m_rectTool.clearLines(); + this.m_textTool.clear(); + this.m_deleteTool.clearLines(); + this.m_editTool.clearLines(); + } + + clear2DTools() { + this.m_distanceTool.clearLines(); + this.m_angleTool.clearLines(); + this.m_areaTool.clearLines(); + this.m_rectTool.clearLines(); + this.m_textTool.clear(); + this.m_deleteTool.clearLines(); + this.m_editTool.clearLines(); + } + + default2DTools() { + this.m_zoom = 1; + this.m_posX = 0; + this.m_posY = 0; + this.m_savePosX = 0; + this.m_savePosY = 0; + this.m_materialsTex2d.m_uniforms.posX.value = this.m_posX; + this.m_materialsTex2d.m_uniforms.posY.value = this.m_posY; + this.m_materialsTex2d.m_uniforms.zoom.value = this.m_zoom; + this.updateLines(); + } + + fov2Tan(fov) { + const HALF = 0.5; + return Math.tan(THREE.Math.degToRad(HALF * fov)); + } + + tan2Fov(tan) { + const TWICE = 2.0; + return THREE.Math.radToDeg(Math.atan(tan)) * TWICE; + } + + /** + * Keyboard event handler + * @param (number) keyCode - keyboard code + * @param (Boolean) debug - true if debug false otherwise + */ + onKeyDown(keyCode, debug) { + // console.log(`onKeyDown: ${keyCode}`); + // const KEY_CODE_G = 71; + if (debug) { + // if (keyCode === KEY_CODE_G) { + // this.debugShowSliceFrom2dTiles(); + // } + } + } + + /** + * Mouse events handler + * xScr, yScr in [0..1] is normalized mouse coordinate in screen + */ + onMouseDown(xScr, yScr) { + if (this.m_volumeData === null || this.m_volumeHeader === null) { + return; + } + if (xScr > this.m_wProjScreen || yScr > this.m_hProjScreen) { + // out of image + return; + } + if (this.m_levelSetMode) { + return; + } + + const TWICE = 2.0; + const xt = xScr * TWICE - 1.0; + const yt = yScr * TWICE - 1.0; + //const yt = (1.0 - yScr) * TWICE - 1.0; + + switch (this.m_toolType) { + case tools2d.DISTANCE: + this.m_distanceTool.onMouseDown(xt, yt, this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); + break; + case tools2d.ANGLE: + this.m_angleTool.onMouseDown(xt, yt, this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); + break; + case tools2d.TEXT: + this.m_textTool.onMouseDown(xt, yt, this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); + break; + case tools2d.AREA: + this.m_areaTool.onMouseDown(xt, yt, this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); + break; + case tools2d.RECT: + this.m_rectTool.onMouseDown(xt, yt, this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); + break; + case tools2d.GRAD: + break; + case tools2d.COBR: + /*this.m_contrastBrightTool.onMouseDown(xt, yt); + this.m_materialsTex2d.m_uniforms.contrast.value = this.m_contrastBrightTool.m_contrast; + this.m_materialsTex2d.m_uniforms.brightness.value = this.m_contrastBrightTool.m_brightness; + this.m_materialsTex2d.m_uniforms.COBRflag.value = this.m_contrastBrightTool.m_COBRflag;*/ + break; + case tools2d.BIFI: + /*this.m_filterTool.onMouseDown(xt, yt); + this.m_materialsTex2d.m_uniforms.sigma.value = this.m_filterTool.m_sigma; + this.m_materialsTex2d.m_uniforms.sigmaB.value = this.m_filterTool.m_sigmaB; + this.m_materialsTex2d.m_uniforms.BIFIflag.value = this.m_filterTool.m_BIFIflag;*/ + break; + case tools2d.ZOOM: + this.m_move = true; + this.m_moveTool.onMouseDown(xt, yt); + break; + case tools2d.DELETE: + this.m_deleteTool.onMouseDown( + xt, + yt, + this.m_distanceTool.m_distances, + this.m_angleTool.m_angles, + this.m_rectTool.m_areas, + this.m_areaTool.m_distances, + this.m_textTool.m_textArr, + this.m_distanceTool.m_vertexes, + this.m_angleTool.m_vertexes, + this.m_rectTool.m_vertexes, + this.m_areaTool.m_vertexes2, + this.m_areaTool.m_last_lengths, + this.m_areaTool.m_vertexes, + this.m_areaTool, + this.m_textTool.m_vertexes + ); + console.log(`${this.m_areaTool.last_length}`); + break; + case tools2d.EDIT: + this.m_editTool.onMouseDown(); + break; + default: + console.log('Unexpected 2d tool'); + break; + } + } + + /** + * Mouse events handler + * xScr, yScr in [0..1] is normalized mouse coordinate in screen + */ + onMouseUp(xScr, yScr) { + if (this.m_volumeData === null || this.m_volumeHeader === null) { + return; + } + if (xScr > this.m_wProjScreen || yScr > this.m_hProjScreen) { + // out of image + return; + } + const TWICE = 2.0; + const xt = xScr * TWICE - 1.0; + const yt = yScr * TWICE - 1.0; + //const yt = (1.0 - yScr) * TWICE - 1.0; + + if (this.m_levelSetMode) { + // only for first step of level set + if (this.m_levelSetCircle !== null) { + this.clearLevelSetCenter(); + } + this.drawLevelSetCenter(xt, yt); + return; + } + switch (this.m_toolType) { + case tools2d.DISTANCE: + break; + case tools2d.ANGLE: + break; + case tools2d.AREA: + break; + case tools2d.RECT: + break; + case tools2d.TEXT: + break; + case tools2d.COBR: + break; + case tools2d.BIFI: + break; + case tools2d.ZOOM: + this.m_move = false; + this.m_moveTool.onMouseUp(); + this.m_savePosX = this.m_posX; + this.m_savePosY = this.m_posY; + break; + case tools2d.DELETE: + break; + case tools2d.EDIT: + this.m_editTool.onMouseUp(); + break; + default: + console.log('Unexpected 2d tool'); + break; + } + } + + /** + * Mouse move event handler + * @param (float) xScr - normalized mouse x coordinate in screen + * @param (float) yScr - normalized mouse y coordinate in screen + */ + onMouseMove(xScr, yScr) { + if (this.m_volumeData === null || this.m_volumeHeader === null) { + return; + } + if (xScr > this.m_wProjScreen || yScr > this.m_hProjScreen) { + // out of image + return; + } + const TWICE = 2.0; + const xt = xScr * TWICE - 1.0; + const yt = yScr * TWICE - 1.0; + //const yt = (1.0 - yScr) * TWICE - 1.0; + + switch (this.m_toolType) { + case tools2d.DISTANCE: + this.m_distanceTool.onMouseMove(xt, yt, this.m_zoom); + break; + case tools2d.ANGLE: + this.m_angleTool.onMouseMove(xt, yt); + break; + case tools2d.AREA: + this.m_areaTool.onMouseMove(xt, yt); + break; + case tools2d.RECT: + this.m_rectTool.onMouseMove(xt, yt, this.m_zoom); + break; + case tools2d.TEXT: + break; + case tools2d.GRAD: + break; + case tools2d.COBR: + /*this.m_contrastBrightTool.onMouseMove(xt, yt); + this.m_materialsTex2d.m_uniforms.contrast.value = this.m_contrastBrightTool.m_contrast; + this.m_materialsTex2d.m_uniforms.brightness.value = this.m_contrastBrightTool.m_brightness; + this.m_materialsTex2d.m_uniforms.COBRflag.value = this.m_contrastBrightTool.m_COBRflag;*/ + break; + case tools2d.BIFI: + /*this.m_filterTool.onMouseMove(xt, yt); + this.m_materialsTex2d.m_uniforms.sigma.value = this.m_filterTool.m_sigma; + this.m_materialsTex2d.m_uniforms.sigmaB.value = this.m_filterTool.m_sigmaB; + this.m_materialsTex2d.m_uniforms.BIFIflag.value = this.m_filterTool.m_BIFIflag;*/ + break; + case tools2d.ZOOM: + if (this.m_move) { + this.updateMove(xt, yt); + } + break; + case tools2d.DELETE: + this.m_deleteTool.onMouseMove( + xt, + yt, + this.m_zoom, + this.m_distanceTool.m_distances, + this.m_angleTool.m_angles, + this.m_rectTool.m_areas, + this.m_areaTool.m_distances, + this.m_textTool.m_textArr + ); + break; + case tools2d.EDIT: // TO DO: add text tool + this.m_editTool.onMouseMove( + xt, + yt, + this.m_zoom, + this.m_distanceTool.m_distances, + this.m_angleTool.m_angles, + this.m_rectTool.m_areas, + this.m_areaTool.m_distances, + this.m_areaTool, + this.m_textTool, + this.m_posX * this.m_wProjScreen, + this.m_posY * this.m_hProjScreen + ); + //this.m_areaTool.updateVertexes(this.m_zoom, this.m_posX * (this.m_wProjScreen), this.m_posY * + // (this.m_hProjScreen)); + this.m_distanceTool.updateVertexes(this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); + this.m_angleTool.updateVertexes(this.m_zoom, this.m_posX * this.m_wProjScreen, this.m_posY * this.m_hProjScreen); + break; + default: + console.log('Unexpected 2d tool'); + break; + } + } + + /** + * Mouse events handler + * xScr, yScr in [0..1] is normalized mouse coordinate in screen + */ + onMouseWheel() { + switch (this.m_toolType) { + case tools2d.DISTANCE: + break; + case tools2d.ANGLE: + break; + case tools2d.AREA: + break; + case tools2d.RECT: + break; + case tools2d.TEXT: + break; + case tools2d.COBR: + break; + case tools2d.BIFI: + break; + case tools2d.ZOOM: + this.updateZoom(); + break; + case tools2d.DELETE: + break; + case tools2d.EDIT: + break; + default: + console.log('Unexpected 2d tool'); + break; + } + } + + updateMove(xt, yt) { + const TWICE = 2; + const delta = TWICE - TWICE * this.m_zoom; + const coord = this.m_moveTool.onMouseMove(xt, yt); + if (this.m_savePosX + coord.x <= Math.abs(delta) && this.m_savePosX + coord.x > 0) { + this.m_posX = this.m_savePosX + coord.x; + this.m_materialsTex2d.m_uniforms.posX.value = this.m_posX; + } else if (this.m_savePosX + coord.x > Math.abs(delta)) { + this.m_posX = Math.abs(delta); + this.m_materialsTex2d.m_uniforms.posX.value = this.m_posX; + } else { + this.m_posX = 0; + this.m_materialsTex2d.m_uniforms.posX.value = this.m_posX; + } + + if (this.m_savePosY + coord.y >= -1 * Math.abs(delta) && this.m_savePosY + coord.y < 0) { + this.m_posY = this.m_savePosY + coord.y; + this.m_materialsTex2d.m_uniforms.posY.value = this.m_posY; + } else if (this.m_savePosY + coord.y < -1 * Math.abs(delta)) { + this.m_posY = -1 * Math.abs(delta); + this.m_materialsTex2d.m_uniforms.posY.value = this.m_posY; + } else { + this.m_posY = 0; + this.m_materialsTex2d.m_uniforms.posY.value = this.m_posY; + } + } + + updateZoom() { + const TWICE = 2; + this.m_materialsTex2d.m_uniforms.zoom.value = this.m_zoomTool.m_zoom; + const delta = TWICE - TWICE * this.m_zoom; + if (this.m_posX > delta) { + this.m_posX = delta; + this.m_materialsTex2d.m_uniforms.posX.value = this.m_posX; + } + if (this.m_posY < -1 * delta && this.m_posY < 0) { + this.m_posY = -1 * delta; + this.m_materialsTex2d.m_uniforms.posY.value = this.m_posY; + } + this.updateLines(); + } + + updateText() { + //this.m_pickTool.update(); + } +} diff --git a/src/demo/engine/tools23d/line2d.js b/src/engine/tools23d/line2d.js similarity index 59% rename from src/demo/engine/tools23d/line2d.js rename to src/engine/tools23d/line2d.js index bc0dfa17..56f48093 100644 --- a/src/demo/engine/tools23d/line2d.js +++ b/src/engine/tools23d/line2d.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Render 2d lines in scene -* @module app/scripts/graphics2d/line2d -*/ + * Render 2d lines in scene + * @module app/scripts/graphics2d/line2d + */ import * as THREE from 'three'; @@ -30,15 +16,15 @@ const LINE_2D_Z_COORDINATE = 0.11; /** Class LineD is used for render lines in 2d mode */ export default class Line2D { /** - * Constructor. Create line 2d mode and add to scene on render - * @param (object) scene - Scene where object will be rendered - * @param (float) lineWidth - Line width in scale [-1..+1] - * @param (float) xs - Line start, x coordinate - * @param (float) ys - Line start, y coordinate - * @param (float) xe - Line end, x coordinate - * @param (float) ye - Line end, y coordinate - * @param (object) matColor2d - MaterialColor2d - */ + * Constructor. Create line 2d mode and add to scene on render + * @param (object) scene - Scene where object will be rendered + * @param (float) lineWidth - Line width in scale [-1..+1] + * @param (float) xs - Line start, x coordinate + * @param (float) ys - Line start, y coordinate + * @param (float) xe - Line end, x coordinate + * @param (float) ye - Line end, y coordinate + * @param (object) matColor2d - MaterialColor2d + */ constructor(scene, lineWidth, xs, ys, xe, ye, matColor2d) { this.createWithMaterial(scene, lineWidth, xs, ys, xe, ye, matColor2d); this.m_xS = xs; @@ -47,10 +33,7 @@ export default class Line2D { this.m_yE = ye; } - createWithMaterial(scene, - lineWidth, - xs, ys, xe, ye, - matColor2d) { + createWithMaterial(scene, lineWidth, xs, ys, xe, ye, matColor2d) { this.m_scene = scene; this.m_lineWidth = lineWidth; @@ -104,41 +87,41 @@ export default class Line2D { } /** - * Get object for further scene addition. Need to remove old line from scene - * @return (object) line object - */ + * Get object for further scene addition. Need to remove old line from scene + * @return (object) line object + */ getRenderObject() { return this.m_mesh; } /** - * Return coordinate x of start point - * @return (float) x - */ + * Return coordinate x of start point + * @return (float) x + */ getxS() { return this.m_xS; } /** - * Return coordinate y of start point - * @return (float) y - */ + * Return coordinate y of start point + * @return (float) y + */ getyS() { return this.m_yS; } /** - * Return coordinate x of end point - * @return (float) x - */ + * Return coordinate x of end point + * @return (float) x + */ getxE() { return this.m_xE; } /** - * Return coordinate y of end point - * @return (float) y - */ + * Return coordinate y of end point + * @return (float) y + */ getyE() { return this.m_yE; } diff --git a/src/demo/engine/tools23d/meshtext2d.js b/src/engine/tools23d/meshtext2d.js similarity index 84% rename from src/demo/engine/tools23d/meshtext2d.js rename to src/engine/tools23d/meshtext2d.js index 632365b9..79186514 100644 --- a/src/demo/engine/tools23d/meshtext2d.js +++ b/src/engine/tools23d/meshtext2d.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Mesh with 2d text -* @module lib/scripts/graphics2d/meshtext2d -*/ + * Mesh with 2d text + * @module lib/scripts/graphics2d/meshtext2d + */ import * as THREE from 'three'; @@ -88,13 +74,13 @@ export default class MeshText2D extends Text2D { } /** - * Update text 2d object: create mesh in desired position, content and width - * @param (object) container - object container for 3d rendering - * @param (int) xc - text anchor x coordinate - * @param (int) yc - text anchor y coordinate - * @param (float) letterHeight - single letter height in range [-1..+1] - * @param (string ) strTextBackColor - Background color, like rgba(255, 0, 0, 255), i.e. red color - */ + * Update text 2d object: create mesh in desired position, content and width + * @param (object) container - object container for 3d rendering + * @param (int) xc - text anchor x coordinate + * @param (int) yc - text anchor y coordinate + * @param (float) letterHeight - single letter height in range [-1..+1] + * @param (string ) strTextBackColor - Background color, like rgba(255, 0, 0, 255), i.e. red color + */ updateText(xc, yc, letterHeight, xAlign, yAlign, strTextBackColor, strTextColor) { // console.log('MeshText2D.updateText()...'); this.cleanUp(); @@ -228,4 +214,3 @@ MeshText2D.ALIGN_RIGHT = 1; MeshText2D.ALIGN_TOP = 2; MeshText2D.ALIGN_BOTTOM = 3; MeshText2D.ALIGN_CENTER = 4; - diff --git a/src/demo/engine/tools23d/movetool.js b/src/engine/tools23d/movetool.js similarity index 65% rename from src/demo/engine/tools23d/movetool.js rename to src/engine/tools23d/movetool.js index f962e2d4..842ae966 100644 --- a/src/demo/engine/tools23d/movetool.js +++ b/src/engine/tools23d/movetool.js @@ -1,21 +1,7 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 2d area tool diff --git a/src/demo/engine/tools23d/mprrenderer.js b/src/engine/tools23d/mprrenderer.js similarity index 67% rename from src/demo/engine/tools23d/mprrenderer.js rename to src/engine/tools23d/mprrenderer.js index 4828b359..11258559 100644 --- a/src/demo/engine/tools23d/mprrenderer.js +++ b/src/engine/tools23d/mprrenderer.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* MPR mode renderer (in 2d) -* @module app/scripts/graphics2d/mprrenderer -*/ + * MPR mode renderer (in 2d) + * @module app/scripts/graphics2d/mprrenderer + */ // global imports import * as THREE from 'three'; @@ -40,7 +26,6 @@ const PROJECTION_Y = 1; const PROJECTION_Z = 0; const NUM_PROJECTIONS = 3; - /** Class MprRenderer is used for 2d MRP mode visualization */ export default class MprRenderer { constructor(container, width, height, objGraphics2d) { @@ -71,8 +56,8 @@ export default class MprRenderer { } /** - * Create WebGl renderer and connect to HTML container - */ + * Create WebGl renderer and connect to HTML container + */ create() { // this.m_renderer = new THREE.WebGLRenderer({ antialias: true }); //this.canvas2d = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas'); @@ -86,8 +71,10 @@ export default class MprRenderer { this.isWebGL2 = glSelector.useWebGL2(); this.canvas2d = glSelector.getCanvas(); this.m_renderer = new THREE.WebGLRenderer({ - antialias: false, canvas: this.canvas2d, - preserveDrawingBuffer: true, context: this.context + antialias: false, + canvas: this.canvas2d, + preserveDrawingBuffer: true, + context: this.context, }); const width = this.m_width; const height = this.m_height; @@ -132,9 +119,9 @@ export default class MprRenderer { this.m_sliceRatio[PROJECTION_Y] = 0.5; this.m_sliceRatio[PROJECTION_Z] = 0.5; this.m_controlPoint = new Array(NUM_PROJECTIONS); - this.m_controlPoint[PROJECTION_X] = { 'x': -1.0, 'y': 0.0 }; - this.m_controlPoint[PROJECTION_Y] = { 'x': 0.0, 'y': 0.0 }; - this.m_controlPoint[PROJECTION_Z] = { 'x': 1.0, 'y': 0.0 }; + this.m_controlPoint[PROJECTION_X] = { x: -1.0, y: 0.0 }; + this.m_controlPoint[PROJECTION_Y] = { x: 0.0, y: 0.0 }; + this.m_controlPoint[PROJECTION_Z] = { x: 1.0, y: 0.0 }; this.m_projectionRect = new Array(NUM_PROJECTIONS); const NUM_BOUND_LINES = 6; @@ -173,8 +160,8 @@ export default class MprRenderer { } /** - * Action when new file was completely loaded - */ + * Action when new file was completely loaded + */ onFileLoaded() { this.clearScene(); const volTexture = this.m_objGraphics2d.m_volTexture; @@ -185,12 +172,13 @@ export default class MprRenderer { let i; const SIZE_SCREEN = 2.0; for (i = 0; i < NUM_PROJECTIONS; i++) { - const XMin = -VPORT_SIZE + (i + 0) * SIZE_SCREEN / NUM_PROJECTIONS; - const XMax = -VPORT_SIZE + (i + 1) * SIZE_SCREEN / NUM_PROJECTIONS; + const XMin = -VPORT_SIZE + ((i + 0) * SIZE_SCREEN) / NUM_PROJECTIONS; + const XMax = -VPORT_SIZE + ((i + 1) * SIZE_SCREEN) / NUM_PROJECTIONS; // define correct vertical rect dimension // to look slice proportional - let wPhys = 0, hPhys = 0; + let wPhys = 0, + hPhys = 0; if (i === PROJECTION_X) { wPhys = this.m_objGraphics2d.m_volumeBox.y; hPhys = this.m_objGraphics2d.m_volumeBox.z; @@ -203,10 +191,10 @@ export default class MprRenderer { } const wPart = this.m_width / NUM_PROJECTIONS; let wScreen = wPart; - let hScreen = wScreen * hPhys / wPhys; + let hScreen = (wScreen * hPhys) / wPhys; if (hScreen > this.m_height) { hScreen = this.m_height; - wScreen = hScreen * wPhys / hPhys; + wScreen = (hScreen * wPhys) / hPhys; } // console.log(`Proportion is: ${wScreen} * ${hScreen}`); // normalize to [0..1] @@ -227,10 +215,10 @@ export default class MprRenderer { const YMax = +hScreen; this.m_projectionRect[i] = { - 'xMin': XMin, - 'yMin': YMin, - 'xMax': XMax, - 'yMax': YMax, + xMin: XMin, + yMin: YMin, + xMax: XMax, + yMax: YMax, }; // v2 ----- v3 @@ -256,20 +244,11 @@ export default class MprRenderer { // | // (0,0) v y (0,1) // (1,2) - geo.faceVertexUvs[0][0] = [ - new THREE.Vector2(0.0, 1.0), - new THREE.Vector2(1.0, 1.0), - new THREE.Vector2(0.0, 0.0), - ]; - geo.faceVertexUvs[0][1] = [ - new THREE.Vector2(1.0, 0.0), - new THREE.Vector2(0.0, 0.0), - new THREE.Vector2(1.0, 1.0), - ]; + geo.faceVertexUvs[0][0] = [new THREE.Vector2(0.0, 1.0), new THREE.Vector2(1.0, 1.0), new THREE.Vector2(0.0, 0.0)]; + geo.faceVertexUvs[0][1] = [new THREE.Vector2(1.0, 0.0), new THREE.Vector2(0.0, 0.0), new THREE.Vector2(1.0, 1.0)]; const normal = new THREE.Vector3(); THREE.Triangle.getNormal(v0, v1, v2, normal); - // eslint-disable-next-line geo.faces[0] = new THREE.Face3(0, 1, 2, normal); // eslint-disable-next-line @@ -283,15 +262,14 @@ export default class MprRenderer { // get dim for current slice (one between X, Y or Z) and slice index, based on ratio let dim = xDim; - dim = (i === PROJECTION_Y) ? yDim : dim; - dim = (i === PROJECTION_Z) ? zDim : dim; + dim = i === PROJECTION_Y ? yDim : dim; + dim = i === PROJECTION_Z ? zDim : dim; const sliceIndex = Math.floor(this.m_sliceRatio[i] * dim); // console.log(`Create mat. vol ${xDim}*${yDim}*${zDim}. sliceIndex=${sliceIndex} `); // eslint-disable-next-line const axisIndex = 2 - i; // inside matTex2d.create it should be X - 0 or Y - 1 or Z - 2 - matTex2d.create(volTexture, - xDim, yDim, zDim, axisIndex, sliceIndex, this.m_objGraphics2d.m_isRoiVolume); + matTex2d.create(volTexture, xDim, yDim, zDim, axisIndex, sliceIndex, this.m_objGraphics2d.m_isRoiVolume); const mat = matTex2d.m_material; this.m_meshes[i] = new THREE.Mesh(geo, mat); @@ -310,10 +288,24 @@ export default class MprRenderer { this.m_boundLines[1] = new Line2D(this.m_scene, this.m_vertLineWidth, maxCoord, maxCoord, maxCoord, minCoord, mat); this.m_boundLines[2] = new Line2D(this.m_scene, this.m_horLineWidth, maxCoord, minCoord, minCoord, minCoord, mat); this.m_boundLines[3] = new Line2D(this.m_scene, this.m_vertLineWidth, minCoord, minCoord, minCoord, maxCoord, mat); - this.m_boundLines[4] = new Line2D(this.m_scene, this.m_vertLineWidth, this.m_projectionRect[0].xMax - halfLineWidth, - minCoord, this.m_projectionRect[0].xMax - halfLineWidth, maxCoord, mat); - this.m_boundLines[5] = new Line2D(this.m_scene, this.m_vertLineWidth, this.m_projectionRect[1].xMax - halfLineWidth, - minCoord, this.m_projectionRect[1].xMax - halfLineWidth, maxCoord, mat); + this.m_boundLines[4] = new Line2D( + this.m_scene, + this.m_vertLineWidth, + this.m_projectionRect[0].xMax - halfLineWidth, + minCoord, + this.m_projectionRect[0].xMax - halfLineWidth, + maxCoord, + mat + ); + this.m_boundLines[5] = new Line2D( + this.m_scene, + this.m_vertLineWidth, + this.m_projectionRect[1].xMax - halfLineWidth, + minCoord, + this.m_projectionRect[1].xMax - halfLineWidth, + maxCoord, + mat + ); this.m_sliceRatio[PROJECTION_X] = 0.5; this.m_sliceRatio[PROJECTION_Y] = 0.5; @@ -354,66 +346,149 @@ export default class MprRenderer { const vertShift = SHIFT_MUL * this.m_horLineWidth; // lines on Z - const xCenterOnZ = this.m_projectionRect[PROJECTION_Z].xMin + this.m_sliceRatio[PROJECTION_X] * - (this.m_projectionRect[PROJECTION_Z].xMax - this.m_projectionRect[PROJECTION_Z].xMin); - const yCenterOnZ = this.m_projectionRect[PROJECTION_Z].yMin + this.m_sliceRatio[PROJECTION_Y] * - (this.m_projectionRect[PROJECTION_Z].yMax - this.m_projectionRect[PROJECTION_Z].yMin); + const xCenterOnZ = + this.m_projectionRect[PROJECTION_Z].xMin + + this.m_sliceRatio[PROJECTION_X] * (this.m_projectionRect[PROJECTION_Z].xMax - this.m_projectionRect[PROJECTION_Z].xMin); + const yCenterOnZ = + this.m_projectionRect[PROJECTION_Z].yMin + + this.m_sliceRatio[PROJECTION_Y] * (this.m_projectionRect[PROJECTION_Z].yMax - this.m_projectionRect[PROJECTION_Z].yMin); // blue X projection line on Z projection - this.m_linesXOnZ = [new Line2D(this.m_scene, this.m_vertLineWidth, xCenterOnZ, - this.m_projectionRect[PROJECTION_Z].yMax, xCenterOnZ, yCenterOnZ + vertShift, this.m_materialLineBlue), - new Line2D(this.m_scene, this.m_vertLineWidth, xCenterOnZ, yCenterOnZ - vertShift, xCenterOnZ, - this.m_projectionRect[PROJECTION_Z].yMin, this.m_materialLineBlue)]; + this.m_linesXOnZ = [ + new Line2D( + this.m_scene, + this.m_vertLineWidth, + xCenterOnZ, + this.m_projectionRect[PROJECTION_Z].yMax, + xCenterOnZ, + yCenterOnZ + vertShift, + this.m_materialLineBlue + ), + new Line2D( + this.m_scene, + this.m_vertLineWidth, + xCenterOnZ, + yCenterOnZ - vertShift, + xCenterOnZ, + this.m_projectionRect[PROJECTION_Z].yMin, + this.m_materialLineBlue + ), + ]; // green Y projection line on Z projection - this.m_linesYOnZ = [new Line2D(this.m_scene, this.m_horLineWidth, this.m_projectionRect[PROJECTION_Z].xMin, - yCenterOnZ, xCenterOnZ - horShift, yCenterOnZ, this.m_materialLineGreen), - new Line2D(this.m_scene, this.m_horLineWidth, xCenterOnZ + horShift, yCenterOnZ, - this.m_projectionRect[PROJECTION_Z].xMax, yCenterOnZ, this.m_materialLineGreen)]; + this.m_linesYOnZ = [ + new Line2D( + this.m_scene, + this.m_horLineWidth, + this.m_projectionRect[PROJECTION_Z].xMin, + yCenterOnZ, + xCenterOnZ - horShift, + yCenterOnZ, + this.m_materialLineGreen + ), + new Line2D( + this.m_scene, + this.m_horLineWidth, + xCenterOnZ + horShift, + yCenterOnZ, + this.m_projectionRect[PROJECTION_Z].xMax, + yCenterOnZ, + this.m_materialLineGreen + ), + ]; this.m_controlPoint[PROJECTION_Z].x = xCenterOnZ; this.m_controlPoint[PROJECTION_Z].y = yCenterOnZ; // lines on Y - const xCenterOnY = this.m_projectionRect[PROJECTION_Y].xMin + this.m_sliceRatio[PROJECTION_X] * - (this.m_projectionRect[PROJECTION_Y].xMax - this.m_projectionRect[PROJECTION_Y].xMin); - const yCenterOnY = this.m_projectionRect[PROJECTION_Y].yMin + this.m_sliceRatio[PROJECTION_Z] * - (this.m_projectionRect[PROJECTION_Y].yMax - this.m_projectionRect[PROJECTION_Y].yMin); + const xCenterOnY = + this.m_projectionRect[PROJECTION_Y].xMin + + this.m_sliceRatio[PROJECTION_X] * (this.m_projectionRect[PROJECTION_Y].xMax - this.m_projectionRect[PROJECTION_Y].xMin); + const yCenterOnY = + this.m_projectionRect[PROJECTION_Y].yMin + + this.m_sliceRatio[PROJECTION_Z] * (this.m_projectionRect[PROJECTION_Y].yMax - this.m_projectionRect[PROJECTION_Y].yMin); // blue X projection line on Y projection - this.m_linesXOnY = [new Line2D(this.m_scene, this.m_vertLineWidth, xCenterOnY, - this.m_projectionRect[PROJECTION_Y].yMax, xCenterOnY, yCenterOnY + vertShift, this.m_materialLineBlue), - new Line2D(this.m_scene, this.m_vertLineWidth, xCenterOnY, yCenterOnY - vertShift, xCenterOnY, - this.m_projectionRect[PROJECTION_Y].yMin, this.m_materialLineBlue)]; - this.m_controlLineXOnY = new Line2D(this.m_scene, this.m_vertLineWidth, xCenterOnY, - yCenterOnY + this.m_yControlShift, xCenterOnY, yCenterOnY - this.m_yControlShift, this.m_materialLineBlue); + this.m_linesXOnY = [ + new Line2D( + this.m_scene, + this.m_vertLineWidth, + xCenterOnY, + this.m_projectionRect[PROJECTION_Y].yMax, + xCenterOnY, + yCenterOnY + vertShift, + this.m_materialLineBlue + ), + new Line2D( + this.m_scene, + this.m_vertLineWidth, + xCenterOnY, + yCenterOnY - vertShift, + xCenterOnY, + this.m_projectionRect[PROJECTION_Y].yMin, + this.m_materialLineBlue + ), + ]; + this.m_controlLineXOnY = new Line2D( + this.m_scene, + this.m_vertLineWidth, + xCenterOnY, + yCenterOnY + this.m_yControlShift, + xCenterOnY, + yCenterOnY - this.m_yControlShift, + this.m_materialLineBlue + ); this.m_controlPoint[PROJECTION_Y].x = xCenterOnY; this.m_controlPoint[PROJECTION_Y].y = yCenterOnY; // lines on X - const xCenterOnX = this.m_projectionRect[PROJECTION_X].xMin + this.m_sliceRatio[PROJECTION_Y] * - (this.m_projectionRect[PROJECTION_X].xMax - this.m_projectionRect[PROJECTION_X].xMin); - const yCenterOnX = this.m_projectionRect[PROJECTION_X].yMin + this.m_sliceRatio[PROJECTION_Z] * - (this.m_projectionRect[PROJECTION_X].yMax - this.m_projectionRect[PROJECTION_X].yMin); + const xCenterOnX = + this.m_projectionRect[PROJECTION_X].xMin + + this.m_sliceRatio[PROJECTION_Y] * (this.m_projectionRect[PROJECTION_X].xMax - this.m_projectionRect[PROJECTION_X].xMin); + const yCenterOnX = + this.m_projectionRect[PROJECTION_X].yMin + + this.m_sliceRatio[PROJECTION_Z] * (this.m_projectionRect[PROJECTION_X].yMax - this.m_projectionRect[PROJECTION_X].yMin); // green Y projection line on X projection - this.m_linesYOnX = [new Line2D(this.m_scene, this.m_vertLineWidth, xCenterOnX, - this.m_projectionRect[PROJECTION_X].yMax, xCenterOnX, yCenterOnX + vertShift, this.m_materialLineGreen), - new Line2D(this.m_scene, this.m_vertLineWidth, xCenterOnX, yCenterOnX - vertShift, xCenterOnX, - this.m_projectionRect[PROJECTION_X].yMin, this.m_materialLineGreen)]; - this.m_controlLineYOnX = new Line2D(this.m_scene, this.m_vertLineWidth, xCenterOnX, - yCenterOnX - this.m_yControlShift, xCenterOnX, yCenterOnX + this.m_yControlShift, this.m_materialLineGreen); + this.m_linesYOnX = [ + new Line2D( + this.m_scene, + this.m_vertLineWidth, + xCenterOnX, + this.m_projectionRect[PROJECTION_X].yMax, + xCenterOnX, + yCenterOnX + vertShift, + this.m_materialLineGreen + ), + new Line2D( + this.m_scene, + this.m_vertLineWidth, + xCenterOnX, + yCenterOnX - vertShift, + xCenterOnX, + this.m_projectionRect[PROJECTION_X].yMin, + this.m_materialLineGreen + ), + ]; + this.m_controlLineYOnX = new Line2D( + this.m_scene, + this.m_vertLineWidth, + xCenterOnX, + yCenterOnX - this.m_yControlShift, + xCenterOnX, + yCenterOnX + this.m_yControlShift, + this.m_materialLineGreen + ); this.m_controlPoint[PROJECTION_X].x = xCenterOnX; this.m_controlPoint[PROJECTION_X].y = yCenterOnX; } /** - * Keyboard event handler - */ + * Keyboard event handler + */ // eslint-disable-next-line - onKeyDown() { - } + onKeyDown() {} /** * Mouse events handler * xScr, yScr in [0..1] is normalized mouse coordinate in screen */ onMouseDown(xScr, yScr) { - if ((this.m_objGraphics2d.m_volumeData === null) || (this.m_objGraphics2d.m_volumeHeader === null)) { + if (this.m_objGraphics2d.m_volumeData === null || this.m_objGraphics2d.m_volumeHeader === null) { return; } const TWICE = 2.0; @@ -421,19 +496,23 @@ export default class MprRenderer { const yt = (1.0 - yScr) * TWICE - 1.0; for (let i = 0; i < NUM_PROJECTIONS; ++i) { - if (this.m_projectionRect[i].xMin <= xt && xt <= this.m_projectionRect[i].xMax) { // is in i-th projection - if (this.m_projectionRect[i].yMin <= yt && yt <= this.m_projectionRect[i].yMax) { // is in i-th projection rect - if (this.m_controlPoint[i].y - this.m_yControlShift <= yt && - yt <= this.m_controlPoint[i].y + this.m_yControlShift) { // is near control point for vertical lines - if (i === PROJECTION_Z) { // for z projection (has horizontal line) - if (this.m_controlPoint[i].x - this.m_xControlShift <= xt && - xt <= this.m_controlPoint[i].x + this.m_xControlShift) { // is near control point for horizontal line + if (this.m_projectionRect[i].xMin <= xt && xt <= this.m_projectionRect[i].xMax) { + // is in i-th projection + if (this.m_projectionRect[i].yMin <= yt && yt <= this.m_projectionRect[i].yMax) { + // is in i-th projection rect + if (this.m_controlPoint[i].y - this.m_yControlShift <= yt && yt <= this.m_controlPoint[i].y + this.m_yControlShift) { + // is near control point for vertical lines + if (i === PROJECTION_Z) { + // for z projection (has horizontal line) + if (this.m_controlPoint[i].x - this.m_xControlShift <= xt && xt <= this.m_controlPoint[i].x + this.m_xControlShift) { + // is near control point for horizontal line this.m_runningState = true; this.m_activePlane = i; } else { return; } - } else { // for x and y projections + } else { + // for x and y projections this.m_runningState = true; this.m_activePlane = i; } @@ -461,7 +540,7 @@ export default class MprRenderer { * @param (float) yScr - normalized mouse y coordinate in screen */ onMouseMove(xScr, yScr) { - if ((this.m_objGraphics2d.m_volumeData === null) || (this.m_objGraphics2d.m_volumeHeader === null)) { + if (this.m_objGraphics2d.m_volumeData === null || this.m_objGraphics2d.m_volumeHeader === null) { return; } if (this.m_runningState === false) { @@ -476,29 +555,29 @@ export default class MprRenderer { const xRatio = (xt - activeRect.xMin) / (activeRect.xMax - activeRect.xMin); const yRatio = (yt - activeRect.yMin) / (activeRect.yMax - activeRect.yMin); switch (this.m_activePlane) { - case PROJECTION_X: - this.m_sliceRatio[PROJECTION_Y] = xRatio; - this.m_sliceRatio[PROJECTION_Z] = yRatio; - break; - case PROJECTION_Y: - this.m_sliceRatio[PROJECTION_X] = xRatio; - this.m_sliceRatio[PROJECTION_Z] = yRatio; - break; - case PROJECTION_Z: - this.m_sliceRatio[PROJECTION_X] = xRatio; - this.m_sliceRatio[PROJECTION_Y] = yRatio; - break; - default: - console.log('MPR: Unexpected active plane'); - break; + case PROJECTION_X: + this.m_sliceRatio[PROJECTION_Y] = xRatio; + this.m_sliceRatio[PROJECTION_Z] = yRatio; + break; + case PROJECTION_Y: + this.m_sliceRatio[PROJECTION_X] = xRatio; + this.m_sliceRatio[PROJECTION_Z] = yRatio; + break; + case PROJECTION_Z: + this.m_sliceRatio[PROJECTION_X] = xRatio; + this.m_sliceRatio[PROJECTION_Y] = yRatio; + break; + default: + console.log('MPR: Unexpected active plane'); + break; } // end switch this.updateControlLines(); } } /** - * Action on each render - */ + * Action on each render + */ render() { // console.log('MprRender...'); this.m_renderer.render(this.m_scene, this.m_camera); @@ -522,9 +601,9 @@ export default class MprRenderer { let x = Math.floor(this.m_sliceRatio[PROJECTION_X] * xDim); let y = Math.floor(this.m_sliceRatio[PROJECTION_Y] * yDim); let z = Math.floor(this.m_sliceRatio[PROJECTION_Z] * zDim); - x = (x < xDim) ? x : (xDim - 1); - y = (y < yDim) ? y : (yDim - 1); - z = (z < zDim) ? z : (zDim - 1); + x = x < xDim ? x : xDim - 1; + y = y < yDim ? y : yDim - 1; + z = z < zDim ? z : zDim - 1; this.m_material[PROJECTION_X].m_uniforms.sliceIndex.value = x; this.m_material[PROJECTION_Y].m_uniforms.sliceIndex.value = y; diff --git a/src/demo/engine/tools23d/picktool.js b/src/engine/tools23d/picktool.js similarity index 68% rename from src/demo/engine/tools23d/picktool.js rename to src/engine/tools23d/picktool.js index cbeadec2..f5e94317 100644 --- a/src/demo/engine/tools23d/picktool.js +++ b/src/engine/tools23d/picktool.js @@ -1,21 +1,7 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 2d mode pick tool @@ -79,30 +65,30 @@ export default class PickTool { x = Math.floor(xRatioImage * w); y = Math.floor(yRatioImage * h); z = Math.floor(sliderPosition * zDim); - z = (z <= zDim - 1) ? z : (zDim - 1); + z = z <= zDim - 1 ? z : zDim - 1; } else if (sliceAxis === Graphics2d.SLICE_AXIS_Y) { w = xDim; h = zDim; x = Math.floor(xRatioImage * w); z = Math.floor(yRatioImage * h); y = Math.floor(sliderPosition * yDim); - y = (y <= yDim - 1) ? y : (yDim - 1); + y = y <= yDim - 1 ? y : yDim - 1; } else if (sliceAxis === Graphics2d.SLICE_AXIS_X) { w = yDim; h = zDim; y = Math.floor(xRatioImage * w); z = Math.floor(yRatioImage * h); x = Math.floor(sliderPosition * xDim); - x = (x <= xDim - 1) ? x : (xDim - 1); + x = x <= xDim - 1 ? x : xDim - 1; } - const offDst = x + (y * xDim) + (z * xDim * yDim); + const offDst = x + y * xDim + z * xDim * yDim; const val = this.m_volData[offDst]; const BORDER = 512; const TWICE = 2; const ACCURACY = 2; - const strMsg = `x,y,z = ${(x * zoom + (posX) / TWICE * BORDER).toFixed(ACCURACY)}, - ${(y * zoom - ((posY) / TWICE) * BORDER).toFixed(ACCURACY)},${z}, Value = ${val}`; + const strMsg = `x,y,z = ${(x * zoom + (posX / TWICE) * BORDER).toFixed(ACCURACY)}, + ${(y * zoom - (posY / TWICE) * BORDER).toFixed(ACCURACY)},${z}, Value = ${val}`; // console.log(strMsg); this.m_text = new MeshText2D(strMsg); @@ -111,8 +97,8 @@ export default class PickTool { // eslint-disable-next-line const yt = (1.0 - yScr) * 2.0 - 1.0; - const xAlign = (xRatioImage < 0.5) ? MeshText2D.ALIGN_LEFT : MeshText2D.ALIGN_RIGHT; - const yAlign = (yRatioImage < 0.5) ? MeshText2D.ALIGN_TOP : MeshText2D.ALIGN_BOTTOM; + const xAlign = xRatioImage < 0.5 ? MeshText2D.ALIGN_LEFT : MeshText2D.ALIGN_RIGHT; + const yAlign = yRatioImage < 0.5 ? MeshText2D.ALIGN_TOP : MeshText2D.ALIGN_BOTTOM; // in [0..2] const TEXT_STRING_HEIGHT_SCR = 0.05; const TEXT_BACK_COLOR_MESSAGE = 'rgba(0, 0, 0, 255)'; @@ -128,7 +114,7 @@ export default class PickTool { const curTime = d.getTime(); const delta = curTime - this.m_textTime; const TIME_TO_REMOVE_STRING = 2000; - if ((this.m_text !== null) && (delta > TIME_TO_REMOVE_STRING)) { + if (this.m_text !== null && delta > TIME_TO_REMOVE_STRING) { this.m_scene.remove(this.m_text); this.m_text = null; this.m_textTime = -10000; diff --git a/src/demo/engine/tools23d/recttool.js b/src/engine/tools23d/recttool.js similarity index 78% rename from src/demo/engine/tools23d/recttool.js rename to src/engine/tools23d/recttool.js index 970d69d7..8adb4ae8 100644 --- a/src/demo/engine/tools23d/recttool.js +++ b/src/engine/tools23d/recttool.js @@ -1,21 +1,7 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 2d area tool @@ -109,7 +95,8 @@ export default class RectTool { this.m_areas[i].linex2 = linex2; const liney2 = new Line2D(this.m_scene, this.m_lineWidth, xE, yS, xE, yE, this.m_linesMaterial); this.m_areas[i].liney2 = liney2; - let xText = xE, yText = yE; + let xText = xE, + yText = yE; const INDENTATION = 0.05; if (yS < yE) { yText = this.m_yStart; @@ -119,8 +106,15 @@ export default class RectTool { } xText += INDENTATION; yText -= INDENTATION; - this.m_areas[i].text.updateText(xText, yText, this.m_textWidthScr, - MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + this.m_areas[i].text.updateText( + xText, + yText, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_CENTER, + this.m_textBgColor, + this.m_textColor + ); this.m_scene.add(this.m_areas[i].text); } } @@ -130,7 +124,8 @@ export default class RectTool { * @param (float) xPixelSize - canvas pixel size in mm for x axis * @param (float) yPixelSize - canvas pixel size in mm for y axis */ - setPixelSize(xPixelSize, yPixelSize) { // in mm + setPixelSize(xPixelSize, yPixelSize) { + // in mm this.m_xPixelSize = xPixelSize; this.m_yPixelSize = yPixelSize; } @@ -156,20 +151,21 @@ export default class RectTool { this.m_xStart = x; this.m_yStart = y; - const linex1 = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, - this.m_yStart, x, this.m_yStart, this.m_linesMaterial); - const liney1 = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, - this.m_yStart, this.m_xStart, y, this.m_linesMaterial); + const linex1 = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, this.m_yStart, x, this.m_yStart, this.m_linesMaterial); + const liney1 = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, this.m_yStart, this.m_xStart, y, this.m_linesMaterial); const linex2 = new Line2D(this.m_scene, this.m_lineWidth, x, y, this.m_xStart, y, this.m_linesMaterial); const liney2 = new Line2D(this.m_scene, this.m_lineWidth, x, y, x, this.m_yStart, this.m_linesMaterial); const strMsg = '0 mm^2'; const text = new MeshText2D(strMsg); - text.updateText(x, y, this.m_textWidthScr, MeshText2D.ALIGN_CENTER, - MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + text.updateText(x, y, this.m_textWidthScr, MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); this.m_scene.add(text); this.m_areas.push({ - linex1, liney1, linex2, liney2, text + linex1, + liney1, + linex2, + liney2, + text, }); this.m_vertexes.push({ xZ, yZ }); } else { @@ -192,22 +188,27 @@ export default class RectTool { this.m_scene.remove(area.liney1.getRenderObject()); this.m_scene.remove(area.liney2.getRenderObject()); - const linex1 = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, - this.m_yStart, x, this.m_yStart, this.m_linesMaterial); - const liney1 = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, - this.m_yStart, this.m_xStart, y, this.m_linesMaterial); + const linex1 = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, this.m_yStart, x, this.m_yStart, this.m_linesMaterial); + const liney1 = new Line2D(this.m_scene, this.m_lineWidth, this.m_xStart, this.m_yStart, this.m_xStart, y, this.m_linesMaterial); const linex2 = new Line2D(this.m_scene, this.m_lineWidth, x, y, this.m_xStart, y, this.m_linesMaterial); const liney2 = new Line2D(this.m_scene, this.m_lineWidth, x, y, x, this.m_yStart, this.m_linesMaterial); this.m_scene.remove(area.text); - const strMsg = `${(Math.abs(x - this.m_xStart) * this.m_xPixelSize * - // eslint-disable-next-line - Math.abs(y - this.m_yStart) * this.m_yPixelSize * zoom * zoom).toFixed(2)} mm^2`; + const strMsg = `${( + Math.abs(x - this.m_xStart) * + this.m_xPixelSize * + // eslint-disable-next-line + Math.abs(y - this.m_yStart) * + this.m_yPixelSize * + zoom * + zoom + ).toFixed(2)} mm^2`; const text = new MeshText2D(strMsg); - let xText = x, yText = y; + let xText = x, + yText = y; const INDENTATION = 0.05; if (this.m_yStart < y) { yText = this.m_yStart; @@ -217,12 +218,23 @@ export default class RectTool { } xText += INDENTATION; yText -= INDENTATION; - text.updateText(xText, yText, this.m_textWidthScr, - MeshText2D.ALIGN_CENTER, MeshText2D.ALIGN_CENTER, this.m_textBgColor, this.m_textColor); + text.updateText( + xText, + yText, + this.m_textWidthScr, + MeshText2D.ALIGN_CENTER, + MeshText2D.ALIGN_CENTER, + this.m_textBgColor, + this.m_textColor + ); this.m_scene.add(text); this.m_areas.push({ - linex1, liney1, linex2, liney2, text + linex1, + liney1, + linex2, + liney2, + text, }); } } diff --git a/src/demo/engine/tools23d/text2d.js b/src/engine/tools23d/text2d.js similarity index 54% rename from src/demo/engine/tools23d/text2d.js rename to src/engine/tools23d/text2d.js index 2857da77..f0eb1b1a 100644 --- a/src/demo/engine/tools23d/text2d.js +++ b/src/engine/tools23d/text2d.js @@ -1,26 +1,12 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* 2d text render -* @module lib/scripts/graphics2d/text2d -*/ + * 2d text render + * @module lib/scripts/graphics2d/text2d + */ import * as THREE from 'three'; diff --git a/src/demo/engine/tools23d/texttool.js b/src/engine/tools23d/texttool.js similarity index 74% rename from src/demo/engine/tools23d/texttool.js rename to src/engine/tools23d/texttool.js index c2a9bd2e..a67ea21f 100644 --- a/src/demo/engine/tools23d/texttool.js +++ b/src/engine/tools23d/texttool.js @@ -1,21 +1,7 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 2d text tool @@ -76,8 +62,15 @@ export default class TextTool { } const xText = (this.m_vertexes[i].xZ - posX) / zoom - (1 - 1 / zoom); const yText = (this.m_vertexes[i].yZ - posY) / zoom + (1 - 1 / zoom); - this.m_textArr[i].updateText(xText, yText, this.m_textWidthScr, - MeshText2D.ALIGN_LEFT, MeshText2D.ALIGN_TOP, this.m_textBgColor, this.m_textColor); + this.m_textArr[i].updateText( + xText, + yText, + this.m_textWidthScr, + MeshText2D.ALIGN_LEFT, + MeshText2D.ALIGN_TOP, + this.m_textBgColor, + this.m_textColor + ); this.m_scene.add(this.m_textArr[i]); } } @@ -87,8 +80,15 @@ export default class TextTool { this.m_vertexes[i].yZ = (newY - (1 - 1 / zoom)) * zoom + posY; const xText = (this.m_vertexes[i].xZ - posX) / zoom - (1 - 1 / zoom); const yText = (this.m_vertexes[i].yZ - posY) / zoom + (1 - 1 / zoom); - this.m_textArr[i].updateText(xText, yText, this.m_textWidthScr, - MeshText2D.ALIGN_LEFT, MeshText2D.ALIGN_TOP, this.m_textBgColor, this.m_textColor); + this.m_textArr[i].updateText( + xText, + yText, + this.m_textWidthScr, + MeshText2D.ALIGN_LEFT, + MeshText2D.ALIGN_TOP, + this.m_textBgColor, + this.m_textColor + ); } /** @@ -96,7 +96,8 @@ export default class TextTool { * @param (float) xPixelSize - canvas pixel size in mm for x axis * @param (float) yPixelSize - canvas pixel size in mm for y axis */ - setPixelSize(xPixelSize, yPixelSize) { // in mm + setPixelSize(xPixelSize, yPixelSize) { + // in mm this.m_xPixelSize = xPixelSize; this.m_yPixelSize = yPixelSize; } @@ -119,8 +120,15 @@ export default class TextTool { if (this.m_curX !== -1 && this.m_curY !== -1) { if (text !== '') { const textMesh = new MeshText2D(text); - textMesh.updateText(this.m_curX, this.m_curY, this.m_textWidthScr, MeshText2D.ALIGN_LEFT, - MeshText2D.ALIGN_TOP, this.m_textBgColor, this.m_textColor); + textMesh.updateText( + this.m_curX, + this.m_curY, + this.m_textWidthScr, + MeshText2D.ALIGN_LEFT, + MeshText2D.ALIGN_TOP, + this.m_textBgColor, + this.m_textColor + ); this.m_scene.add(textMesh); this.m_textArr.push(textMesh); const xZ = this.m_curX; @@ -147,8 +155,7 @@ export default class TextTool { removeCurTextByCoords() { for (let i = 0; i < this.m_textArr.length; ++i) { const mesh = this.m_textArr[i]; - if (mesh.m_xMin <= this.m_curX && this.m_curX <= mesh.m_xMax - && mesh.m_yMin <= this.m_curY && this.m_curY <= mesh.m_yMax) { + if (mesh.m_xMin <= this.m_curX && this.m_curX <= mesh.m_xMax && mesh.m_yMin <= this.m_curY && this.m_curY <= mesh.m_yMax) { const text = mesh.getText(); this.m_curX = mesh.m_xMin; this.m_curY = mesh.m_yMax; diff --git a/src/demo/engine/tools23d/zoomtool.js b/src/engine/tools23d/zoomtool.js similarity index 51% rename from src/demo/engine/tools23d/zoomtool.js rename to src/engine/tools23d/zoomtool.js index 6c1b2a18..152adebb 100644 --- a/src/demo/engine/tools23d/zoomtool.js +++ b/src/engine/tools23d/zoomtool.js @@ -1,28 +1,13 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 2d area tool * @module app/scripts/graphics2d/areatool */ - export default class ZoomTool { /** * Initialize area tool @@ -52,7 +37,7 @@ export default class ZoomTool { const MAX_ZOOM = 1; const MIN_ZOOM = 0.125; const TRANSFORM = 0.0001; - if ((this.m_zoom + wheelDeltaY * TRANSFORM >= MIN_ZOOM) && (this.m_zoom + wheelDeltaY * TRANSFORM <= MAX_ZOOM)) { + if (this.m_zoom + wheelDeltaY * TRANSFORM >= MIN_ZOOM && this.m_zoom + wheelDeltaY * TRANSFORM <= MAX_ZOOM) { this.m_zoom = this.m_zoom + wheelDeltaY * TRANSFORM; } } diff --git a/src/demo/engine/tools2d/ToolAngle.js b/src/engine/tools2d/ToolAngle.js similarity index 93% rename from src/demo/engine/tools2d/ToolAngle.js rename to src/engine/tools2d/ToolAngle.js index cb4c3f15..c8a0d03a 100644 --- a/src/demo/engine/tools2d/ToolAngle.js +++ b/src/engine/tools2d/ToolAngle.js @@ -1,10 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview ToolAngle * @author Epam * @version 1.0.0 */ - // ********************************************** // Imports // ********************************************** @@ -23,15 +27,18 @@ class ToolAngle { this.m_hScreen = 0; const v0 = { - x: 0.0, y: 0.0 + x: 0.0, + y: 0.0, }; const v1 = { - x: 0.0, y: 0.0 + x: 0.0, + y: 0.0, }; const v2 = { - x: 0.0, y: 0.0 + x: 0.0, + y: 0.0, }; - this.m_points = [ v0, v1, v2 ]; + this.m_points = [v0, v1, v2]; this.m_numClicks = 0; this.m_angles = []; @@ -60,9 +67,9 @@ class ToolAngle { * Determine intersection with points in lines set. * Input - screen coordinates of pick point * Output - volume coordinate - * + * * @param {object} vScr - screen coordinates of poick - * @param {object} store - global store + * @param {object} store - global store */ getEditPoint(vScr, store) { const numObj = this.m_angles.length; @@ -94,7 +101,7 @@ class ToolAngle { // update angle dist this.getAngleForObj(this.m_objEdit); } - + /** * Remove highlighted object */ @@ -110,8 +117,7 @@ class ToolAngle { getDistMm(vs, ve) { const dx = vs.x - ve.x; const dy = vs.y - ve.y; - const dist = Math.sqrt(dx * dx * this.m_xPixelSize * this.m_xPixelSize + - dy * dy * this.m_yPixelSize * this.m_yPixelSize); + const dist = Math.sqrt(dx * dx * this.m_xPixelSize * this.m_xPixelSize + dy * dy * this.m_yPixelSize * this.m_yPixelSize); return dist; } @@ -143,7 +149,7 @@ class ToolAngle { // console.log('get Angle < -1'); return 180.0; } - const ang = Math.acos(cosAlp) * M_180 / M_PI; + const ang = (Math.acos(cosAlp) * M_180) / M_PI; return ang; } @@ -179,7 +185,7 @@ class ToolAngle { const ang = this.getAngle(); const objAngle = { - points: [ v0, v1, v2 ], + points: [v0, v1, v2], angle: ang, }; this.m_angles.push(objAngle); @@ -203,7 +209,8 @@ class ToolAngle { this.m_objGraphics2d.forceUpdate(); } - onMouseUp() { // ommited args: xScr, yScr, store + onMouseUp() { + // ommited args: xScr, yScr, store } clear() { @@ -213,7 +220,7 @@ class ToolAngle { // // render lines on screen - // + // render(ctx, store) { const NUM_3 = 3; @@ -226,7 +233,7 @@ class ToolAngle { ctx.textBaseline = 'top'; if (this.m_numClicks > 0) { - for(let i = 1; i < NUM_3; i++) { + for (let i = 1; i < NUM_3; i++) { const vTex0 = this.m_points[0]; const vTex1 = this.m_points[i]; const vs = ToolDistance.textureToScreen(vTex0.x, vTex0.y, this.m_wScreen, this.m_hScreen, store); @@ -234,7 +241,7 @@ class ToolAngle { const dx = vs.x - ve.x; const dy = vs.y - ve.y; const MIN_DIST2 = 2 * 2; - if ((dx * dx) + (dy * dy) >= MIN_DIST2) { + if (dx * dx + dy * dy >= MIN_DIST2) { ctx.beginPath(); ctx.moveTo(vs.x, vs.y); ctx.lineTo(ve.x, ve.y); @@ -253,7 +260,6 @@ class ToolAngle { const xText = vs0.x; const yText = vs0.y + SHIFT_UP; ctx.fillText(strMsg, xText, yText); - } // if we have angle under build // draw ready angles @@ -278,11 +284,7 @@ class ToolAngle { const xText = vs0.x; const yText = vs0.y + SHIFT_UP; ctx.fillText(strMsg, xText, yText); - } // for all angles } // end render - - } // end class export default ToolAngle; - diff --git a/src/demo/engine/tools2d/ToolArea.js b/src/engine/tools2d/ToolArea.js similarity index 91% rename from src/demo/engine/tools2d/ToolArea.js rename to src/engine/tools2d/ToolArea.js index 5aed11e2..ca6dfe00 100644 --- a/src/demo/engine/tools2d/ToolArea.js +++ b/src/engine/tools2d/ToolArea.js @@ -1,10 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview ToolArea * @author Epam * @version 1.0.0 */ - // ********************************************** // Imports // ********************************************** @@ -58,14 +62,14 @@ class ToolArea { * Determine intersection with points in areas set. * Input - screen coordinates of pick point * Output - volume coordinate - * + * * @param {object} vScr - screen coordinates of poick * @param {object} store - global store */ getEditPoint(vScr, store) { this.store = store; const numAreas = this.m_areas.length; - for(let i = 0 ; i < numAreas; i++) { + for (let i = 0; i < numAreas; i++) { const objArea = this.m_areas[i]; for (let j = 0; j < objArea.m_points.length; j++) { const vScrProj = ToolDistance.textureToScreen(objArea.m_points[j].x, objArea.m_points[j].y, this.m_wScreen, this.m_hScreen, store); @@ -81,9 +85,9 @@ class ToolArea { /** * Move edited point into new pos - * - * @param {object} vVolOld - * @param {object} vVolNew + * + * @param {object} vVolOld + * @param {object} vVolNew */ moveEditPoint(vVolOld, vVolNew) { const x = vVolOld.x; @@ -118,18 +122,17 @@ class ToolArea { getDistMm(vs, ve) { const dx = vs.x - ve.x; const dy = vs.y - ve.y; - const dist = Math.sqrt(dx * dx * this.m_xPixelSize * this.m_xPixelSize + - dy * dy * this.m_yPixelSize * this.m_yPixelSize); + const dist = Math.sqrt(dx * dx * this.m_xPixelSize * this.m_xPixelSize + dy * dy * this.m_yPixelSize * this.m_yPixelSize); return dist; } /** * Get lines intersection in 2d - * - * @param {object} v0 - * @param {object} v1 - * @param {object} v2 - * @param {object} v3 + * + * @param {object} v0 + * @param {object} v1 + * @param {object} v2 + * @param {object} v3 * @return {object} point (object with x,y) of intersection or null */ static getLineIntersection(v0, v1, v2, v3) { @@ -156,7 +159,7 @@ class ToolArea { return null; } const t01 = dotUp / dotDn; // should be in [0..1] - if ((t01 < 0.0) || (t01 > 1.0)) { + if (t01 < 0.0 || t01 > 1.0) { return null; } // check intersect from 2nd line @@ -166,7 +169,7 @@ class ToolArea { }; const n01 = { x: -v01.y, - y: v01.x + y: v01.x, }; const dotProdDn = v23.x * n01.x + v23.y * n01.y; if (Math.abs(dotProdDn) < TOO_SMALL) { @@ -174,12 +177,12 @@ class ToolArea { } const dotProdUp = v20.x * n01.x + v20.y * n01.y; const t23 = dotProdUp / dotProdDn; // should be in [0..1] - if ((t23 < 0.0) || (t23 > 1.0)) { + if (t23 < 0.0 || t23 > 1.0) { return null; } const vIntersection = { x: v0.x + v01.x * t01, - y: v0.y + v01.y * t01 + y: v0.y + v01.y * t01, }; return vIntersection; } @@ -187,12 +190,12 @@ class ToolArea { static hasSelfIntersection(points) { let i, j; for (i = 0; i < points.length; i++) { - const iNext = (i + 1 < points.length) ? (i + 1) : 0; + const iNext = i + 1 < points.length ? i + 1 : 0; const vA = points[i]; const vB = points[iNext]; for (j = 0; j < points.length; j++) { - const jNext = (j + 1 < points.length) ? (j + 1) : 0; - if ((i !== j) && (i !== jNext) && (iNext !== j) && (iNext !== jNext)) { + const jNext = j + 1 < points.length ? j + 1 : 0; + if (i !== j && i !== jNext && iNext !== j && iNext !== jNext) { const vC = points[j]; const vD = points[jNext]; const vIntersect = ToolArea.getLineIntersection(vA, vB, vC, vD); @@ -200,7 +203,6 @@ class ToolArea { return true; } } // if not same index - } // for (j) } // for (i) return false; @@ -221,8 +223,8 @@ class ToolArea { if (vIntersect !== null) { const objInter = { m_vIntersection: vIntersect, - m_lineIndex: i - } + m_lineIndex: i, + }; return objInter; } } // for (i) checked points in poly @@ -238,8 +240,8 @@ class ToolArea { }; const objInter = { m_vIntersection: vInter, - m_lineIndex: 0 - } + m_lineIndex: 0, + }; // console.log('getSelfIntersection: detect with start'); return objInter; } @@ -247,7 +249,7 @@ class ToolArea { } /** - * + * * @param {object} vNew - new added point * @param {array} points - array of polygon's points * @return true, if polygon is finished @@ -265,8 +267,8 @@ class ToolArea { for (let i = objInter.m_lineIndex + 1; i < numPoints - 1; i++) { const vAdd = { x: points[i].x, - y: points[i].y - } + y: points[i].y, + }; polyNew.push(vAdd); } // copy to points @@ -285,7 +287,7 @@ class ToolArea { } /** - * + * * @param {array} points - array of points (x,y) props */ getPolyArea(points, store) { @@ -301,7 +303,8 @@ class ToolArea { const yDim = vol.m_yDim; const zDim = vol.m_zDim; // const zDim = vol.m_zDim; - let xScale = 0.0, yScale = 0.0; + let xScale = 0.0, + yScale = 0.0; if (mode2d === Modes2d.TRANSVERSE) { // z const xScale = xSize / xDim; @@ -325,7 +328,7 @@ class ToolArea { const vi = points[i]; const vj = points[j]; let areaTri = (vj.x + vi.x) * (vj.y - vi.y) * xScale * yScale; - areaTri = (areaTri > 0.0) ? areaTri : (-areaTri); + areaTri = areaTri > 0.0 ? areaTri : -areaTri; area += areaTri; j = i; } @@ -334,7 +337,7 @@ class ToolArea { /** * When mouse button is pressed - * + * * @param {number} xScr - x screen coordinate * @param {number} yScr - y screen coordinate * @param {object} store - global store with all app parameters @@ -347,15 +350,15 @@ class ToolArea { const v0 = { x: vTex.x, y: vTex.y, - } + }; const v1 = { x: vTex.x, y: vTex.y, - } + }; const objArea = { m_isClosed: false, m_points: [], - m_area: 0.0 + m_area: 0.0, }; objArea.m_points.push(v0); objArea.m_points.push(v1); @@ -364,7 +367,7 @@ class ToolArea { // add new point to polygon const vNew = { x: vTex.x, - y: vTex.y + y: vTex.y, }; const numAreas = this.m_areas.length; const objArea = this.m_areas[numAreas - 1]; @@ -382,7 +385,7 @@ class ToolArea { /** * When mouse is moved - * + * * @param {number} xScr - x screen coordinate * @param {number} yScr - y screen coordinate * @param {object} store - global store with all app parameters @@ -403,12 +406,13 @@ class ToolArea { this.m_objGraphics2d.forceUpdate(); } - onMouseUp() { // ommited args: xScr, yScr, store + onMouseUp() { + // ommited args: xScr, yScr, store } /** * Render all areas on screen in 2d mode - * + * * @param {object} ctx - html5 canvas context * @param {object} store - global store with app parameters */ @@ -432,7 +436,6 @@ class ToolArea { const TWO = 2; ctx.arc(vScr.x, vScr.y, RAD_CIRCLE, 0.0, TWO * M_PI); ctx.stroke(); - } ctx.strokeStyle = 'yellow'; @@ -440,7 +443,7 @@ class ToolArea { for (let a = 0; a < numAreas; a++) { const objArea = this.m_areas[a]; const isClosed = objArea.m_isClosed; - const numPoints = (isClosed) ? (objArea.m_points.length + 1) : (objArea.m_points.length); + const numPoints = isClosed ? objArea.m_points.length + 1 : objArea.m_points.length; // console.log(`ToolArea. render ${numPoints} points in poly`); // calc area centroid in screen @@ -449,7 +452,7 @@ class ToolArea { ctx.beginPath(); for (let i = 0; i < numPoints; i++) { - const iPoly = (i < objArea.m_points.length) ? (i) : 0; + const iPoly = i < objArea.m_points.length ? i : 0; const vTex0 = objArea.m_points[iPoly]; // console.log(`ToolArea. render point ${vTex0.x}, ${vTex0.y} `); const vScr = ToolDistance.textureToScreen(vTex0.x, vTex0.y, this.m_wScreen, this.m_hScreen, store); @@ -482,6 +485,5 @@ class ToolArea { } // if this poly closed } // for (a) all polys } - } // end class export default ToolArea; diff --git a/src/demo/engine/tools2d/ToolClear.js b/src/engine/tools2d/ToolClear.js similarity index 80% rename from src/demo/engine/tools2d/ToolClear.js rename to src/engine/tools2d/ToolClear.js index 92412018..aeff61d5 100644 --- a/src/demo/engine/tools2d/ToolClear.js +++ b/src/engine/tools2d/ToolClear.js @@ -1,10 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview ToolClear * @author Epam * @version 1.0.0 */ - // ********************************************** // Imports // ********************************************** diff --git a/src/demo/engine/tools2d/ToolDelete.js b/src/engine/tools2d/ToolDelete.js similarity index 88% rename from src/demo/engine/tools2d/ToolDelete.js rename to src/engine/tools2d/ToolDelete.js index b787d54a..42c8a6e6 100644 --- a/src/demo/engine/tools2d/ToolDelete.js +++ b/src/engine/tools2d/ToolDelete.js @@ -1,10 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview ToolDelete * @author Epam * @version 1.0.0 */ - // ********************************************** // Imports // ********************************************** @@ -52,8 +56,9 @@ class ToolDelete { /** * When mouse pressed down - */ - onMouseDown() { // ommited args: xScr, yScr, store + */ + onMouseDown() { + // ommited args: xScr, yScr, store this.m_mousePressed = true; if (this.m_pointTracked !== null) { @@ -68,7 +73,8 @@ class ToolDelete { if (!this.m_mousePressed) { // fly mouse over objects on 2d screen const vScr = { - x: xScr, y: yScr + x: xScr, + y: yScr, }; const toolDist = this.m_objGraphics2d.m_toolDistance; @@ -76,10 +82,8 @@ class ToolDelete { const toolArea = this.m_objGraphics2d.m_toolArea; const toolRect = this.m_objGraphics2d.m_toolRect; const toolText = this.m_objGraphics2d.m_toolText; - const tools = [ - toolDist, toolAngle, toolArea, toolRect, toolText - ]; - const trackedBefore = (this.m_pointTracked !== null); + const tools = [toolDist, toolAngle, toolArea, toolRect, toolText]; + const trackedBefore = this.m_pointTracked !== null; this.m_pointTracked = null; const numTools = tools.length; for (let i = 0; i < numTools; i++) { @@ -92,12 +96,11 @@ class ToolDelete { break; } } // for i all tools - const trackedNow = (this.m_pointTracked !== null); + const trackedNow = this.m_pointTracked !== null; if (trackedNow || (trackedBefore && !trackedNow)) { // invoke forced 2d render this.m_objGraphics2d.forceUpdate(); } - } else { /* if (this.m_pointTracked !== null) { @@ -110,13 +113,14 @@ class ToolDelete { } } - onMouseUp() { // ommited args: xScr, yScr, store + onMouseUp() { + // ommited args: xScr, yScr, store this.m_mousePressed = false; } /** * Render all areas on screen in 2d mode - * + * * @param {object} ctx - html5 canvas context * @param {object} store - global store with app parameters */ diff --git a/src/demo/engine/tools2d/ToolDistance.js b/src/engine/tools2d/ToolDistance.js similarity index 91% rename from src/demo/engine/tools2d/ToolDistance.js rename to src/engine/tools2d/ToolDistance.js index 99959ebc..16e7a9cb 100644 --- a/src/demo/engine/tools2d/ToolDistance.js +++ b/src/engine/tools2d/ToolDistance.js @@ -1,10 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview ToolDistance * @author Epam * @version 1.0.0 */ - // ********************************************** // Imports // ********************************************** @@ -20,7 +24,7 @@ class ToolDistance { this.m_objGraphics2d = objGra; this.m_wScreen = 0; this.m_hScreen = 0; - + this.m_pointStart = null; this.m_lines = []; this.m_mouseDown = false; @@ -37,9 +41,9 @@ class ToolDistance { } /** - * + * * @param {number} xs - world units hor / volume pixels (x) - * @param {number} ys - world units ver / volume pixels (y) + * @param {number} ys - world units ver / volume pixels (y) */ setPixelSize(xs, ys) { this.m_xPixelSize = xs; @@ -50,7 +54,7 @@ class ToolDistance { * Determine intersection with points in lines set. * Input - screen coordinates of pick point * Output - volume coordinate - * + * * @param {object} vScr - screen coordinates of poick * @param {object} store - global store */ @@ -75,9 +79,9 @@ class ToolDistance { /** * Move edited point into new pos - * - * @param {object} vVolOld - * @param {object} vVolNew + * + * @param {object} vVolOld + * @param {object} vVolNew */ moveEditPoint(vVolOld, vVolNew) { vVolOld.x = vVolNew.x; @@ -143,7 +147,7 @@ class ToolDistance { y: 0.0, }; const mode2d = store.mode2d; - const volSet = store.volumeSet; + const volSet = store.volumeSet; const vol = volSet.getVolume(store.volumeIndex); const xDim = vol.m_xDim; const yDim = vol.m_yDim; @@ -153,18 +157,18 @@ class ToolDistance { const yPos = store.render2dyPos; if (mode2d === Modes2d.TRANSVERSE) { // z const - vScr.x = ((xTex / xDim) - xPos) / zoom; - vScr.y = ((yTex / yDim) - yPos) / zoom; + vScr.x = (xTex / xDim - xPos) / zoom; + vScr.y = (yTex / yDim - yPos) / zoom; } if (mode2d === Modes2d.SAGGITAL) { // x const - vScr.x = ((xTex / yDim) - xPos) / zoom; - vScr.y = ((yTex / zDim) - yPos) / zoom; + vScr.x = (xTex / yDim - xPos) / zoom; + vScr.y = (yTex / zDim - yPos) / zoom; } if (mode2d === Modes2d.CORONAL) { // y const - vScr.x = ((xTex / xDim) - xPos) / zoom; - vScr.y = ((yTex / zDim) - yPos) / zoom; + vScr.x = (xTex / xDim - xPos) / zoom; + vScr.y = (yTex / zDim - yPos) / zoom; } vScr.x *= wScr; vScr.y *= hScr; @@ -174,8 +178,7 @@ class ToolDistance { getDistMm(vs, ve) { const dx = vs.x - ve.x; const dy = vs.y - ve.y; - const dist = Math.sqrt(dx * dx * this.m_xPixelSize * this.m_xPixelSize + - dy * dy * this.m_yPixelSize * this.m_yPixelSize); + const dist = Math.sqrt(dx * dx * this.m_xPixelSize * this.m_xPixelSize + dy * dy * this.m_yPixelSize * this.m_yPixelSize); return dist; } @@ -187,7 +190,7 @@ class ToolDistance { }; const vEnd = { x: vTex.x, - y: vTex.y + y: vTex.y, }; const objLine = { vs: vStart, @@ -223,7 +226,8 @@ class ToolDistance { } // if num lines more 0 } - onMouseUp() { // omitted args: xScr, yScr, store + onMouseUp() { + // omitted args: xScr, yScr, store this.m_mouseDown = false; const numLines = this.m_lines.length; if (numLines > 0) { @@ -236,7 +240,6 @@ class ToolDistance { console.log('ToolDistance: pop last line'); } // if last line is long enough } // if num lines more 0 - } clear() { @@ -245,7 +248,7 @@ class ToolDistance { // // render lines on screen - // + // render(ctx, store) { const numLines = this.m_lines.length; ctx.lineWidth = 2; @@ -273,7 +276,6 @@ class ToolDistance { ctx.fillText(strMsg, xText, yText); } } - } // end class export default ToolDistance; diff --git a/src/demo/engine/tools2d/ToolEdit.js b/src/engine/tools2d/ToolEdit.js similarity index 87% rename from src/demo/engine/tools2d/ToolEdit.js rename to src/engine/tools2d/ToolEdit.js index 604a1b6d..5f08d6be 100644 --- a/src/demo/engine/tools2d/ToolEdit.js +++ b/src/engine/tools2d/ToolEdit.js @@ -1,15 +1,19 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview ToolEdit * @author Epam * @version 1.0.0 */ - // ********************************************** // Imports // ********************************************** -import ToolDistance from "./ToolDistance"; +import ToolDistance from './ToolDistance'; // ********************************************** // Class @@ -52,12 +56,13 @@ class ToolEdit { /** * When mouse pressed down - * + * * @param {number} xScr - x coordinate of click on screen * @param {number} yScr - y coordinate of click on screen * @param {object} store - global storage - */ - onMouseDown() { // ommited args: xScr, yScr, store + */ + onMouseDown() { + // ommited args: xScr, yScr, store this.m_mousePressed = true; } @@ -66,7 +71,8 @@ class ToolEdit { // fly mouse over objects on 2d screen // const vTex = ToolDistance.screenToTexture(xScr, yScr, this.m_wScreen, this.m_hScreen, store); const vScr = { - x: xScr, y: yScr + x: xScr, + y: yScr, }; const toolDist = this.m_objGraphics2d.m_toolDistance; @@ -74,10 +80,8 @@ class ToolEdit { const toolArea = this.m_objGraphics2d.m_toolArea; const toolRect = this.m_objGraphics2d.m_toolRect; const toolText = this.m_objGraphics2d.m_toolText; - const tools = [ - toolDist, toolAngle, toolArea, toolRect, toolText - ]; - const trackedBefore = (this.m_pointTracked !== null); + const tools = [toolDist, toolAngle, toolArea, toolRect, toolText]; + const trackedBefore = this.m_pointTracked !== null; this.m_pointTracked = null; const numTools = tools.length; for (let i = 0; i < numTools; i++) { @@ -90,12 +94,11 @@ class ToolEdit { break; } } // for i all tools - const trackedNow = (this.m_pointTracked !== null); + const trackedNow = this.m_pointTracked !== null; if (trackedNow || (trackedBefore && !trackedNow)) { // invoke forced 2d render this.m_objGraphics2d.forceUpdate(); } - } else { if (this.m_pointTracked !== null) { const vTexNew = ToolDistance.screenToTexture(xScr, yScr, this.m_wScreen, this.m_hScreen, store); @@ -106,13 +109,14 @@ class ToolEdit { } } - onMouseUp() { // ommited args : xScr, yScr, store + onMouseUp() { + // ommited args : xScr, yScr, store this.m_mousePressed = false; } /** * Render all areas on screen in 2d mode - * + * * @param {object} ctx - html5 canvas context * @param {object} store - global store with app parameters */ diff --git a/src/demo/engine/tools2d/ToolPick.js b/src/engine/tools2d/ToolPick.js similarity index 86% rename from src/demo/engine/tools2d/ToolPick.js rename to src/engine/tools2d/ToolPick.js index 9e619a62..0bc5ffe5 100644 --- a/src/demo/engine/tools2d/ToolPick.js +++ b/src/engine/tools2d/ToolPick.js @@ -1,10 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview ToolPick * @author Epam * @version 1.0.0 */ - // ********************************************** // Imports // ********************************************** @@ -33,11 +37,11 @@ class ToolPick { } /** - * @param {number} xScr - relative x screen position. In [0..1] - * @param {number} yScr - relative y screen position. In [0..1] - * @param {object} store - global parameters store - * @return object with props x,y,z - texture coordinates - */ + * @param {number} xScr - relative x screen position. In [0..1] + * @param {number} yScr - relative y screen position. In [0..1] + * @param {object} store - global parameters store + * @return object with props x,y,z - texture coordinates + */ screenToTexture(xScr, yScr, store) { const vTex = { x: 0.0, @@ -45,7 +49,7 @@ class ToolPick { z: 0.0, }; const mode2d = store.mode2d; - const sliderPosition = store.slider2d; + const sliderPosition = store.sliceRatio; const volSet = store.volumeSet; const volIndex = store.volumeIndex; @@ -79,14 +83,14 @@ class ToolPick { } onMouseDown(xScr, yScr, store) { - if ((this.m_wScreen === 0) || (this.m_hScreen === 0)) { + if (this.m_wScreen === 0 || this.m_hScreen === 0) { console.log('ToolPick. onMouseDown. Bad screen size'); return; } const xRatioImage = xScr / this.m_wScreen; const yRatioImage = yScr / this.m_hScreen; - if ((xRatioImage > 1.0) || (yRatioImage > 1.0)) { + if (xRatioImage > 1.0 || yRatioImage > 1.0) { // out if rendered image return; } @@ -119,7 +123,7 @@ class ToolPick { const ONE = 1; const FOUR = 4; const bpp = vol.m_bytesPerVoxel; - let off = vTex.x + (vTex.y * xDim) + (vTex.z * xDim * yDim); + let off = vTex.x + vTex.y * xDim + vTex.z * xDim * yDim; let val = 0; if (bpp === ONE) { val = vol.m_dataArray[off]; @@ -127,15 +131,13 @@ class ToolPick { off = off * FOUR; val = vol.m_dataArray[off]; } - + this.m_xMessage = xScr; this.m_yMessage = yScr; - this.m_strMessage = 'x,y,z = ' + (vTex.x).toString() + ', ' + (vTex.y).toString() + ', ' + (vTex.z).toString() + - '. val = ' + val.toString(); + this.m_strMessage = 'x,y,z = ' + vTex.x.toString() + ', ' + vTex.y.toString() + ', ' + vTex.z.toString() + '. val = ' + val.toString(); // console.log(`ToolPick. onMouseDown. ${this.m_strMessage}`); this.m_timeStart = Date.now(); - setTimeout(this.onTimerEnd, 1500); - + setTimeout(this.onTimerEnd, 6000); } // end onMouseDown onTimerEnd() { diff --git a/src/demo/engine/tools2d/ToolRect.js b/src/engine/tools2d/ToolRect.js similarity index 91% rename from src/demo/engine/tools2d/ToolRect.js rename to src/engine/tools2d/ToolRect.js index 40275009..48f41311 100644 --- a/src/demo/engine/tools2d/ToolRect.js +++ b/src/engine/tools2d/ToolRect.js @@ -1,10 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview ToolRect * @author Epam * @version 1.0.0 */ - // ********************************************** // Imports // ********************************************** @@ -55,8 +59,7 @@ class ToolRect { getDistMm(vs, ve) { const dx = vs.x - ve.x; const dy = vs.y - ve.y; - const dist = Math.sqrt(dx * dx * this.m_xPixelSize * this.m_xPixelSize + - dy * dy * this.m_yPixelSize * this.m_yPixelSize); + const dist = Math.sqrt(dx * dx * this.m_xPixelSize * this.m_xPixelSize + dy * dy * this.m_yPixelSize * this.m_yPixelSize); return dist; } @@ -64,7 +67,7 @@ class ToolRect { * Determine intersection with points in rect set. * Input - screen coordinates of pick point * Output - volume coordinate - * + * * @param {object} vScr - screen coordinates of pick * @param {object} store - global store */ @@ -90,9 +93,9 @@ class ToolRect { /** * Move edited point into new pos - * - * @param {object} vVolOld - * @param {object} vVolNew + * + * @param {object} vVolOld + * @param {object} vVolNew */ moveEditPoint(vVolOld, vVolNew) { vVolOld.x = vVolNew.x; @@ -103,7 +106,7 @@ class ToolRect { /** * Remove highlighted object - * + * */ deleteObject() { if (this.m_objEdit != null) { @@ -118,7 +121,7 @@ class ToolRect { const volSet = store.volumeSet; const volIndex = store.volumeIndex; const vol = volSet.getVolume(volIndex); - + const xSize = vol.m_boxSize.x; const ySize = vol.m_boxSize.y; const zSize = vol.m_boxSize.z; @@ -126,7 +129,8 @@ class ToolRect { const xDim = vol.m_xDim; const yDim = vol.m_yDim; const zDim = vol.m_zDim; - let xScale = 0.0, yScale = 0.0; + let xScale = 0.0, + yScale = 0.0; if (mode2d === Modes2d.TRANSVERSE) { // z const xScale = xSize / xDim; @@ -140,16 +144,15 @@ class ToolRect { xScale = xSize / xDim; yScale = zSize / zDim; } - const dx = Math.abs(objRect.vMax.x - objRect.vMin.x); - const dy = Math.abs(objRect.vMax.y - objRect.vMin.y); - objRect.area = xScale * yScale * dx * dy; + const dx = Math.abs(objRect.vMax.x - objRect.vMin.x); + const dy = Math.abs(objRect.vMax.y - objRect.vMin.y); + objRect.area = xScale * yScale * dx * dy; } onMouseDown(xScr, yScr, store) { this.m_store = store; const vTex = ToolDistance.screenToTexture(xScr, yScr, this.m_wScreen, this.m_hScreen, store); - if (!this.m_inCreateMode) - { + if (!this.m_inCreateMode) { this.m_inCreateMode = true; // start add rect const objRect = { @@ -181,12 +184,13 @@ class ToolRect { } // if in create rect mode } - onMouseUp() { // ommitred args: xScr, yScr, store + onMouseUp() { + // ommitred args: xScr, yScr, store } /** * Render all areas on screen in 2d mode - * + * * @param {object} ctx - html5 canvas context * @param {object} store - global store with app parameters */ @@ -218,7 +222,6 @@ class ToolRect { const yText = Math.floor((vScrMin.y + vScrMax.y) * 0.5); const strMsg = objRect.area.toFixed(2) + ' mm^2'; ctx.fillText(strMsg, xText, yText); - } // for (i) all rects } // end render } // end class ToolRect diff --git a/src/demo/engine/tools2d/ToolText.js b/src/engine/tools2d/ToolText.js similarity index 87% rename from src/demo/engine/tools2d/ToolText.js rename to src/engine/tools2d/ToolText.js index 9b8ed122..57dc92d1 100644 --- a/src/demo/engine/tools2d/ToolText.js +++ b/src/engine/tools2d/ToolText.js @@ -1,15 +1,20 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview ToolText * @author Epam * @version 1.0.0 */ - // ********************************************** // Imports // ********************************************** import ToolDistance from './ToolDistance'; +import StoreActionType from '../../store/ActionTypes'; // import UiModalText from '../../ui/UiModalText'; // ********************************************** @@ -51,7 +56,7 @@ class ToolText { * Determine intersection with points in all texts. * Input - screen coordinates of pick point * Output - volume coordinate - * + * * @param {object} vScr - screen coordinates of poick * @param {object} store - global store */ @@ -71,9 +76,9 @@ class ToolText { /** * Move edited point into new pos - * - * @param {object} vVolOld - * @param {object} vVolNew + * + * @param {object} vVolOld + * @param {object} vVolNew */ moveEditPoint(vVolOld, vVolNew) { vVolOld.x = vVolNew.x; @@ -83,7 +88,7 @@ class ToolText { /** * Remove highlighted object - * + * */ deleteObject() { if (this.m_objEdit != null) { @@ -97,8 +102,7 @@ class ToolText { getDistMm(vs, ve) { const dx = vs.x - ve.x; const dy = vs.y - ve.y; - const dist = Math.sqrt(dx * dx * this.m_xPixelSize * this.m_xPixelSize + - dy * dy * this.m_yPixelSize * this.m_yPixelSize); + const dist = Math.sqrt(dx * dx * this.m_xPixelSize * this.m_xPixelSize + dy * dy * this.m_yPixelSize * this.m_yPixelSize); return dist; } @@ -108,9 +112,9 @@ class ToolText { const objText = { point: { x: this.m_pointPressed.x, - y: this.m_pointPressed.y + y: this.m_pointPressed.y, }, - text: str + text: str, }; this.m_texts.push(objText); // invoke render @@ -123,28 +127,28 @@ class ToolText { /** * When mouse pressed down - * + * * @param {number} xScr - x coordinate of click on screen * @param {number} yScr - y coordinate of click on screen * @param {object} store - global storage - */ + */ onMouseDown(xScr, yScr, store) { - const vTex = ToolDistance.screenToTexture(xScr, yScr, this.m_wScreen, this.m_hScreen, store); - this.m_pointPressed = vTex; + this.m_pointPressed = ToolDistance.screenToTexture(xScr, yScr, this.m_wScreen, this.m_hScreen, store); - const uiApp = store.uiApp; - uiApp.onShowModalText(); + store.dispatch({ type: StoreActionType.SET_MODAL_TEXT, showModalText: true }); } - onMouseMove() { // args ommited: xScr, yScr, store + onMouseMove() { + // args ommited: xScr, yScr, store } - onMouseUp() { // args ommited: xScr, yScr, store + onMouseUp() { + // args ommited: xScr, yScr, store } /** * Render all areas on screen in 2d mode - * + * * @param {object} ctx - html5 canvas context * @param {object} store - global store with app parameters */ diff --git a/src/demo/engine/tools2d/ToolTypes.js b/src/engine/tools2d/ToolTypes.js similarity index 68% rename from src/demo/engine/tools2d/ToolTypes.js rename to src/engine/tools2d/ToolTypes.js index 41e70799..f4450d20 100644 --- a/src/demo/engine/tools2d/ToolTypes.js +++ b/src/engine/tools2d/ToolTypes.js @@ -1,9 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview ToolTypes * @author Epam * @version 1.0.0 */ - + const Tools2dType = { INTENSITY: 0, DISTANCE: 1, @@ -15,7 +20,7 @@ const Tools2dType = { DELETE: 7, CLEAR: 8, ZOOM: 9, - DEFAULT: 10, + ZOOM_100: 10, FILTER: 11, NONE: 12, }; diff --git a/src/engine/tools2d/ToolZoom.js b/src/engine/tools2d/ToolZoom.js new file mode 100644 index 00000000..ae94488a --- /dev/null +++ b/src/engine/tools2d/ToolZoom.js @@ -0,0 +1,65 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +class ToolZoom { + constructor(objGra) { + this.m_objGraphics2d = objGra; + this.m_wScreen = 0; + this.m_hScreen = 0; + + this.setScreenDim = this.setScreenDim.bind(this); + this.onMouseWheel = this.onMouseWheel.bind(this); + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseUp = this.onMouseUp.bind(this); + this.onMouseMove = this.onMouseMove.bind(this); + + this.state = { + mouseDown: false, + xMouse: 0, + yMouse: 0, + }; + } + + setScreenDim(wScr, hScr) { + this.m_wScreen = wScr; + this.m_hScreen = hScr; + } + + onMouseDown(xScr, yScr) { + this.state.mouseDown = true; + this.state.xMouse = xScr; + this.state.yMouse = yScr; + } + + onMouseUp() { + this.state.mouseDown = false; + } + + onMouseMove(store, xScr, yScr) { + if (this.state.mouseDown) { + const dx = xScr - this.state.xMouse; + const dy = yScr - this.state.yMouse; + + this.state.xMouse = xScr; + this.state.yMouse = yScr; + + const zoom = store.render2dZoom; + const dxMove = (dx / this.m_wScreen) * zoom; + const dyMove = (dy / this.m_hScreen) * zoom; + // console.log(`dxyMove = ${dxMove}, ${dyMove}`); + const xPos = store.render2dxPos - dxMove; + const yPos = store.render2dyPos - dyMove; + + // check new 2d transform is valid (not clipped) + if (xPos >= 0.0 && xPos + zoom <= 1.0 && yPos >= 0.0 && yPos + zoom <= 1.0) { + const gra = store.graphics2d; + gra.forceUpdate(); + } + } + } +} + +// export default connect(store => store)(ToolZoom); +export default ToolZoom; diff --git a/src/demo/engine/transferTexture.js b/src/engine/transferTexture.js similarity index 86% rename from src/demo/engine/transferTexture.js rename to src/engine/transferTexture.js index b20badda..292a7c14 100644 --- a/src/demo/engine/transferTexture.js +++ b/src/engine/transferTexture.js @@ -1,23 +1,9 @@ -/* eslint-disable no-magic-numbers */ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +/* eslint-disable no-magic-numbers */ /** * 3D volume processing engine: transfer texture * @module lib/scripts/graphics3d/transferTexture @@ -25,12 +11,12 @@ under the License. import * as THREE from 'three'; /** Class for transfer texture computation and rendering */ export default class TransferTexture { - constructor() { + constructor() { this.selectedROIs = null; this.transferFuncRgba = null; this.transferFuncTexture = null; this.texRoiColor = null; - this.texRoiId = null; + this.texRoiId = null; this.numRois = 256; this.m_handleColors = [ { r: 0, g: 0, b: 0 }, @@ -52,7 +38,7 @@ export default class TransferTexture { * @param roiColors Array of roi colors in RGBA format */ init(isRoiVolume, roiColors) { - const c4 = 4; + const c4 = 4; // eslint-disable-next-line this.selectedROIs = new Uint8Array(c4 * this.numRois); this.numTfPixels = 256; @@ -62,12 +48,12 @@ export default class TransferTexture { if (isRoiVolume) { this.texRoiId = this.createSelectedRoiMap(); this.texRoiColor = this.createRoiColorMap(roiColors); - } + } } /** * Create 2D texture containing transfer func colors - */ + */ createTransferFuncTexture() { let textureOut = null; let alpha = 0; @@ -108,14 +94,14 @@ export default class TransferTexture { // eslint-disable-next-line this.transferFuncRgba[pix * FOUR + 1 + 1] = 0; // eslint-disable-next-line - this.transferFuncRgba[pix * FOUR + 1 + 1 + 1] = SCALE * alpha / SCALE1; + this.transferFuncRgba[pix * FOUR + 1 + 1 + 1] = (SCALE * alpha) / SCALE1; if (pix > a4) { this.transferFuncRgba[pix * FOUR + 0] = COLOR_R; // eslint-disable-next-line this.transferFuncRgba[pix * FOUR + 1] = COLOR_G; // eslint-disable-next-line this.transferFuncRgba[pix * FOUR + 1 + 1] = COLOR_B; - this.transferFuncRgba[pix * FOUR + 1 + 1 + 1] = SCALE * alpha / SCALE2; + this.transferFuncRgba[pix * FOUR + 1 + 1 + 1] = (SCALE * alpha) / SCALE2; } } textureOut = new THREE.DataTexture(this.transferFuncRgba, this.numTfPixels, 1, THREE.RGBAFormat); @@ -152,7 +138,7 @@ export default class TransferTexture { const pixEnd = Math.floor(intensities[curPt + 1]); for (let pix = pixStart; pix < pixEnd; pix++) { const lerpVal = (pix - pixStart) / (pixEnd - pixStart); - const colorX = (1.0 - lerpVal) * this.m_handleColors[curPt].r + lerpVal * this.m_handleColors[curPt + 1].r + const colorX = (1.0 - lerpVal) * this.m_handleColors[curPt].r + lerpVal * this.m_handleColors[curPt + 1].r; const colorY = (1.0 - lerpVal) * this.m_handleColors[curPt].g + lerpVal * this.m_handleColors[curPt + 1].g; const colorZ = (1.0 - lerpVal) * this.m_handleColors[curPt].b + lerpVal * this.m_handleColors[curPt + 1].b; // eslint-disable-next-line @@ -162,8 +148,8 @@ export default class TransferTexture { // eslint-disable-next-line this.transferFuncRgba[pix * 4 + 2] = colorZ; // eslint-disable-next-line - const op1 = (opacities[curPt] > 0.0) ? opacities[curPt] : 0.0; - const op2 = (opacities[curPt + 1] > 0.0) ? opacities[curPt + 1] : 0.0; + const op1 = opacities[curPt] > 0.0 ? opacities[curPt] : 0.0; + const op2 = opacities[curPt + 1] > 0.0 ? opacities[curPt + 1] : 0.0; this.transferFuncRgba[pix * 4 + 3] = (op2 * lerpVal + (1.0 - lerpVal) * op1) * 255; } } @@ -242,14 +228,13 @@ export default class TransferTexture { const roiSelectedTrue = 255; const roiSelectedFalse = 0; for (let pix = 0; pix < this.numRois; pix++) { - if (selectedROI[pix]) { + if (selectedROI.indexOf(pix) !== -1) { this.selectedROIs[pix * roiTexelBpp] = roiSelectedTrue; } else { this.selectedROIs[pix * roiTexelBpp] = roiSelectedFalse; } } this.texRoiId.needsUpdate = true; - //this.setVolumeTexture(1.0); } /** * Update roi selection map diff --git a/src/demo/engine/utils/BrowserDetector.js b/src/engine/utils/BrowserDetector.js similarity index 78% rename from src/demo/engine/utils/BrowserDetector.js rename to src/engine/utils/BrowserDetector.js index 743f303f..d9619e0f 100644 --- a/src/demo/engine/utils/BrowserDetector.js +++ b/src/engine/utils/BrowserDetector.js @@ -1,24 +1,27 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Detect browser type (Chrome, Firefox, ...) and detect is this mobile device -* @module src/demo/engine/utils/BrowserDetector -*/ + * Detect browser type (Chrome, Firefox, ...) and detect is this mobile device + * @module src/demo/engine/utils/BrowserDetector + */ // absolute imports // import swal from 'sweetalert'; import { createCanvas } from 'canvas'; - /** -* Class BrowserDetector preform initial loading browser type detection -* @class BrowserDetector -*/ + * Class BrowserDetector preform initial loading browser type detection + * @class BrowserDetector + */ class BrowserDetector { /** - * Start simple detection - * @constructs BrowserDetector - */ + * Start simple detection + * @constructs BrowserDetector + */ constructor() { this.m_strUserAgent = ''; this.m_strVendor = ''; @@ -32,28 +35,28 @@ class BrowserDetector { /** * Check support WebGL 2.0 - * + * * * @return {boolean} true, if WebGL 2.0 supported */ checkWebGlSupported() { // let canvas = document.createElement('canvas'); let canvas = createCanvas(640, 480); let gl = null; - try { - gl = canvas.getContext("webgl2"); - } catch (x) { - gl = null; + try { + gl = canvas.getContext('webgl2'); + } catch (x) { + gl = null; } - const glFound = (gl !== null); + const glFound = gl !== null; // console.log(`checkWebGlSupported. GL 2.0 = ${glFound}`); canvas = undefined; return glFound; } /** - * Check is this browser valid - * @return {boolean} true, if valid for 3d vizualization - */ + * Check is this browser valid + * @return {boolean} true, if valid for 3d vizualization + */ checkValidBrowser() { /** @property {string} m_strUserAgent - User agent */ this.m_strUserAgent = navigator.userAgent.toLowerCase(); @@ -62,15 +65,15 @@ class BrowserDetector { /** @property {boolean} m_isOpera - Is this opera browser */ this.m_isOpera = /opr\/|opios/i.test(this.m_strUserAgent); /** @property {boolean} m_isFirefox - Is this firefox browser */ - this.m_isFirefox = (typeof InstallTrigger !== 'undefined'); + this.m_isFirefox = typeof InstallTrigger !== 'undefined'; /** @property {boolean} m_isSafari - Is this safari browser */ // this.m_isSafari = /safari|applewebkit/i.test(this.m_strUserAgent); - this.m_isSafari = (this.m_strUserAgent.search('safari') >= 0) && (this.m_strUserAgent.search('chrome') < 0); + this.m_isSafari = this.m_strUserAgent.search('safari') >= 0 && this.m_strUserAgent.search('chrome') < 0; /** @property {boolean} m_isIE - IE ver 6-11 */ this.m_isIE = false || !!document.documentMode; /** @property {boolean} m_isChrome - Chrome browser */ this.m_isChrome = /chrome/i.test(navigator.userAgent); - this.m_isEdge = (navigator.appVersion.indexOf('Edge') > -1); + this.m_isEdge = navigator.appVersion.indexOf('Edge') > -1; if (this.m_isEdge) { this.m_isChrome = false; } @@ -97,8 +100,7 @@ class BrowserDetector { */ } // Mobile or not - const mobileArr = ['iphone', 'ipad', 'android', 'blackberry', - 'nokia', 'opera mini', 'windows mobile', 'windows phone', 'iemobile']; + const mobileArr = ['iphone', 'ipad', 'android', 'blackberry', 'nokia', 'opera mini', 'windows mobile', 'windows phone', 'iemobile']; this.m_isMobileBrowser = false; for (let i = 0; i < mobileArr.length; i++) { if (this.m_strUserAgent.indexOf(mobileArr[i].toLowerCase()) > 0) { @@ -109,7 +111,7 @@ class BrowserDetector { // detect mobiu browser by window size const MIN_W = 800; const MIN_H = 600; - if ((window.innerWidth <= MIN_W) || (window.innerHeight <= MIN_H) ) { + if (window.innerWidth <= MIN_W || window.innerHeight <= MIN_H) { this.m_isMobileBrowser = true; } if (this.m_isMobileBrowser) { diff --git a/src/engine/utils/Hash.js b/src/engine/utils/Hash.js new file mode 100644 index 00000000..39abbe9b --- /dev/null +++ b/src/engine/utils/Hash.js @@ -0,0 +1,31 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +/** + * Get string hash + * @module demo/engine/utils/hash + */ +// absolute imports +/** + * Class Hash to calc string hash + * @class Hash + */ +class Hash { + static getHash(strInp) { + const ROT = 27; + const len = strInp.length; + let hash = len * 53; + for (let i = 0; i < len; i++) { + const val = strInp.charCodeAt(i); + hash = hash * (val ^ 137211941); + // bit rotate + hash = (hash << ROT) | (hash >> (32 - ROT)); + // mask + hash &= 0x3fffffff; + } + return hash; + } +} + +export default Hash; diff --git a/src/demo/engine/utils/Screenshot.js b/src/engine/utils/Screenshot.js similarity index 70% rename from src/demo/engine/utils/Screenshot.js rename to src/engine/utils/Screenshot.js index baefb24f..f434a195 100644 --- a/src/demo/engine/utils/Screenshot.js +++ b/src/engine/utils/Screenshot.js @@ -1,34 +1,20 @@ /* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** -* Screen shot take from app -* @module demo/engine/utils/screenshot -*/ + * Screen shot take from app + * @module demo/engine/utils/screenshot + */ // absolute imports /** -* Class Screenshot to take screen copy -* @class Screenshot -*/ + * Class Screenshot to take screen copy + * @class Screenshot + */ class Screenshot { /** - * Convert string into byte array - */ + * Convert string into byte array + */ static bytesFromBase64(str) { const binary = window.atob(str); const bytes = new Uint8Array(binary.length); @@ -39,8 +25,8 @@ class Screenshot { } /** - * Encode byte buffer into base64 - */ + * Encode byte buffer into base64 + */ static bytesToBase64(buffer) { const bytes = new Uint8Array(buffer); let binary = ''; @@ -51,8 +37,8 @@ class Screenshot { } /** - * Convert data URI to blob (for further save) - */ + * Convert data URI to blob (for further save) + */ static dataUriToBlob(uri) { const parts = uri.split(/[:;,]/); const partsCount = parts.length; @@ -65,8 +51,8 @@ class Screenshot { } /** - * Open new browser window and display screenshot in it - */ + * Open new browser window and display screenshot in it + */ static showScreenshotInNewWindow(imageUri) { // show image on screen // console.log(`imageUri = ${imageUri}`); @@ -75,8 +61,8 @@ class Screenshot { } /** - * Save screenshot in file - */ + * Save screenshot in file + */ static saveScreenShotToFile(imageUri, fileName) { // save image to file const blob = Screenshot.dataUriToBlob(imageUri); @@ -95,8 +81,8 @@ class Screenshot { } /** - * Format value as a text with 2 digits. '2' -> '02', '34' -> '34' - */ + * Format value as a text with 2 digits. '2' -> '02', '34' -> '34' + */ static formatTwoDigits(val) { const TEN = 10; if (val >= TEN) { @@ -106,8 +92,8 @@ class Screenshot { } /** - * Get current date + time in format YYMMDD-HHMMSS - */ + * Get current date + time in format YYMMDD-HHMMSS + */ static getFormattedDateString() { const date = new Date(); const yy = date.getUTCFullYear(); @@ -121,8 +107,8 @@ class Screenshot { } /** - * Get screenshot - */ + * Get screenshot + */ static makeScreenshot(engineRender, shotW, shotH) { const imageUri = engineRender.screenshot(shotW, shotH); // const imageUri = engineRender3d.screenshot(); diff --git a/src/demo/engine/volumeFilter3d.js b/src/engine/volumeFilter3d.js similarity index 91% rename from src/demo/engine/volumeFilter3d.js rename to src/engine/volumeFilter3d.js index 622607ae..25acbebe 100644 --- a/src/demo/engine/volumeFilter3d.js +++ b/src/engine/volumeFilter3d.js @@ -1,3 +1,7 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ /** * 3D volume processing engine: blur, contrast filter @@ -8,7 +12,7 @@ import * as THREE from 'three'; import MaterialBlur from './gfx/matblur'; import GlSelector from './GlSelector'; import AmbientTexture from './ambientTexture'; -import TransferTexture from './transferTexture' +import TransferTexture from './transferTexture'; import Eraser from './Eraser'; /** Class VolumeFilter3d is used for 3d render */ export default class VolumeFilter3d { @@ -37,7 +41,7 @@ export default class VolumeFilter3d { this.canvas3d = glSelector.getCanvas(); this.rendererBlur = new THREE.WebGLRenderer({ canvas: this.canvas3d, - context: this.context + context: this.context, }); this.ambientTexture = new AmbientTexture({ xDim: this.xDim, @@ -79,7 +83,7 @@ export default class VolumeFilter3d { /** * Create 2D texture containing transfer func colors - */ + */ createTransferFuncTexture() { if (this.transferFunc !== null) { return this.transferFunc.createTransferFuncTexture(); @@ -125,7 +129,7 @@ export default class VolumeFilter3d { * @param blurSigma Gauss sigma parameter */ setVolumeTexture(blurSigma) { - if ((!this.material) || (typeof this.material === 'undefined')) { + if (!this.material || typeof this.material === 'undefined') { console.log('blur material null'); return; } @@ -135,7 +139,7 @@ export default class VolumeFilter3d { } updateVolumeTextureWithMask() { - if (this.eraser.bufferMask === null){ + if (this.eraser.bufferMask === null) { console.log('volTextureMask null'); } for (let z = 0; z < this.zDim; z++) { @@ -145,10 +149,10 @@ export default class VolumeFilter3d { const yVolOff = yVol * this.xDim; for (let x = 0; x < this.xDim; x++) { const xVol = x; - const offSrc = (xVol + yVolOff + zVolOff); + const offSrc = xVol + yVolOff + zVolOff; let valInt = this.arrPixels[offSrc]; const offDst = offSrc; - if ((this.zDim > 5) && ((z === 0) || (z === this.zDim - 1) || (this.eraser.bufferMask[offSrc] === 0))) { + if (this.zDim > 5 && (z === 0 || z === this.zDim - 1 || this.eraser.bufferMask[offSrc] === 0)) { valInt = 0; } this.bufferR[offDst] = valInt; @@ -185,8 +189,7 @@ export default class VolumeFilter3d { this.bufferTextureCPU[indxL + VAL_2] = frameBuf[indxR + VAL_2]; this.bufferTextureCPU[indxL + VAL_3] = frameBuf[indxR + VAL_3]; } else { - this.bufferTextureCPU[x + y * this.xDim + zOffs] = - frameBuf[VAL_4 * (x + y * this.xDim)]; //256.0 * k / this.zDim; + this.bufferTextureCPU[x + y * this.xDim + zOffs] = frameBuf[VAL_4 * (x + y * this.xDim)]; //256.0 * k / this.zDim; } } } @@ -208,7 +211,7 @@ export default class VolumeFilter3d { const yVolOff = yVol * this.xDim; for (let x = 0; x < this.xDim; x++) { const xVol = x; - const offSrc = (xVol + yVolOff + zVolOff); + const offSrc = xVol + yVolOff + zVolOff; let valInt = this.arrPixels[offSrc + 0]; const offDst = offSrc; if (this.zDim > 5 && (z === 0 || z === this.zDim - 1)) { @@ -253,10 +256,8 @@ export default class VolumeFilter3d { //const valInt = this.arrPixels[offSrc + OFF3]; const offDst = xVol + yVolOff + zVolOff; //if (x === 0 || x === this.xDim - 1 || y === 0 || y === this.yDim - 1 || z === 0 || z === this.zDim - 1) - if (x < 2 || x > this.xDim - 4 || y < 2 || y > this.yDim - 4 || z < 2 || z > this.zDim - 4) - this.bufferR[offDst + OFF0] = 0; - else - this.bufferR[offDst + OFF0] = valInt; + if (x < 2 || x > this.xDim - 4 || y < 2 || y > this.yDim - 4 || z < 2 || z > this.zDim - 4) this.bufferR[offDst + OFF0] = 0; + else this.bufferR[offDst + OFF0] = valInt; this.bufferTextureCPU[BID * offDst + OFF0] = valInt; this.bufferTextureCPU[BID * offDst + OFF1] = valInt; this.bufferTextureCPU[BID * offDst + OFF2] = valInt; @@ -336,14 +337,13 @@ export default class VolumeFilter3d { this.RoiVolumeTex.minFilter = THREE.NearestFilter; this.RoiVolumeTex.needsUpdate = true; } - this.bufferTexture = new THREE.WebGLRenderTarget(this.xDim, - this.yDim, { - minFilter: THREE.LinearFilter, - magFilter: THREE.LinearFilter, - format: THREE.RGBAFormat, - type: THREE.UnsignedByteType, - depthBuffer: false, - }); + this.bufferTexture = new THREE.WebGLRenderTarget(this.xDim, this.yDim, { + minFilter: THREE.LinearFilter, + magFilter: THREE.LinearFilter, + format: THREE.RGBAFormat, + type: THREE.UnsignedByteType, + depthBuffer: false, + }); if (this.origVolumeTex) { this.origVolumeTex.dispose(); @@ -355,8 +355,8 @@ export default class VolumeFilter3d { this.origVolumeTex.wrapR = THREE.ClampToEdgeWrapping; this.origVolumeTex.wrapS = THREE.ClampToEdgeWrapping; this.origVolumeTex.wrapT = THREE.ClampToEdgeWrapping; - this.origVolumeTex.magFilter = THREE.NearestFilter;//THREE.LinearFilter; - this.origVolumeTex.minFilter = THREE.NearestFilter;//THREE.LinearFilter; + this.origVolumeTex.magFilter = THREE.NearestFilter; //THREE.LinearFilter; + this.origVolumeTex.minFilter = THREE.NearestFilter; //THREE.LinearFilter; this.origVolumeTex.needsUpdate = true; let volTexFormat = THREE.RedFormat; diff --git a/src/index.css b/src/index.css index cee5f348..5838fae1 100644 --- a/src/index.css +++ b/src/index.css @@ -1,14 +1,59 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +html { + height: 100vh; +} + body { margin: 0; padding: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", - "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", - sans-serif; + font-family: 'Inter', sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + height: 100vh; + overflow: hidden; } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", - monospace; + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; +} + +#root { + /* Primary colors */ + --red: #dc5e47; + --green: #438f56; + --black: #18191b; + + /* Additional colors */ + --gray: #636666; + --dark-gray: #282a2d; + --dark-gray2: #46494e; + --dark-gray3: #858585; + --dark-gray4: #737982; + --light: #cbd2d2; + --white: #fff; + --light-orange: #e7675191; + --extreme-black: #000000; + + --opacity: 0.95; + + color: var(--white); + background-color: var(--extreme-black); + + /* Page layout */ + height: 100vh; + width: 100vw; + box-sizing: border-box; + + display: flex; + flex-direction: column; +} + +svg { + display: inline-block; + vertical-align: middle; + color: var(--white); } diff --git a/src/index.js b/src/index.js index 74138752..14389d05 100644 --- a/src/index.js +++ b/src/index.js @@ -1,21 +1,29 @@ -import 'bootstrap/dist/css/bootstrap.min.css'; +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + import React from 'react'; import ReactDOM from 'react-dom'; -import './index.css'; -import * as serviceWorker from './serviceWorker'; -import { Provider } from 'react-redux' + +import { Provider } from 'react-redux'; import { createStore } from 'redux'; -import rootReducer from './demo/store/Store'; -import App from './demo/App'; + +import rootReducer from './store/Store'; + +import App from './App'; + +import './index.css'; +import './nouislider-custom.css'; const rootElement = document.getElementById('root'); const store = createStore(rootReducer); -ReactDOM.render(<Provider store={store}> - <App /> -</Provider>, -rootElement); - -serviceWorker.unregister(); +ReactDOM.render( + <Provider store={store}> + <App /> + </Provider>, + rootElement +); diff --git a/src/logo.svg b/src/logo.svg deleted file mode 100644 index 6b60c104..00000000 --- a/src/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"> - <g fill="#61DAFB"> - <path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/> - <circle cx="420.9" cy="296.5" r="45.7"/> - <path d="M520.5 78.1z"/> - </g> -</svg> diff --git a/src/nouislider-custom.css b/src/nouislider-custom.css new file mode 100644 index 00000000..d2bac805 --- /dev/null +++ b/src/nouislider-custom.css @@ -0,0 +1,314 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/*! nouislider - 9.2.0 - 2017-01-11 10:35:35 */ +/* Functional styling; + * These styles are required for noUiSlider to function. + * You don't need to change these rules to apply your design. + */ + +.noUi-target, +.noUi-target * { + -webkit-touch-callout: none; + -webkit-tap-highlight-color: var(--dark-gray); + -webkit-user-select: none; + -ms-touch-action: none; + touch-action: none; + -ms-user-select: none; + -moz-user-select: none; + user-select: none; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.noUi-target { + position: relative; + direction: ltr; +} + +.noUi-base { + width: 100%; + height: 100%; + position: relative; + z-index: 1; + /* Fix 401 */ +} + +.noUi-connect { + position: absolute; + right: 0; + top: 0; + left: 0; + bottom: 0; +} + +.noUi-origin { + position: absolute; + height: 0; + width: 0; +} + +.noUi-handle { + position: relative; + z-index: 1; +} + +.noUi-state-tap .noUi-connect, +.noUi-state-tap .noUi-origin { + -webkit-transition: top 0.3s, right 0.3s, bottom 0.3s, left 0.3s; + transition: top 0.3s, right 0.3s, bottom 0.3s, left 0.3s; +} + +.noUi-state-drag * { + cursor: inherit !important; +} + +/* Painting and performance; + * Browsers can paint handles in their own layer. */ + +.noUi-base, +.noUi-handle { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +/* Slider size and handle placement */ + +.noUi-horizontal { + margin: 10px 0; + height: 10px; +} + +.noUi-horizontal .noUi-handle { + width: 10px; + height: 30px; + left: -5px; + top: -10px; +} + +.noUi-vertical { + margin: 0 10px; + width: 10px; +} + +.noUi-vertical .noUi-handle { + width: 30px; + height: 10px; + left: -10px; + top: -5px; +} + +/* Styling */ + +.noUi-target { + background: var(--white); + border-radius: 5px; + border: 1px solid var(--dark-gray); +} + +.noUi-connect { + background: var(--red); + -webkit-transition: background 450ms; + transition: background 450ms; +} + +.noUi-connect:first-child { + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; +} + +.noUi-connect:last-child { + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; +} + +/* Handles and cursors */ + +.noUi-draggable { + cursor: ew-resize; +} + +.noUi-vertical .noUi-draggable { + cursor: ns-resize; +} + +.noUi-handle { + border: 1px solid var(--white); + border-radius: 5px; + background: var(--white); + cursor: col-resize; +} + +.noUi-active { + border-color: var(--white); +} + +/* Handle stripes */ + +.noUi-handle:before, +.noUi-handle:after { + content: ''; + display: block; + position: absolute; + height: 10px; + width: 1px; + background: var(--white); + left: 2px; + top: 8px; +} + +.noUi-handle:after { + left: 5px; +} + +.noUi-vertical .noUi-handle:before, +.noUi-vertical .noUi-handle:after { + width: 14px; + height: 1px; + left: 6px; + top: 14px; +} + +.noUi-vertical .noUi-handle:after { + top: 17px; +} + +/* Disabled state */ + +[disabled] .noUi-connect { + background: #b8b8b8; +} + +[disabled].noUi-target, +[disabled].noUi-handle, +[disabled] .noUi-handle { + cursor: not-allowed; +} + +/* Base */ + +.noUi-pips, +.noUi-pips * { + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.noUi-pips { + position: absolute; + color: #999; +} + +/* Values */ + +.noUi-value { + position: absolute; + text-align: center; +} + +.noUi-value-sub { + color: #ccc; + font-size: 10px; +} + +/* Markings */ + +.noUi-marker { + position: absolute; + background: #ccc; +} + +.noUi-marker-sub { + background: #aaa; +} + +.noUi-marker-large { + background: #aaa; +} + +/* Horizontal layout; */ + +.noUi-pips-horizontal { + padding: 10px 0; + height: 80px; + top: 100%; + left: 0; + width: 100%; +} + +.noUi-value-horizontal { + -webkit-transform: translate3d(-50%, 50%, 0); + transform: translate3d(-50%, 50%, 0); +} + +.noUi-marker-horizontal.noUi-marker { + margin-left: -1px; + width: 2px; + height: 5px; +} + +.noUi-marker-horizontal.noUi-marker-sub { + height: 10px; +} + +.noUi-marker-horizontal.noUi-marker-large { + height: 15px; +} + +/* Vertical layout */ + +.noUi-pips-vertical { + padding: 0 10px; + height: 100%; + top: 0; + left: 100%; +} + +.noUi-value-vertical { + -webkit-transform: translate3d(0, 50%, 0); + transform: translate3d(0, 50%, 0); + padding-left: 25px; +} + +.noUi-marker-vertical.noUi-marker { + width: 5px; + height: 2px; + margin-top: -1px; +} + +.noUi-marker-vertical.noUi-marker-sub { + width: 10px; +} + +.noUi-marker-vertical.noUi-marker-large { + width: 15px; +} + +/* Tooltip styles */ + +.noUi-tooltip { + display: block; + position: absolute; + border: 1px solid var(--dark-gray); + border-radius: 5px; + background: var(--white); + color: var(--dark-gray); + padding: 5px; + line-height: 1; + text-align: center; +} + +.noUi-horizontal .noUi-tooltip { + -webkit-transform: translate(-50%, 0); + transform: translate(-50%, 0); + left: 50%; + bottom: 120%; +} + +.noUi-vertical .noUi-tooltip { + -webkit-transform: translate(0, -50%); + transform: translate(0, -50%); + top: 50%; + right: 120%; +} diff --git a/src/serviceWorker.js b/src/serviceWorker.js index 139e4ef4..0ed3e815 100644 --- a/src/serviceWorker.js +++ b/src/serviceWorker.js @@ -1,3 +1,8 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + // This optional code is used to register a service worker. // register() is not called by default. @@ -9,11 +14,13 @@ // To learn more about the benefits of this model and instructions on how to // opt-in, read http://bit.ly/CRA-PWA -const isLocalhost = Boolean(window.location.hostname === 'localhost' || +const isLocalhost = Boolean( + window.location.hostname === 'localhost' || // [::1] is the IPv6 localhost address. window.location.hostname === '[::1]' || // 127.0.0.1/8 is considered localhost for IPv4. - window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)); + window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/) +); export function register(config) { if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { // The URL constructor is available in all browsers that support SW. @@ -33,8 +40,7 @@ export function register(config) { // Add some additional logging to localhost, pointing developers to the // service worker/PWA documentation. navigator.serviceWorker.ready.then(() => { - console.log('This web app is being served cache-first by a service ' + - 'worker. To learn more, visit http://bit.ly/CRA-PWA'); + console.log('This web app is being served cache-first by a service ' + 'worker. To learn more, visit http://bit.ly/CRA-PWA'); }); } else { // Is not localhost. Just register service worker @@ -46,7 +52,7 @@ export function register(config) { function registerValidSW(swUrl, config) { navigator.serviceWorker .register(swUrl) - .then(registration => { + .then((registration) => { registration.onupdatefound = () => { const installingWorker = registration.installing; if (installingWorker == null) { @@ -58,8 +64,9 @@ function registerValidSW(swUrl, config) { // At this point, the updated precached content has been fetched, // but the previous service worker will still serve the older // content until all client tabs are closed. - console.log('New content is available and will be used when all ' + - 'tabs for this page are closed. See http://bit.ly/CRA-PWA.'); + console.log( + 'New content is available and will be used when all ' + 'tabs for this page are closed. See http://bit.ly/CRA-PWA.' + ); // Execute callback if (config && config.onUpdate) { @@ -80,22 +87,19 @@ function registerValidSW(swUrl, config) { }; }; }) - .catch(error => { + .catch((error) => { console.error('Error during service worker registration:', error); }); } function checkValidServiceWorker(swUrl, config) { // Check if the service worker can be found. If it can't reload the page. fetch(swUrl) - .then(response => { + .then((response) => { // Ensure service worker exists, and that we really are getting a JS file. const contentType = response.headers.get('content-type'); - if ( - response.status === 404 || - (contentType != null && contentType.indexOf('javascript') === -1) - ) { + if (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) { // No service worker found. Probably a different app. Reload the page. - navigator.serviceWorker.ready.then(registration => { + navigator.serviceWorker.ready.then((registration) => { registration.unregister().then(() => { window.location.reload(); }); @@ -106,13 +110,12 @@ function checkValidServiceWorker(swUrl, config) { } }) .catch(() => { - console.log('No internet connection found. ' + - 'App is running in offline mode.'); + console.log('No internet connection found. ' + 'App is running in offline mode.'); }); } export function unregister() { if ('serviceWorker' in navigator) { - navigator.serviceWorker.ready.then(registration => { + navigator.serviceWorker.ready.then((registration) => { registration.unregister(); }); } diff --git a/src/setupTests.js b/src/setupTests.js new file mode 100644 index 00000000..a042dffb --- /dev/null +++ b/src/setupTests.js @@ -0,0 +1,22 @@ +/* + * Copyright © 2020 EPAM Systems, Inc. All Rights Reserved. All information contained herein is, and remains the + * property of EPAM Systems, Inc. and/or its suppliers and is protected by international intellectual + * property law. Dissemination of this information or reproduction of this material is strictly forbidden, + * unless prior written permission is obtained from EPAM Systems, Inc + */ + +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom/extend-expect'; + +window.IntersectionObserver = jest.fn(() => ({ + root: null, + rootMargin: '', + thresholds: [], + disconnect: () => null, + observe: () => null, + takeRecords: () => [], + unobserve: () => null, +})); diff --git a/src/demo/store/ActionTypes.js b/src/store/ActionTypes.js similarity index 75% rename from src/demo/store/ActionTypes.js rename to src/store/ActionTypes.js index f17eb687..6f61efa1 100644 --- a/src/demo/store/ActionTypes.js +++ b/src/store/ActionTypes.js @@ -1,11 +1,17 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + // // Action type for redux reducer // const StoreActionType = { - SET_IS_LOADED: 0, + SET_IS_LOADED: 0, // boolean (progress = 100%) SET_FILENAME: 1, SET_VOLUME_SET: 2, SET_VOLUME_INDEX: 3, + SET_TEXTURE3D: 4, SET_MODE_VIEW: 5, SET_MODE_2D: 6, @@ -22,12 +28,13 @@ const StoreActionType = { SET_SLIDER_ErRadius: 17, SET_SLIDER_ErDepth: 18, SET_VOLUME_Renderer: 19, + SET_2D_TOOLS_INDEX: 20, SET_2D_ZOOM: 21, SET_2D_X_POS: 22, SET_2D_Y_POS: 23, SET_GRAPHICS_2D: 24, - SET_UI_APP: 25, + SET_PROGRESS: 25, SET_DICOM_INFO: 26, SET_IS_TOOL3D: 27, SET_SLIDER_Contrast3D: 28, @@ -35,5 +42,9 @@ const StoreActionType = { SET_MODE_3Droi: 30, SET_DICOM_SERIES: 31, SET_LOADER_DICOM: 32, + SET_MODAL_TEXT: 33, + SET_MODAL_ALERT: 34, + SET_SPINNER: 35, + SET_PROGRESS_INFO: 36, }; export default StoreActionType; diff --git a/src/store/Modes2d.js b/src/store/Modes2d.js new file mode 100644 index 00000000..5bb0a0ce --- /dev/null +++ b/src/store/Modes2d.js @@ -0,0 +1,13 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +const Modes2d = { + NA: -1, + SAGGITAL: 0, + CORONAL: 1, + TRANSVERSE: 2, +}; + +export default Modes2d; diff --git a/src/store/Modes3d.js b/src/store/Modes3d.js new file mode 100644 index 00000000..e43974a6 --- /dev/null +++ b/src/store/Modes3d.js @@ -0,0 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +const Modes3d = { + NA: -1, + ISO: 0, + RAYCAST: 1, + RAYFAST: 2, + EREASER: 3, +}; + +export default Modes3d; diff --git a/src/store/Store.js b/src/store/Store.js new file mode 100644 index 00000000..8f390ea3 --- /dev/null +++ b/src/store/Store.js @@ -0,0 +1,133 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +// + +import StoreActionType from './ActionTypes'; +import ViewMode from './ViewMode'; +import Modes2d from './Modes2d'; +import Modes3d from './Modes3d'; + +// +// Global app settings with initial configuration +// +export const initialState = { + isLoaded: false, // true when file is loaded + fileName: 'brain.ktx', // file name + volumeSet: null, // Volume[] + volumeIndex: 0, // Index of volume (usually 0) + viewMode: ViewMode.VIEW_2D, // 2D or 3D + mode2d: Modes2d.TRANSVERSE, // 2D planar slice direction + sliceRatio: 0.5, // current slice number / slices amount + slider3d_r: 0.09, // 3D slicer Red + slider3d_g: 0.3, // 3D slicer Green + slider3d_b: 0.46, // 3D slicer Blue + mode3d: Modes3d.RAYCAST, // 3D rendering mode + opacityValue3D: 0.53, // 3D Opacity value + isoThresholdValue: 0.46, // Surface ISO threshold value + brightness3DValue: 0.56, // 3D brightness + cut3DRatio: 1.0, // Slice 3D ratio + quality3DStepSize: 0.35, // 3D quality + sliderErRadius: 50.0, // 3D eraser radius + sliderErDepth: 50.0, // 3D eraser depth + volumeRenderer: null, + indexTools2d: 0, + render2dZoom: 1.0, + render2dxPos: 0.0, + render2dyPos: 0.0, + graphics2d: null, + progress: 0, // 0 to 1 + titleProgressBar: '', + dicomInfo: null, + isTool3D: false, + sliderContrast3D: 0.0, + arrErrors: [], + dicomSeries: [], + loaderDicom: null, + spinner: false, //true when mock data is loading +}; +// +// App reducer +// +const medReducer = (state = initialState, action) => { + switch (action.type) { + case StoreActionType.SET_IS_LOADED: + return Object.assign({}, state, { isLoaded: action.isLoaded }); + case StoreActionType.SET_FILENAME: + return Object.assign({}, state, { fileName: action.fileName }); + case StoreActionType.SET_VOLUME_SET: + return Object.assign({}, state, { volumeSet: action.volumeSet }); + case StoreActionType.SET_VOLUME_INDEX: + return Object.assign({}, state, { volumeIndex: action.volumeIndex }); + case StoreActionType.SET_TEXTURE3D: + return Object.assign({}, state, { texture3d: action.texture3d }); + case StoreActionType.SET_MODE_VIEW: + return Object.assign({}, state, { viewMode: action.viewMode }); + case StoreActionType.SET_MODE_2D: + return Object.assign({}, state, { mode2d: action.mode2d }); + case StoreActionType.SET_SLIDER_2D: + return Object.assign({}, state, { sliceRatio: action.sliceRatio }); + case StoreActionType.SET_MODE_3D: + return Object.assign({}, state, { mode3d: action.mode3d }); + case StoreActionType.SET_SLIDER_3DR: + return Object.assign({}, state, { slider3d_r: action.slider3d_r }); + case StoreActionType.SET_SLIDER_3DG: + return Object.assign({}, state, { slider3d_g: action.slider3d_g }); + case StoreActionType.SET_SLIDER_3DB: + return Object.assign({}, state, { slider3d_b: action.slider3d_b }); + case StoreActionType.SET_SLIDER_Opacity: + return Object.assign({}, state, { opacityValue3D: action.opacityValue3D }); + case StoreActionType.SET_SLIDER_Isosurface: + return Object.assign({}, state, { isoThresholdValue: action.isoThresholdValue }); + case StoreActionType.SET_SLIDER_ErRadius: + return Object.assign({}, state, { sliderErRadius: action.sliderErRadius }); + case StoreActionType.SET_SLIDER_ErDepth: + return Object.assign({}, state, { sliderErDepth: action.sliderErDepth }); + case StoreActionType.SET_VOLUME_Renderer: + return Object.assign({}, state, { volumeRenderer: action.volumeRenderer }); + case StoreActionType.SET_SLIDER_Brightness: + return Object.assign({}, state, { brightness3DValue: action.brightness3DValue }); + case StoreActionType.SET_SLIDER_Cut: + return Object.assign({}, state, { cut3DRatio: action.cut3DRatio }); + case StoreActionType.SET_SLIDER_Quality: + return Object.assign({}, state, { quality3DStepSize: action.quality3DStepSize }); + case StoreActionType.SET_2D_TOOLS_INDEX: + return Object.assign({}, state, { indexTools2d: action.indexTools2d }); + case StoreActionType.SET_2D_ZOOM: + return Object.assign({}, state, { render2dZoom: action.render2dZoom }); + case StoreActionType.SET_2D_X_POS: + return Object.assign({}, state, { render2dxPos: action.render2dxPos }); + case StoreActionType.SET_2D_Y_POS: + return Object.assign({}, state, { render2dyPos: action.render2dyPos }); + case StoreActionType.SET_GRAPHICS_2D: + return Object.assign({}, state, { graphics2d: action.graphics2d }); + case StoreActionType.SET_PROGRESS: + return Object.assign({}, state, { progress: action.progress }); + case StoreActionType.SET_PROGRESS_INFO: + return Object.assign({}, state, { titleProgressBar: action.titleProgressBar }); + case StoreActionType.SET_DICOM_INFO: + return Object.assign({}, state, { dicomInfo: action.dicomInfo }); + case StoreActionType.SET_IS_TOOL3D: + return Object.assign({}, state, { isTool3D: action.isTool3D }); + case StoreActionType.SET_SLIDER_Contrast3D: + return Object.assign({}, state, { sliderContrast3D: action.sliderContrast3D }); + case StoreActionType.SET_ERR_ARRAY: + return Object.assign({}, state, { arrErrors: action.arrErrors }); + case StoreActionType.SET_DICOM_SERIES: + return Object.assign({}, state, { dicomSeries: action.dicomSeries }); + case StoreActionType.SET_LOADER_DICOM: + return Object.assign({}, state, { loaderDicom: action.loaderDicom }); + case StoreActionType.SET_MODAL_TEXT: + return Object.assign({}, state, { showModalText: action.showModalText }); + case StoreActionType.SET_MODAL_ALERT: + return Object.assign({}, state, { showModalAlert: action.showModalAlert }); + case StoreActionType.SET_SPINNER: + return Object.assign({}, state, { spinner: action.spinner }); + default: + return state; + } +}; + +export default medReducer; diff --git a/src/store/ViewMode.js b/src/store/ViewMode.js new file mode 100644 index 00000000..8a5d4778 --- /dev/null +++ b/src/store/ViewMode.js @@ -0,0 +1,15 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +const ViewMode = { + VIEW_NA: -1, + VIEW_MPR: 0, + VIEW_2D: 1, + VIEW_3D_LIGHT: 2, + VIEW_3D: 3, + VIEW_COUNT: 4, +}; + +export default ViewMode; diff --git a/src/ui/App/AppContext.jsx b/src/ui/App/AppContext.jsx new file mode 100644 index 00000000..9d6d1ac7 --- /dev/null +++ b/src/ui/App/AppContext.jsx @@ -0,0 +1,55 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React, { useContext, useRef, useState } from 'react'; +import { useDispatch } from 'react-redux'; +import StoreActionType from '../../store/ActionTypes'; +import { useInterval } from '../../utils/useInterval'; + +const AppContext = React.createContext(null); + +export const AppContextProvider = ({ children }) => { + const dispatch = useDispatch(); + const [isRunning, setIsRunning] = useState(false); + + const runningJob = useRef(null); + const onFinishJob = useRef(null); + + useInterval( + () => { + const isFinished = runningJob.current.run(); + + if (isFinished) { + onFinishJob.current(); + setIsRunning(false); + dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); + } else { + const progress = runningJob.current.getProgress(); + const titleProgressBar = 'Please wait, applying filter...'; + dispatch({ type: StoreActionType.SET_PROGRESS, progress }); + dispatch({ type: StoreActionType.SET_PROGRESS_INFO, titleProgressBar }); + } + }, + isRunning ? 200 : null + ); + + const startJob = (job, onFinish) => { + setIsRunning(true); + runningJob.current = job; + onFinishJob.current = onFinish; + }; + + return <AppContext.Provider value={{ startJob }}>{children}</AppContext.Provider>; +}; + +export const useAppContext = () => { + const context = useContext(AppContext); + const contextName = 'AppContext'; + + if (!context) { + throw new Error(`Used outside of "${contextName}"`); + } + + return context; +}; diff --git a/src/ui/Button/Button.jsx b/src/ui/Button/Button.jsx new file mode 100644 index 00000000..74246c32 --- /dev/null +++ b/src/ui/Button/Button.jsx @@ -0,0 +1,43 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import cx from 'classnames'; + +import { SVG } from './SVG'; +import { Tooltip } from '../Tooltip/Tooltip'; + +import css from './Button.module.css'; + +export const ButtonContainer = ({ children, onClick, type = 'button', caption, cx: styles, customStyle, testId }) => ( + <button type={type} data-testid={testId} className={cx(css.reset, styles, customStyle)} onClick={onClick} caption={caption}> + {children} + </button> +); + +export const UIButton = ({ icon, caption, handler, active, rounded, type, mode, cx: customStyle, testId, text }) => { + const modeStyle = (mode === 'light' && css.light) || (mode === 'accent' && css.accent); + const isOnlyCaption = icon === undefined && caption; + + return ( + <ButtonContainer + type={type} + cx={cx(css.button, active && css.active, rounded && css.rounded, isOnlyCaption && css.captionButton, modeStyle, customStyle)} + onClick={handler} + testId={testId} + caption={icon && caption} + > + {icon ? <SVG name={icon} title={caption} /> : caption} + {text ? text : ''} + </ButtonContainer> + ); +}; + +export const buttonsBuilder = (buttons, options = { activeButton: null }, tooltipPosition) => + buttons.map(({ id, caption, ...props }) => ( + <Tooltip content={caption} placement={tooltipPosition} key={id.toString()}> + <UIButton {...props} key={id} active={id === options.activeButton} /> + </Tooltip> + )); diff --git a/src/ui/Button/Button.module.css b/src/ui/Button/Button.module.css new file mode 100644 index 00000000..d9e75930 --- /dev/null +++ b/src/ui/Button/Button.module.css @@ -0,0 +1,110 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.reset { + display: inline-block; + border: none; + margin: 0; + text-decoration: none; + background-color: transparent; + padding: 0; + cursor: pointer; + transition: all 250ms ease-in-out, transform 150ms ease; + -webkit-appearance: none; + -moz-appearance: none; +} + +.reset:focus { + outline: none; +} + +.button { + margin-right: 5px; + margin-bottom: 5px; + background-color: var(--black); + padding: 12px 13px; + color: var(--white); + font-family: inherit; + text-align: center; + vertical-align: center; + font-size: 14px; + border-radius: 36px; +} + +.button > svg { + width: 24px; + height: 24px; +} + +.rounded { + overflow: hidden; + border-radius: 50%; +} + +.captionButton { + padding: 5px 10px; + font-size: 16px; + line-height: 1.5; +} + +.button svg { + fill: var(--white); +} + +.button:hover, +.button:focus { + background-color: var(--light-orange); +} + +.button.active { + color: var(--red); +} + +.apply { + background-color: var(--red); + border-radius: 4px; +} + +.button.active svg { + fill: var(--red); +} + +.button.light { + color: var(--black); + background-color: var(--light); +} + +.button.light svg { + fill: var(--black); +} + +.button.light.active { + color: var(--red); +} + +.button.light:hover, +.button.light:focus { + background-color: var(--light); + filter: brightness(80%); +} + +.button.accent { + color: var(--white); + background-color: var(--red); +} + +.button.accent svg { + fill: var(--white); +} + +.button.accent:hover, +.button.accent:focus { + background-color: var(--red); + filter: brightness(85%); +} + +.button.accent.active svg { + fill: var(--black); +} diff --git a/src/ui/Button/SVG.jsx b/src/ui/Button/SVG.jsx new file mode 100644 index 00000000..124d4974 --- /dev/null +++ b/src/ui/Button/SVG.jsx @@ -0,0 +1,18 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; + +const DEFAULT_SIZE = 25; +const DEFAULT_COLOR = '#ffffff'; + +export const SVG = ({ name, width = DEFAULT_SIZE, height = DEFAULT_SIZE, title, color = DEFAULT_COLOR }) => { + return ( + <svg fill={color} width={width} height={height} {...(title ? { 'aria-labelledby': 'title' } : { 'aria-hidden': 'true' })}> + {title && <title>{title}} + + + ); +}; diff --git a/src/ui/Constants/DnDItemTypes.js b/src/ui/Constants/DnDItemTypes.js new file mode 100644 index 00000000..4154449c --- /dev/null +++ b/src/ui/Constants/DnDItemTypes.js @@ -0,0 +1,8 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +export const DnDItemTypes = { + SETTINGS: 'settings', +}; diff --git a/src/ui/DragAndDrop/DragAndDropContainer.jsx b/src/ui/DragAndDrop/DragAndDropContainer.jsx new file mode 100644 index 00000000..ec1697be --- /dev/null +++ b/src/ui/DragAndDrop/DragAndDropContainer.jsx @@ -0,0 +1,71 @@ +import React, { useCallback, useState } from 'react'; +import css from '../Main.module.css'; +import { DnDItemTypes } from '../Constants/DnDItemTypes'; +import { useDrag } from 'react-dnd'; + +export const DragAndDropContainer = ({ children }) => { + const [position, setPosition] = useState({ top: 100, left: null }); + const [isCanDrag, setIsCanDrag] = useState(false); + + const checkEventTagName = useCallback( + (e) => { + e.target.tagName === 'DIV' ? setIsCanDrag(true) : setIsCanDrag(false); + }, + [isCanDrag, setIsCanDrag] + ); + + const getLeftPositionSettings = useCallback( + (e) => { + if (position.left === null) { + setPosition({ + top: position.top, + left: window.innerWidth - e.currentTarget.offsetWidth - 25, + }); + } + }, + [position] + ); + + const [{ isDragging }, drag, dragPreview] = useDrag( + () => ({ + type: DnDItemTypes.SETTINGS, + item: { left: position.left, top: position.top, isCanDrag }, + options: { + dropEffect: 'move', + }, + end: (item, monitor) => { + const { x, y } = monitor.getDropResult(); + const top = Math.round(item.top + y); + const left = Math.round(item.left + x); + setPosition({ top, left }); + }, + canDrag: () => { + return isCanDrag; + }, + collect: (monitor) => ({ + isDragging: monitor.isDragging(), + }), + }), + [position.left, position.top, isCanDrag] + ); + + return isDragging ? ( +
+ {children} +
+ ) : ( +
+ {children} +
+ ); +}; diff --git a/src/ui/DragAndDrop/DragAndDropContainer.test.jsx b/src/ui/DragAndDrop/DragAndDropContainer.test.jsx new file mode 100644 index 00000000..26c9d3bb --- /dev/null +++ b/src/ui/DragAndDrop/DragAndDropContainer.test.jsx @@ -0,0 +1,21 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { DragAndDropContainer } from './DragAndDropContainer'; +import { HTML5Backend } from 'react-dnd-html5-backend'; +import { DndProvider } from 'react-dnd'; + +describe('Test DragAndDrop', () => { + it('should render', () => { + render( + + test + + ); + + expect(screen.getByText('test')).toBeInTheDocument(); + }); +}); diff --git a/src/ui/Form/Slider.module.css b/src/ui/Form/Slider.module.css new file mode 100644 index 00000000..21bd0efc --- /dev/null +++ b/src/ui/Form/Slider.module.css @@ -0,0 +1,19 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.icon { + margin-right: 5px; +} + +.slider { + flex: 1; +} + +.caption { + margin: 0; + font-size: 16px; + line-height: 20px; + color: var(--white); +} diff --git a/src/ui/Form/SliderCaption.jsx b/src/ui/Form/SliderCaption.jsx new file mode 100644 index 00000000..6d3f50dc --- /dev/null +++ b/src/ui/Form/SliderCaption.jsx @@ -0,0 +1,10 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; + +import css from './Slider.module.css'; + +export const SliderCaption = ({ caption }) =>

{caption}

; diff --git a/src/ui/Form/SliderRow.jsx b/src/ui/Form/SliderRow.jsx new file mode 100644 index 00000000..61bc1faa --- /dev/null +++ b/src/ui/Form/SliderRow.jsx @@ -0,0 +1,23 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { SVG } from '../Button/SVG'; + +import css from './Slider.module.css'; +import styles from './index.module.css'; + +export const SliderRow = ({ icon, title, children }) => { + return ( +
+ {icon && ( +
+ +
+ )} +
{children}
+
+ ); +}; diff --git a/src/ui/Form/Switch.jsx b/src/ui/Form/Switch.jsx new file mode 100644 index 00000000..de0641d6 --- /dev/null +++ b/src/ui/Form/Switch.jsx @@ -0,0 +1,17 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; + +import css from './Switch.module.css'; + +export const Switch = ({ value, onValueChange }) => { + return ( + + ); +}; diff --git a/src/ui/Form/Switch.module.css b/src/ui/Form/Switch.module.css new file mode 100644 index 00000000..6e9f110f --- /dev/null +++ b/src/ui/Form/Switch.module.css @@ -0,0 +1,51 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.switch { + display: inline-block; + width: 45px; + height: 25px; + position: relative; +} + +.checkbox { + opacity: 0; + width: 0; + height: 0; +} + +.toggle { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: flex; + justify-content: space-between; + align-items: center; + background-color: var(--light); + border-radius: 100px; + cursor: pointer; +} + +.toggle:before { + content: ''; + height: 21px; + width: 21px; + position: absolute; + left: 2px; + top: 2px; + border-radius: 100px; + background-color: var(--white); + transition: 0.4s all ease; +} + +.checkbox:checked + .toggle { + background-color: var(--red); +} + +.checkbox:checked + .toggle:before { + transform: translateX(20px); +} diff --git a/src/ui/Form/SwitchRow.jsx b/src/ui/Form/SwitchRow.jsx new file mode 100644 index 00000000..b92de5e8 --- /dev/null +++ b/src/ui/Form/SwitchRow.jsx @@ -0,0 +1,14 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import cx from 'classnames'; + +import styles from './index.module.css'; +import css from './SwitchRow.module.css'; + +export const SwitchRow = ({ children }) => { + return
{children}
; +}; diff --git a/src/ui/Form/SwitchRow.module.css b/src/ui/Form/SwitchRow.module.css new file mode 100644 index 00000000..f1faec4d --- /dev/null +++ b/src/ui/Form/SwitchRow.module.css @@ -0,0 +1,9 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.row { + align-items: center; + justify-content: space-between; +} diff --git a/src/ui/Form/index.js b/src/ui/Form/index.js new file mode 100644 index 00000000..2c39132d --- /dev/null +++ b/src/ui/Form/index.js @@ -0,0 +1,9 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './SliderCaption'; +export * from './SliderRow'; +export * from './Switch'; +export * from './SwitchRow'; diff --git a/src/ui/Form/index.module.css b/src/ui/Form/index.module.css new file mode 100644 index 00000000..553742f2 --- /dev/null +++ b/src/ui/Form/index.module.css @@ -0,0 +1,11 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.container { + min-height: 30px; + display: flex; + align-items: stretch; + margin: 0 0 5px 0; +} diff --git a/src/ui/GithubLink/GithubLink.jsx b/src/ui/GithubLink/GithubLink.jsx new file mode 100644 index 00000000..f19c940f --- /dev/null +++ b/src/ui/GithubLink/GithubLink.jsx @@ -0,0 +1,23 @@ +/* eslint-disable max-len */ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; + +export const GithubLink = ({ width, height }) => { + return ( + + + + + + + + + ); +}; diff --git a/src/ui/Header/Header.jsx b/src/ui/Header/Header.jsx new file mode 100644 index 00000000..c0d0fff8 --- /dev/null +++ b/src/ui/Header/Header.jsx @@ -0,0 +1,11 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React from 'react'; + +import UiOpenMenu from '../OpenFile/UiOpenMenu'; + +export function Header({ fileNameOnLoad }) { + return ; +} diff --git a/src/ui/Header/UiAbout.js b/src/ui/Header/UiAbout.js new file mode 100644 index 00000000..37b23aee --- /dev/null +++ b/src/ui/Header/UiAbout.js @@ -0,0 +1,62 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useState } from 'react'; + +import packageJson from '../../../package.json'; +import UiSkelAni from '../UiSkelAni'; +import { UIButton } from '../Button/Button'; +import { Modal, ModalBody, ModalFooter, ModalHeader } from '../Modals/ModalBase'; +import { useSelector } from 'react-redux'; +import { Tooltip } from '../Tooltip/Tooltip'; + +import css from './UiAbout.module.css'; + +export const UiAbout = () => { + const [modalShow, setModalShow] = useState(false); + const strVer = packageJson.version; + const strName = packageJson.name; + const strDescription = packageJson.description; + const strAuthor = packageJson.author; + const strYear = packageJson.year; + const { graphics2d } = useSelector((state) => state); + + const onShow = () => { + graphics2d?.clear(); + setModalShow(true); + }; + + const onHide = () => { + setModalShow(false); + }; + + return ( + <> + + + + {modalShow && ( + + + +
+ +

{strDescription}

+

+ Version: {strVer} +

+

+ Copyright: {strYear} {strAuthor} +

+
+
+ + + +
+ )} + + ); +}; diff --git a/src/ui/Header/UiAbout.module.css b/src/ui/Header/UiAbout.module.css new file mode 100644 index 00000000..a2608b24 --- /dev/null +++ b/src/ui/Header/UiAbout.module.css @@ -0,0 +1,23 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.logo { + background: transparent !important; + background-color: red; +} + +.logo svg { + width: 40px; + height: 40px; +} + +.logo:hover, +.logo:focus { + background: transparent; +} + +.logo:hover svg { + fill: var(--red); +} diff --git a/src/ui/Histogram/HistogramUtils.js b/src/ui/Histogram/HistogramUtils.js new file mode 100644 index 00000000..dc74d351 --- /dev/null +++ b/src/ui/Histogram/HistogramUtils.js @@ -0,0 +1,82 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; + +export default class HistogramUtils extends React.Component { + constructor(props) { + super(props); + this.m_numColors = 0; + this.m_histogram = []; + } + + assignArray(numColors, histogramArray) { + this.m_numColors = numColors; + this.m_histogram = histogramArray; + } + + getLastMaxIndex(valMin = 0.0) { + const IND_MIN = 4; + let i; + + let found = false; + for (i = this.m_numColors - IND_MIN; i > IND_MIN; i--) { + if (this.m_histogram[i] > valMin) { + if (this.m_histogram[i] > this.m_histogram[i - 2] && this.m_histogram[i] > this.m_histogram[i + 2]) { + found = true; + break; + } // if local maximum + } // if mor min + } // for (i) + if (!found) { + console.log(`getLastMaxIndex. Not found!`); + return -1; + } + return i; + } // end get last max index + + smoothHistogram(sigma = 1.2, needNormalize = true) { + const SIZE_DIV = 60; + let RAD = Math.floor(this.m_numColors / SIZE_DIV); + // avoid too large neighbourhood window size + const SIZE_LARGE = 32; + if (RAD > SIZE_LARGE) { + RAD = SIZE_LARGE; + } + // console.log(`smoothHistogram. RAD = ${RAD}`); + + const KOEF = 1.0 / (2 * sigma * sigma); + const newHist = new Array(this.m_numColors); + let i; + let maxVal = 0; + for (i = 0; i < this.m_numColors; i++) { + let sum = 0; + let sumW = 0; + for (let di = -RAD; di <= RAD; di++) { + const ii = i + di; + const t = di / RAD; + const w = Math.exp(-t * t * KOEF); + if (ii >= 0 && ii < this.m_numColors) { + sum += this.m_histogram[ii] * w; + sumW += w; + } + } + sum /= sumW; + maxVal = sum > maxVal ? sum : maxVal; + + newHist[i] = sum; + } // for (i) + // copy back to hist + if (needNormalize) { + for (i = 0; i < this.m_numColors; i++) { + this.m_histogram[i] = newHist[i] / maxVal; + } // for (i) + } else { + for (i = 0; i < this.m_numColors; i++) { + this.m_histogram[i] = newHist[i]; + } // for (i) + } + } // smoothHistogram +} diff --git a/src/demo/ui/UiHistogram.js b/src/ui/Histogram/UiHistogram.js similarity index 71% rename from src/demo/ui/UiHistogram.js rename to src/ui/Histogram/UiHistogram.js index 94ce3235..7476a673 100644 --- a/src/demo/ui/UiHistogram.js +++ b/src/ui/Histogram/UiHistogram.js @@ -1,36 +1,16 @@ -/** - * @fileOverview UiHistogram - * @author Epam - * @version 1.0.0 +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 */ - -// ******************************************************** -// Imports -// ******************************************************** - import React from 'react'; -import TransfFunc from '../engine/TransFunc'; - -// ******************************************************** -// Const -// ******************************************************** +import TransfFunc from '../../engine/TransFunc'; const DEFAULT_HEIGHT = 220; const NEED_TO_DRAW_VERTICAL_MARKS = false; -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiHistogram some text later... - */ export default class UiHistogram extends React.Component { - /** - * @param {object} props - props from up level object - */ constructor(props) { super(props); this.m_histogram = []; @@ -54,7 +34,7 @@ export default class UiHistogram extends React.Component { componentDidMount() { this.updateCanvas(); window.addEventListener('resize', this.handleResize, false); - this.setSize(); + this.setSize(); } componentDidUpdate() { @@ -97,7 +77,7 @@ export default class UiHistogram extends React.Component { // calc max value in histogram let valMax = 0; for (i = 0; i < this.m_numColors; i++) { - valMax = (this.m_histogram[i] > valMax) ? this.m_histogram[i] : valMax; + valMax = this.m_histogram[i] > valMax ? this.m_histogram[i] : valMax; } const SOME_SMALL_ADD = 0.001; valMax += SOME_SMALL_ADD; @@ -110,34 +90,6 @@ export default class UiHistogram extends React.Component { this.getMaxPeak(); } - assignArray(numColors, histogramArray) { - this.m_numColors = numColors; - this.m_histogram = histogramArray; - } - - getLastMaxIndex(valMin = 0.0) { - const IND_MIN = 4; - let i; - - let found = false; - for (i = this.m_numColors - IND_MIN; i > IND_MIN; i--) { - if (this.m_histogram[i] > valMin) { - if ((this.m_histogram[i] > this.m_histogram[i - 2]) && - (this.m_histogram[i] > this.m_histogram[i + 2])) { - found = true; break; - } // if local maximum - } // if mor min - } // for (i) - if (!found) { - console.log(`getLastMaxIndex. Not found!`); - return -1; - } - return i; - - } // end get last max index - - // - // getMaxPeak() { this.m_peakIndex = -1; let i; @@ -146,8 +98,7 @@ export default class UiHistogram extends React.Component { const MAX_SCAN = this.m_numColors - 4; let maxPeakVal = 0; for (i = MAX_SCAN; i > MIN_SCAN; i--) { - if ((hist[i] > hist[i - 1]) && (hist[i] > hist[i + 1]) && - (hist[i] > hist[i - 2]) && (hist[i] > hist[i + 2])) { + if (hist[i] > hist[i - 1] && hist[i] > hist[i + 1] && hist[i] > hist[i - 2] && hist[i] > hist[i + 2]) { const peakVal = hist[i]; if (peakVal > maxPeakVal) { maxPeakVal = peakVal; @@ -155,7 +106,8 @@ export default class UiHistogram extends React.Component { } // console.log(`Local histogram peak in ${this.m_peakIndex}`); } // if (ha slocal peak) - } // for (all colors to scan) + } // for (all colors to scan) + console.log('This function calls', this.m_peakIndex); } smoothHistogram(sigma = 1.2, needNormalize = true) { @@ -179,13 +131,13 @@ export default class UiHistogram extends React.Component { const ii = i + di; const t = di / RAD; const w = Math.exp(-t * t * KOEF); - if ((ii >= 0) && (ii < this.m_numColors)) { + if (ii >= 0 && ii < this.m_numColors) { sum += this.m_histogram[ii] * w; sumW += w; } } sum /= sumW; - maxVal = (sum > maxVal) ? sum : maxVal; + maxVal = sum > maxVal ? sum : maxVal; newHist[i] = sum; } // for (i) @@ -202,8 +154,7 @@ export default class UiHistogram extends React.Component { } // smoothHistogram onMouseDown(evt) { - if ((this.m_transfFuncCallback === undefined) || - (this.m_transfFuncUpdateCallback === undefined)) { + if (this.m_transfFuncCallback === undefined || this.m_transfFuncUpdateCallback === undefined) { return; } const box = this.refs.canvasHistogram.getBoundingClientRect(); @@ -216,8 +167,7 @@ export default class UiHistogram extends React.Component { } onMouseUp(evt) { - if ((this.m_transfFuncCallback === undefined) || - (this.m_transfFuncUpdateCallback === undefined)) { + if (this.m_transfFuncCallback === undefined || this.m_transfFuncUpdateCallback === undefined) { return; } const box = this.refs.canvasHistogram.getBoundingClientRect(); @@ -230,8 +180,7 @@ export default class UiHistogram extends React.Component { } onMouseMove(evt) { - if ((this.m_transfFuncCallback === undefined) || - (this.m_transfFuncUpdateCallback === undefined)) { + if (this.m_transfFuncCallback === undefined || this.m_transfFuncUpdateCallback === undefined) { return; } const box = this.refs.canvasHistogram.getBoundingClientRect(); @@ -251,19 +200,13 @@ export default class UiHistogram extends React.Component { const w = this.refs.canvasHistogram.clientWidth; const h = this.refs.canvasHistogram.clientHeight; ctx.fillStyle = 'rgb(220, 220, 220)'; - ctx.fillRect(0,0, w, h); - - // was 300 * 250 - // console.log(`updateCanvas. canvas dim = ${w} * ${h}`); + ctx.fillRect(0, 0, w, h); const vol = this.props.volume; if (vol !== null) { this.getVolumeHistogram(vol); } - // rect inside - // const xMin = Math.floor(0.10 * w); - // const xMax = Math.floor(0.95 * w); const xMin = Math.floor(0.01 * w); const xMax = Math.floor(0.99 * w); const yMin = Math.floor(0.05 * h); @@ -287,22 +230,20 @@ export default class UiHistogram extends React.Component { ctx.textBaseline = 'top'; ctx.textAlign = 'center'; - // detect max visible value in hist let maxHistValue = 1.0; if (this.m_peakIndex > 0) { maxHistValue = this.m_histogram[this.m_peakIndex] * 2; - maxHistValue = (maxHistValue > 1.0) ? 1.0 : maxHistValue; + maxHistValue = maxHistValue > 1.0 ? 1.0 : maxHistValue; } - // draw marks horizontal let i; const NUM_X_MARKS = 4; for (i = 0; i <= NUM_X_MARKS; i++) { - const x = xMin + Math.floor(wRect * i / NUM_X_MARKS); + const x = xMin + Math.floor((wRect * i) / NUM_X_MARKS); ctx.moveTo(x, yMax); ctx.lineTo(x, yMax + 6); ctx.stroke(); - const valMark = Math.floor(0 + this.m_numColors * i / NUM_X_MARKS); + const valMark = Math.floor(0 + (this.m_numColors * i) / NUM_X_MARKS); if (i === 0) { ctx.textAlign = 'left'; } else if (i === NUM_X_MARKS) { @@ -312,7 +253,7 @@ export default class UiHistogram extends React.Component { } ctx.fillText(valMark.toString(), x, yMax + 4); } - // draw marks vertical + if (NEED_TO_DRAW_VERTICAL_MARKS) { ctx.textBaseline = 'bottom'; ctx.textAlign = 'left'; @@ -322,11 +263,11 @@ export default class UiHistogram extends React.Component { if (i === NUM_Y_MARKS) { ctx.textBaseline = 'top'; } - const y = yMax - Math.floor(hRect * i / NUM_Y_MARKS); + const y = yMax - Math.floor((hRect * i) / NUM_Y_MARKS); ctx.moveTo(xMin, y); ctx.lineTo(xMin - 4, y); ctx.stroke(); - const valMark = (0 + maxHistValue * i / NUM_Y_MARKS); + const valMark = 0 + (maxHistValue * i) / NUM_Y_MARKS; ctx.fillText(valMark.toFixed(2), xMin + 6, y); } } @@ -334,19 +275,19 @@ export default class UiHistogram extends React.Component { ctx.lineWidth = 2; ctx.strokeStyle = '#080808'; ctx.fillStyle = '#707070'; - // draw histogram function line + ctx.beginPath(); { ctx.moveTo(xMin, yMax); let i; let x, y; for (i = 0; i < this.m_numColors; i++) { - x = xMin + Math.floor(wRect * i / this.m_numColors); + x = xMin + Math.floor((wRect * i) / this.m_numColors); let v = this.m_histogram[i] / maxHistValue; - v = (v >= 1.0) ? 1.0 : v; + v = v >= 1.0 ? 1.0 : v; y = yMax - Math.floor(hRect * v); ctx.lineTo(x, y); - } // for (i) all colors + } y = yMax; ctx.lineTo(x, y); } @@ -356,9 +297,9 @@ export default class UiHistogram extends React.Component { if (this.m_peakIndex > 0) { ctx.lineWidth = 1; ctx.strokeStyle = '#eeeeee'; - const x = xMin + Math.floor(wRect * this.m_peakIndex / this.m_numColors); + const x = xMin + Math.floor((wRect * this.m_peakIndex) / this.m_numColors); let v = this.m_histogram[this.m_peakIndex] / maxHistValue; - v = (v >= 1.0) ? 1.0 : v; + v = v >= 1.0 ? 1.0 : v; let y = yMax - Math.floor(hRect * v); ctx.beginPath(); ctx.setLineDash([5, 15]); @@ -369,8 +310,7 @@ export default class UiHistogram extends React.Component { ctx.setLineDash([]); } // render points and lines for modified transfer fucntion - if ((this.m_transfFuncCallback !== undefined) && - (this.m_transfFuncUpdateCallback !== undefined)) { + if (this.m_transfFuncCallback !== undefined && this.m_transfFuncUpdateCallback !== undefined) { this.m_transfFunc.render(ctx, xMin, yMin, wRect, hRect); } } // end update canvas @@ -382,9 +322,6 @@ export default class UiHistogram extends React.Component { } } - /** - * Main component render func callback - */ render() { const vol = this.props.volume; if (vol === undefined) { @@ -395,15 +332,27 @@ export default class UiHistogram extends React.Component { } this.m_transfFuncCallback = this.props.transfFunc; this.m_transfFuncUpdateCallback = this.props.transfFuncUpdate; - + const cw = this.state.width; const ch = this.state.height; - const jsxHist = -
{this.m_canvasOwner = mount} }> - -
; + const jsxHist = ( +
{ + this.m_canvasOwner = mount; + }} + style={{ cursor: 'initial' }} + > + +
+ ); return jsxHist; } } diff --git a/src/ui/Histogram/UiHistogram.jsx b/src/ui/Histogram/UiHistogram.jsx new file mode 100644 index 00000000..e69de29b diff --git a/src/demo/ui/UiHistogram.test.js b/src/ui/Histogram/UiHistogram.test.js similarity index 89% rename from src/demo/ui/UiHistogram.test.js rename to src/ui/Histogram/UiHistogram.test.js index 5a6237b6..762d39ee 100644 --- a/src/demo/ui/UiHistogram.test.js +++ b/src/ui/Histogram/UiHistogram.test.js @@ -1,16 +1,17 @@ -// ******************************************************** -// Imports -// ******************************************************** - +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + import UiHistogram from './UiHistogram'; -import Volume from '../engine/Volume'; +import Volume from '../../engine/Volume'; +import HistogramUtils from './HistogramUtils'; // ******************************************************** // Tests // ******************************************************** describe('UiHistogramTests', () => { - it('testHistogramFromEmptyVolume', () => { const hist = new UiHistogram(); const vol = new Volume(); @@ -62,11 +63,11 @@ describe('UiHistogramTests', () => { const x = DHALF + dx; const tx = 1.0 - dx / RAD; const dist = Math.sqrt(tx * tx + ty * ty + tz * tz); - const val = Math.floor( (NUM_COLORS - 1 ) * dist); + const val = Math.floor((NUM_COLORS - 1) * dist); pixels[x + yOff + zOff] = val; } // for (dx) } // for (dy) - } // for (dz) + } // for (dz) // create hist from volume const hist = new UiHistogram(); @@ -102,7 +103,7 @@ describe('UiHistogramTests', () => { const VAL_RANGE = 96; for (let i = 0; i < NUM_COLORS; i++) { let iDif = i - INDEX_PEAK; - iDif = (iDif >= 0) ? iDif : (-iDif); + iDif = iDif >= 0 ? iDif : -iDif; const r = 1.0 - iDif / VAL_RANGE; histArray[i] = r; } @@ -133,19 +134,19 @@ describe('UiHistogramTests', () => { for (let i = 0; i < NUM_COLORS; i++) { let iDif; iDif = i - INDEX_PEAK_1; - iDif = (iDif >= 0) ? iDif : (-iDif); + iDif = iDif >= 0 ? iDif : -iDif; const r1 = 1.0 - iDif / VAL_RANGE - ARTIF_SUB; iDif = i - INDEX_PEAK_2; - iDif = (iDif >= 0) ? iDif : (-iDif); + iDif = iDif >= 0 ? iDif : -iDif; const r2 = 1.0 - iDif / VAL_RANGE; iDif = i - INDEX_PEAK_3; - iDif = (iDif >= 0) ? iDif : (-iDif); + iDif = iDif >= 0 ? iDif : -iDif; const r3 = 1.0 - iDif / VAL_RANGE - ARTIF_SUB; - const rMax12 = (r1 > r2 ) ? r1 : r2; - const rMax = (rMax12 > r3) ? rMax12 : r3; + const rMax12 = r1 > r2 ? r1 : r2; + const rMax = rMax12 > r3 ? rMax12 : r3; histArray[i] = rMax; } @@ -161,7 +162,7 @@ describe('UiHistogramTests', () => { for (i = 0; i < NUM_COLORS; i++) { histArr[i] = 1; } - const hist = new UiHistogram(); + const hist = new HistogramUtils(); hist.assignArray(NUM_COLORS, histArr); const indMax = hist.getLastMaxIndex(); expect(indMax === -1).toBeTruthy(); @@ -172,7 +173,4 @@ describe('UiHistogramTests', () => { const indFoundMax = hist.getLastMaxIndex(); expect(indFoundMax === IND_MAX).toBeTruthy(); }); - - - }); // all tests diff --git a/src/ui/Layout/Container.jsx b/src/ui/Layout/Container.jsx new file mode 100644 index 00000000..55a4ef1e --- /dev/null +++ b/src/ui/Layout/Container.jsx @@ -0,0 +1,14 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import cx from 'classnames'; + +import css from './Container.module.css'; + +export const Container = ({ children, direction }) => { + const alignStyle = direction === 'vertical' ? css.vertical : css.horizontal; + return
{children}
; +}; diff --git a/src/ui/Layout/Container.module.css b/src/ui/Layout/Container.module.css new file mode 100644 index 00000000..5dccd630 --- /dev/null +++ b/src/ui/Layout/Container.module.css @@ -0,0 +1,28 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.container { + display: inline-flex; + flex-wrap: wrap; + width: fit-content; + border-radius: 10px; + overflow: hidden; +} + +.vertical { + flex-direction: column; + width: 50px; +} + +.vertical:not(:first-child) { + margin-top: 25px; +} + +.horizontal { + flex-direction: row; + flex-shrink: 0; + height: 50px; + margin: 0 25px 0 0; +} diff --git a/src/ui/Layout/FlexRow.jsx b/src/ui/Layout/FlexRow.jsx new file mode 100644 index 00000000..35531ccd --- /dev/null +++ b/src/ui/Layout/FlexRow.jsx @@ -0,0 +1,9 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import css from './index.module.css'; + +export const FlexRow = ({ children }) =>
{children}
; diff --git a/src/ui/Layout/index.module.css b/src/ui/Layout/index.module.css new file mode 100644 index 00000000..7b34e961 --- /dev/null +++ b/src/ui/Layout/index.module.css @@ -0,0 +1,22 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.flexRow { + display: flex; + justify-content: flex-start; + align-items: stretch; +} + +.flexRow > *:not(:first-child):not(:last-child) { + margin: 0 5px; +} + +.flexRow > *:first-child { + margin-right: 5px; +} + +.flexRow > *:last-child { + margin-left: 5px; +} diff --git a/src/ui/LeftToolbar/LeftToolbar.jsx b/src/ui/LeftToolbar/LeftToolbar.jsx new file mode 100644 index 00000000..3074984f --- /dev/null +++ b/src/ui/LeftToolbar/LeftToolbar.jsx @@ -0,0 +1,25 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { useSelector } from 'react-redux'; + +import ViewMode from '../../store/ViewMode'; +import { ModeSwitcherToolbar } from './ModeSwitcherToolbar'; +import { ModeFast3dToolbar } from './ModeFast3dToolbar'; +import ModeView from '../../store/ViewMode'; +import { Mode2dToolbar } from './Mode2dToolbar'; + +export const LeftToolbar = () => { + const { viewMode } = useSelector((state) => state); + + return ( + <> + + {viewMode === ViewMode.VIEW_3D_LIGHT && } + {viewMode === ModeView.VIEW_2D && } + + ); +}; diff --git a/src/ui/LeftToolbar/LeftToolbar.test.jsx b/src/ui/LeftToolbar/LeftToolbar.test.jsx new file mode 100644 index 00000000..d90e57e1 --- /dev/null +++ b/src/ui/LeftToolbar/LeftToolbar.test.jsx @@ -0,0 +1,41 @@ +import { LeftToolbar } from './LeftToolbar'; +import { renderWithState } from '../../utils/configureTest'; +import ViewMode from '../../store/ViewMode'; +import { useNeedShow3d } from '../../utils/useNeedShow3d'; +import { ModeSwitcherToolbar } from './ModeSwitcherToolbar'; +import { ModeFast3dToolbar } from './ModeFast3dToolbar'; +import { Mode2dToolbar } from './Mode2dToolbar'; + +jest.mock('./ModeSwitcherToolbar', () => ({ + ModeSwitcherToolbar: jest.fn(() =>
ModeSwitcherToolbar
), +})); +jest.mock('./ModeFast3dToolbar', () => ({ + ModeFast3dToolbar: jest.fn(() =>
ModeFast3dToolbar
), +})); +jest.mock('./Mode2dToolbar', () => ({ + Mode2dToolbar: jest.fn(() =>
Mode2dToolbar
), +})); + +jest.mock('../../utils/useNeedShow3d'); +const mockedUseNeedShow3d = useNeedShow3d; +describe('test leftToolbar', () => { + it('should be render modeFast3Dtollbar', () => { + mockedUseNeedShow3d.mockReturnValue(true); + // eslint-disable-next-line react/react-in-jsx-scope + const { store } = renderWithState(, { viewMode: ViewMode.VIEW_3D_LIGHT }); + expect(store.getState().viewMode).toBe(ViewMode.VIEW_3D_LIGHT); + expect(ModeSwitcherToolbar).toBeCalledTimes(1); + expect(ModeFast3dToolbar).toBeCalledTimes(1); + expect(Mode2dToolbar).toBeCalledTimes(0); + }); + + it('should be render mode2DTollbar', () => { + mockedUseNeedShow3d.mockReturnValue(true); + // eslint-disable-next-line react/react-in-jsx-scope + const { store } = renderWithState(, { viewMode: ViewMode.VIEW_2D }); + expect(store.getState().viewMode).toBe(ViewMode.VIEW_2D); + expect(ModeSwitcherToolbar).toBeCalledTimes(2); + expect(ModeFast3dToolbar).toBeCalledTimes(1); + expect(Mode2dToolbar).toBeCalledTimes(1); + }); +}); diff --git a/src/ui/LeftToolbar/Mode2dToolbar.jsx b/src/ui/LeftToolbar/Mode2dToolbar.jsx new file mode 100644 index 00000000..7af523e2 --- /dev/null +++ b/src/ui/LeftToolbar/Mode2dToolbar.jsx @@ -0,0 +1,63 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { useDispatch, useSelector } from 'react-redux'; + +import Modes2d from '../../store/Modes2d'; +import StoreActionType from '../../store/ActionTypes'; +import { UIButton } from '../Button/Button'; +import { Container } from '../Layout/Container'; +import { Tooltip } from '../Tooltip/Tooltip'; + +export const Mode2dToolbar = () => { + const dispatch = useDispatch(); + const { graphics2d, mode2d } = useSelector((state) => state); + + const onMode = (indexMode) => { + dispatch({ type: StoreActionType.SET_MODE_2D, mode2d: indexMode }); + graphics2d.m_mode2d = indexMode; + graphics2d.clear(); + + dispatch({ type: StoreActionType.SET_2D_ZOOM, render2dZoom: 1.0 }); + + // build render image + graphics2d.forceUpdate(); + // render just builded image + graphics2d.forceRender(); + }; + + const onModeSaggital = () => { + onMode(Modes2d.SAGGITAL); + }; + + const onModeCoronal = () => { + onMode(Modes2d.CORONAL); + }; + + const onModeTransverse = () => { + onMode(Modes2d.TRANSVERSE); + }; + + const isModeActivated = (mode) => { + return mode2d === mode; + }; + + return ( + <> + + + + + + + + + + + + + ); +}; diff --git a/src/ui/LeftToolbar/Mode2dToolbar.test.jsx b/src/ui/LeftToolbar/Mode2dToolbar.test.jsx new file mode 100644 index 00000000..cf8c6080 --- /dev/null +++ b/src/ui/LeftToolbar/Mode2dToolbar.test.jsx @@ -0,0 +1,41 @@ +import React from 'react'; +import Modes2d from '../../store/Modes2d'; +import { Mode2dToolbar } from './Mode2dToolbar'; +import { fireEvent, screen } from '@testing-library/react'; +import { renderWithState } from '../../utils/configureTest'; + +describe('Mode2dToolbarTest', () => { + const initialState = { + mode2d: Modes2d.SAGGITAL, + graphics2d: { m_mode2d: null, clear: () => {}, forceUpdate: () => {}, forceRender: () => {} }, + }; + it('test button saggital', () => { + const { store } = renderWithState(, initialState); + expect(store.getState().mode2d).toBe(Modes2d.SAGGITAL); + expect(store.getState().graphics2d.m_mode2d).toBe(null); + fireEvent.click(screen.getByTestId('buttonSaggital')); + expect(store.getState().graphics2d.m_mode2d).toBe(Modes2d.SAGGITAL); + expect(store.getState().mode2d).toBe(Modes2d.SAGGITAL); + expect(store.getState().render2dZoom).toBe(1); + }); + + it('test button coronal', () => { + const { store } = renderWithState(, initialState); + expect(store.getState().mode2d).toBe(Modes2d.SAGGITAL); + expect(store.getState().graphics2d.m_mode2d).toBe(0); + fireEvent.click(screen.getByTestId('buttonCoronal')); + expect(store.getState().graphics2d.m_mode2d).toBe(Modes2d.CORONAL); + expect(store.getState().mode2d).toBe(Modes2d.CORONAL); + expect(store.getState().render2dZoom).toBe(1); + }); + + it('test button transverse', () => { + const { store } = renderWithState(, initialState); + expect(store.getState().mode2d).toBe(Modes2d.SAGGITAL); + expect(store.getState().graphics2d.m_mode2d).toBe(1); + fireEvent.click(screen.getByTestId('buttonTransverse')); + expect(store.getState().graphics2d.m_mode2d).toBe(Modes2d.TRANSVERSE); + expect(store.getState().mode2d).toBe(Modes2d.TRANSVERSE); + expect(store.getState().render2dZoom).toBe(1); + }); +}); diff --git a/src/ui/LeftToolbar/ModeFast3dToolbar.jsx b/src/ui/LeftToolbar/ModeFast3dToolbar.jsx new file mode 100644 index 00000000..43b9c624 --- /dev/null +++ b/src/ui/LeftToolbar/ModeFast3dToolbar.jsx @@ -0,0 +1,32 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Tooltip } from '../Tooltip/Tooltip'; +import { UIButton } from '../Button/Button'; +import { Container } from '../Layout/Container'; +import React from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import StoreActionType from '../../store/ActionTypes'; + +export function ModeFast3dToolbar() { + const dispatch = useDispatch(); + const { isTool3D } = useSelector((state) => state); + + const toggleIsTool3d = () => { + dispatch({ type: StoreActionType.SET_IS_TOOL3D, isTool3D: !isTool3D }); + dispatch({ type: StoreActionType.SET_SLIDER_Contrast3D, sliderContrast3D: 0 }); + }; + + return ( + + + + + + + + + ); +} diff --git a/src/ui/LeftToolbar/ModeFast3dToolbar.test.jsx b/src/ui/LeftToolbar/ModeFast3dToolbar.test.jsx new file mode 100644 index 00000000..2e71fe6e --- /dev/null +++ b/src/ui/LeftToolbar/ModeFast3dToolbar.test.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { ModeFast3dToolbar } from './ModeFast3dToolbar'; +import { renderWithState } from '../../utils/configureTest'; +import { fireEvent, screen } from '@testing-library/react'; + +describe('ModeFast3dToolbarTest', () => { + it('Test UIButton V', () => { + const { store } = renderWithState(, { isTool3D: true }); + expect(store.getState().isTool3D).toBe(true); + + fireEvent.click(screen.getByTestId('buttonV')); + + expect(store.getState().sliderContrast3D).toBe(0); + expect(store.getState().isTool3D).toBe(false); + }); + + it('Test UIButton T', () => { + const { store } = renderWithState(, { isTool3D: true }); + expect(store.getState().isTool3D).toBe(true); + + fireEvent.click(screen.getByTestId('buttonT')); + + expect(store.getState().isTool3D).toBe(false); + expect(store.getState().sliderContrast3D).toBe(0); + }); +}); diff --git a/src/ui/LeftToolbar/ModeSwitcherToolbar.jsx b/src/ui/LeftToolbar/ModeSwitcherToolbar.jsx new file mode 100644 index 00000000..e1cb92bb --- /dev/null +++ b/src/ui/LeftToolbar/ModeSwitcherToolbar.jsx @@ -0,0 +1,55 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React from 'react'; +import { Tooltip } from '../Tooltip/Tooltip'; +import { UIButton } from '../Button/Button'; +import { Container } from '../Layout/Container'; +import { useDispatch, useSelector } from 'react-redux'; +import StoreActionType from '../../store/ActionTypes'; +import ViewMode from '../../store/ViewMode'; +import { useNeedShow3d } from '../../utils/useNeedShow3d'; + +export function ModeSwitcherToolbar() { + const dispatch = useDispatch(); + const { volumeSet, volumeIndex, viewMode } = useSelector((state) => state); + + const needShow3d = useNeedShow3d(volumeSet, volumeIndex); + + const setMode = (indexMode) => { + dispatch({ type: StoreActionType.SET_MODE_VIEW, viewMode: indexMode }); + }; + + const set2dMode = () => { + setMode(ViewMode.VIEW_2D); + }; + + const setFast3dMode = () => { + setMode(ViewMode.VIEW_3D_LIGHT); + }; + + const set3dMode = () => { + setMode(ViewMode.VIEW_3D); + }; + + const isModeActivated = (mode) => { + return viewMode === mode; + }; + + return ( + + + + + + + + {needShow3d && ( + + + + )} + + ); +} diff --git a/src/ui/LeftToolbar/ModeSwitcherToolbar.test.jsx b/src/ui/LeftToolbar/ModeSwitcherToolbar.test.jsx new file mode 100644 index 00000000..260ceec1 --- /dev/null +++ b/src/ui/LeftToolbar/ModeSwitcherToolbar.test.jsx @@ -0,0 +1,47 @@ +import React from 'react'; +import { renderWithState } from '../../utils/configureTest'; +import { fireEvent, screen } from '@testing-library/react'; +import { ModeSwitcherToolbar } from './ModeSwitcherToolbar'; +import ViewMode from '../../store/ViewMode'; +import { useNeedShow3d } from '../../utils/useNeedShow3d'; + +jest.mock('../../utils/useNeedShow3d'); +const mockedUseNeedShow3d = useNeedShow3d; + +describe('ModeSwitcherToolbarTest', () => { + it('test button 2D', () => { + mockedUseNeedShow3d.mockReturnValue(true); + const { store } = renderWithState(, { viewMode: ViewMode.VIEW_2D }); + expect(store.getState().viewMode).toBe(ViewMode.VIEW_2D); + fireEvent.click(screen.getByTestId('Button2D')); + expect(store.getState().viewMode).toBe(ViewMode.VIEW_2D); + }); + + it('test button lightning', () => { + mockedUseNeedShow3d.mockReturnValue(true); + const { store } = renderWithState(, { viewMode: ViewMode.VIEW_2D }); + expect(store.getState().viewMode).toBe(ViewMode.VIEW_2D); + fireEvent.click(screen.getByTestId('ButtonLightning')); + expect(store.getState().viewMode).toBe(ViewMode.VIEW_3D_LIGHT); + }); + + it('test button 3D', () => { + mockedUseNeedShow3d.mockReturnValue(true); + const { store } = renderWithState(, { viewMode: ViewMode.VIEW_2D }); + expect(store.getState().viewMode).toBe(ViewMode.VIEW_2D); + fireEvent.click(screen.getByTestId('Button3D')); + expect(store.getState().viewMode).toBe(ViewMode.VIEW_3D); + }); + + it('should be render button3D', () => { + mockedUseNeedShow3d.mockReturnValue(false); + renderWithState(); + expect(screen.queryByTestId('Button3D')).not.toBeInTheDocument(); + }); + + it('should be render button3D', () => { + mockedUseNeedShow3d.mockReturnValue(true); + renderWithState(); + expect(screen.getByTestId('Button3D')).toBeInTheDocument(); + }); +}); diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx new file mode 100644 index 00000000..ca9d5dfb --- /dev/null +++ b/src/ui/Main.jsx @@ -0,0 +1,208 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React, { useEffect, useRef, useState } from 'react'; +import StoreActionType from '../store/ActionTypes'; + +import FullScreenToggle from './Toolbars/FullScreen'; +import UiModalText from './Modals/UiModalText'; +import UiModalAlert from './Modals/ModalAlert'; +import UiErrConsole from './UiErrConsole'; +import ModeView from '../store/ViewMode'; +import Graphics2d from '../engine/Graphics2d'; +import BrowserDetector from '../engine/utils/BrowserDetector'; +import UIProgressBar from './ProgressBar/UIProgressBar'; +import Graphics3d from '../engine/Graphics3d'; +import ZoomTools from './UiZoomTools'; +import { useDrop } from 'react-dnd'; +import { DnDItemTypes } from './Constants/DnDItemTypes'; +import { Header } from './Header/Header'; +import { RightPanel } from './Panels/RightPanel'; +import Spinner from './ProgressBar/UISpinner'; +import { AppContextProvider } from './App/AppContext'; + +import { LeftToolbar } from './LeftToolbar/LeftToolbar'; +import { useDispatch, useSelector } from 'react-redux'; +import { TopToolbar } from './TopToolbar/TopToolbar'; +import { UiAbout } from './Header/UiAbout'; +import StartScreen from './StartScreen/StartScreen'; +import css from './Main.module.css'; +import cx from 'classnames'; +import '../nouislider-custom.css'; + +export const Main = () => { + const dispatch = useDispatch(); + const { arrErrors, isLoaded, progress, spinner, viewMode, showModalText, showModalAlert } = useSelector((state) => state); + + const [m_fileNameOnLoad, setM_fileNameOnLoad] = useState(false); + const [isWebGl20supported, setIsWebGl20supported] = useState(true); + const [strAlertTitle, setStrAlertTitle] = useState(''); + const [strAlertText, setStrAlertText] = useState(''); + const [isFullMode, setIsFullMode] = useState(false); + const appRef = useRef(); + + const [, drop] = useDrop( + () => ({ + accept: DnDItemTypes.SETTINGS, + drop(item, monitor) { + const delta = monitor.getDifferenceFromInitialOffset(); + return delta; + }, + }), + [] + ); + + const isReady = isLoaded && isWebGl20supported; + + const onShowModalText = () => { + dispatch({ type: StoreActionType.SET_MODAL_TEXT, showModalText: true }); + }; + + const onHideModalText = () => { + dispatch({ type: StoreActionType.SET_MODAL_TEXT, showModalText: false }); + }; + + const onShowModalAlert = () => { + dispatch({ type: StoreActionType.SET_MODAL_ALERT, showModalAlert: true }); + }; + + const onHideModalAlert = () => { + dispatch({ type: StoreActionType.SET_MODAL_ALERT, showModalAlert: false }); + }; + + const startFullMode = () => { + return appRef.current.requestFullscreen().then(() => { + // TODO: add notification for user + console.log(`%cFullscreen entered`, 'color:green'); + }); + }; + + const endFullMode = () => { + return document.exitFullscreen().then(() => { + // TODO: add notification for user + console.log(`%cFullscreen exited`, 'color:green'); + }); + }; + + const handleFullMode = () => { + const fn = isFullMode ? endFullMode : startFullMode; + fn().catch((err) => { + // TODO: add notification for user + console.log(`%cFullscreen error: ${err.message}`, 'color:red'); + }); + }; + + const onFullScreenChange = () => { + setIsFullMode(!isFullMode); + }; + + useEffect(() => { + const strSearch = window.location.search; + if (strSearch.length > 0) { + const strReg = /\\?url=(\S+)/; + const arr = strSearch.match(strReg); + if (arr === null) { + console.log('arguments should be in form: ?url=www.xxx.yy/zz/ww'); + return; + } + let fileNameOnLoad = arr[1]; + const regA = /^((ftp|http|https):\/\/)?(([\S]+)\.)?([\S]+)\.([A-z]{2,})(:\d{1,6})?\/[\S]+/; + const regB = /(ftp|http|https):\/\/([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)(:([\d]+))?\/([\S]+)/; + const isValidA = fileNameOnLoad.match(regA); + const isValidB = fileNameOnLoad.match(regB); + if (isValidA === null && isValidB === null) { + console.log(`Not valid URL = ${fileNameOnLoad}`); + return; + } + setM_fileNameOnLoad(fileNameOnLoad); + } + }, [m_fileNameOnLoad]); + + useEffect(() => { + // browser detector + const browserDetector = new BrowserDetector(); + setIsWebGl20supported(browserDetector.checkWebGlSupported()); + if (!isWebGl20supported) { + setStrAlertTitle('Browser compatibility problem detected'); + setStrAlertText('This browser not supported WebGL 2.0. Application functionality is decreased and' + ' app can be unstable'); + onShowModalAlert(); + } else { + const isValidBro = browserDetector.checkValidBrowser(); + if (!isValidBro) { + setStrAlertTitle('Browser compatibility problem detected'); + setStrAlertText('App is specially designed for Chrome/Firefox/Opera/Safari browsers'); + onShowModalAlert(); + } + } + }, [strAlertText, strAlertTitle, isWebGl20supported]); + + useEffect(() => { + document.addEventListener('fullscreenchange', onFullScreenChange); + return () => { + document.removeEventListener('fullscreenchange', onFullScreenChange); + }; + }, [isFullMode]); + + return ( + +
+
+ {progress > 0 ? : null} + {spinner ? : null} + {isReady ? ( +
+ {!isFullMode && ( +
+ +
+ )} + {isReady && ( +
+
+ +
+ handleFullMode()} /> +
+
+
+ )} + {!isFullMode && ( +
+
+
+ )} +
+ ) : ( + + )} + + {isReady && ( +
+
+ +
+ +
{viewMode === ModeView.VIEW_2D ? : }
+
{viewMode === ModeView.VIEW_2D && }
+ +
+ )} + {arrErrors.length > 0 && } + {showModalText && ( + + )} + {showModalAlert && ( + + )} +
+
+
+ ); +}; diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css new file mode 100644 index 00000000..1c359edb --- /dev/null +++ b/src/ui/Main.module.css @@ -0,0 +1,87 @@ +/*! + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.app { + position: relative; +} + +.header { + display: flex; + align-items: center; + position: relative; + margin: 25px 25px 0; + z-index: 1000; +} + +.header__logo { + margin-right: 25px; +} + +.header__panels { + display: flex; + z-index: 1000; + margin-top: 17px; +} + +.header__right { + display: flex; + flex-wrap: nowrap; + align-items: center; + margin-left: auto; + margin-top: 17px; +} + +.fullscreen .header__panels { + position: absolute; + left: 75px; +} + +.fullscreen .left, +.fullscreen .settings { + top: 20px; +} + +.left { + display: flex; + flex-direction: column; + position: absolute; + left: 25px; + top: 100px; + z-index: 900; +} + +.center { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 10; +} + +.settings { + display: flex; + flex-direction: column; + z-index: 800; + position: absolute; + right: 25px; + top: 100px; + background-color: var(--dark-gray); + padding: 25px; + width: 400px; + opacity: var(--opacity); + cursor: all-scroll; + border-radius: 24px; + transition: opacity 300ms ease-in-out; +} + +.bottleft { + display: flex; + flex-direction: column; + position: absolute; + left: 25px; + bottom: 25px; + z-index: 1000; +} \ No newline at end of file diff --git a/src/ui/Modals/ModalAlert.jsx b/src/ui/Modals/ModalAlert.jsx new file mode 100644 index 00000000..899e047f --- /dev/null +++ b/src/ui/Modals/ModalAlert.jsx @@ -0,0 +1,28 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { Modal, ModalBody, ModalFooter, ModalHeader } from './ModalBase'; +import { UIButton } from '../Button/Button'; + +import css from './Modals.module.css'; + +export const ModalAlert = (props) => { + const { onHide, stateVis, title, text } = props; + + return ( + + + +

{text}

+
+ + + +
+ ); +}; + +export default ModalAlert; diff --git a/src/ui/Modals/ModalBase.jsx b/src/ui/Modals/ModalBase.jsx new file mode 100644 index 00000000..c4a8cf3f --- /dev/null +++ b/src/ui/Modals/ModalBase.jsx @@ -0,0 +1,50 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import ReactModal from 'react-modal'; +import { SVG } from '../Button/SVG'; +import { ButtonContainer } from '../Button/Button'; + +import css from './Modals.module.css'; + +ReactModal.setAppElement('#root'); + +export const Modal = ({ isOpen, close, children }) => { + return ( + document.querySelector('#root')} + className={css.modal} + overlayClassName={css.overlay} + onRequestClose={close} + > + {children} + + ); +}; + +export const ModalHeader = ({ title, close }) => { + return ( +
+
{title}
+ {close && } +
+ ); +}; + +export const CloseButton = ({ onClick }) => ( + + + +); + +export const ModalBody = ({ children }) => { + return
{children}
; +}; + +export const ModalFooter = ({ children }) => { + return
{children}
; +}; diff --git a/src/ui/Modals/ModalDemo.jsx b/src/ui/Modals/ModalDemo.jsx new file mode 100644 index 00000000..c1cc47ef --- /dev/null +++ b/src/ui/Modals/ModalDemo.jsx @@ -0,0 +1,51 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useCallback } from 'react'; + +import { Modal, ModalHeader, ModalBody } from './ModalBase'; +import { ButtonContainer } from '../Button/Button'; +import { Tooltip } from '../Tooltip/Tooltip'; + +import { demoData } from './demoData'; + +import css from './Modals.module.css'; + +const ModalDemo = (props) => { + const { stateVis, onHide, onSelectDemo } = props; + + const onDemo = useCallback( + (id) => { + onSelectDemo(id); + onHide(); + }, + [onSelectDemo, onHide] + ); + + return ( + + + +
+ {demoData.map((data) => ( + onDemo(data.id)} key={data.id} /> + ))} +
+
+
+ ); +}; + +const DemoItem = ({ tooltip, image, alt, onClick }) => { + return ( + + + {alt} + + + ); +}; + +export default ModalDemo; diff --git a/src/ui/Modals/ModalInfo.jsx b/src/ui/Modals/ModalInfo.jsx new file mode 100644 index 00000000..2535641f --- /dev/null +++ b/src/ui/Modals/ModalInfo.jsx @@ -0,0 +1,147 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useCallback, useMemo, useState } from 'react'; +import { connect } from 'react-redux'; +import { Modal, ModalBody, ModalFooter, ModalHeader } from './ModalBase'; +import { UIButton } from '../Button/Button'; + +import css from './ModalInfo.module.css'; +import styles from './Modals.module.css'; + +const getVolInfo = (volSet, vol) => { + const strMsg = []; + const xSize = Math.floor(vol.m_boxSize.x); + const ySize = Math.floor(vol.m_boxSize.y); + const zSize = Math.floor(vol.m_boxSize.z); + + strMsg.push('volume dim = ' + vol.m_xDim.toString() + ' * ' + vol.m_yDim.toString() + ' * ' + vol.m_zDim.toString()); + strMsg.push('vol phys size = ' + xSize.toString() + ' * ' + ySize.toString() + ' * ' + zSize.toString()); + const patName = volSet.m_patientName; + if (patName.length > 1) { + strMsg.push('patient name = ' + patName); + } + const patBirth = volSet.m_patientBirth; + if (patBirth.length > 1) { + strMsg.push('patient birth = ' + patBirth); + } + const seriesDescr = volSet.m_seriesDescr; + if (seriesDescr.length > 1) { + strMsg.push('series descr = ' + seriesDescr); + } + const institutionName = volSet.m_institutionName; + if (institutionName.length > 1) { + strMsg.push('institution name = ' + institutionName); + } + const operatorsName = volSet.m_operatorsName; + if (operatorsName.length > 1) { + strMsg.push('operators name = ' + operatorsName); + } + const physicansName = volSet.m_physicansName; + if (physicansName.length > 1) { + strMsg.push('physicans name = ' + physicansName); + } + return strMsg; +}; + +const VolInfo = ({ info }) => ( + <> +

Volume information:

+
    + {info.map((info) => ( +
  • + {info} +
  • + ))} +
+ +); + +const SliceSelect = ({ slices, onValueChange, value }) => { + return ( + <> + +
+ +
+ + ); +}; + +const TagsList = ({ tags }) => ( + + + + + + + + + + {tags.map(({ m_tag: tag, m_attrName: attrName, m_attrValue: attrValue }, i) => { + const strVal = attrValue.length > 0 ? attrValue : '-'; + return ( + + + + + + ); + })} + +
TagAttribute NameAttribute Value
{tag}{attrName}{strVal}
+); + +const ModalInfo = (props) => { + const { + stateVis, + onHide, + store: { dicomInfo, volumeSet, volumeIndex }, + } = props; + const [currentSlice, setCurrentSlice] = useState(0); + + const onSelectSlice = useCallback((evt) => { + const newVal = evt.target.value; + setCurrentSlice(newVal); + }, []); + + const volInfo = useMemo(() => { + const volume = volumeSet.getVolume(volumeIndex); + return getVolInfo(volumeSet, volume); + }, [volumeSet, volumeIndex]); + + const slicesInfo = dicomInfo?.m_sliceInfo || []; + const tagsList = slicesInfo[currentSlice]?.m_tags || []; + + return ( + + + + {volInfo.length > 0 && } + {slicesInfo.length > 0 && } + {tagsList.length > 0 && } + {slicesInfo.length > 0 && tagsList.length === 0 &&

No tags found

} +
+ + + +
+ ); +}; + +export default connect((store, props) => ({ store, ...props }))(ModalInfo); diff --git a/src/ui/Modals/ModalInfo.module.css b/src/ui/Modals/ModalInfo.module.css new file mode 100644 index 00000000..5f842994 --- /dev/null +++ b/src/ui/Modals/ModalInfo.module.css @@ -0,0 +1,109 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.subtitle { + margin: 0; + padding: 0; + font-weight: 400; + display: block; +} + +.list { + padding: 10px 0; + margin: 0; +} + +.item { + list-style: none; + font-size: 14px; +} + +.selectWrapper { + position: relative; + display: flex; + width: 300px; + height: 30px; + line-height: 1.25; + background: var(--light); + overflow: hidden; + border-radius: 5px; + margin: 5px 0 10px; +} + +.selectWrapper::after { + content: '\25BC'; + color: var(--dark-gray); + position: absolute; + top: 0; + right: 0; + padding: 5px 10px; + border-left: 1px solid var(--gray); + cursor: pointer; + pointer-events: none; + -webkit-transition: 0.25s all ease; + -o-transition: 0.25s all ease; + transition: 0.25s all ease; +} + +.selectWrapper:hover::after { + color: var(--red); +} + +.select { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + appearance: none; + outline: 0; + box-shadow: none; + border: 0 !important; + background: var(--light); + background-image: none; + font-family: inherit; + font-size: inherit; +} + +.select::-ms-expand { + display: none; +} + +.select { + flex: 1; + padding: 0 10px; + color: var(--dark-gray); + cursor: pointer; +} + +.table { + table-layout: fixed; + width: 100%; + border-collapse: collapse; + border: 1px solid var(--light); +} + +.thead { + font-size: 14px; + text-align: left; +} + +.thead th:nth-child(1) { + width: 30%; +} + +.thead th:nth-child(2) { + width: 30%; +} + +.thead th:nth-child(3) { + width: 40%; +} + +.table th, +.table td { + padding: 5px; + font-size: 14px; + border: 1px dashed var(--light); + word-break: break-word; +} diff --git a/src/ui/Modals/ModalUrl.jsx b/src/ui/Modals/ModalUrl.jsx new file mode 100644 index 00000000..5a0d63c7 --- /dev/null +++ b/src/ui/Modals/ModalUrl.jsx @@ -0,0 +1,39 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useRef } from 'react'; +import { Modal, ModalBody, ModalFooter, ModalHeader } from './ModalBase'; +import { UIButton } from '../Button/Button'; + +import css from './Modals.module.css'; +import buttonCss from '../Button/Button.module.css'; + +export const ModalUrl = (props) => { + const { stateVis, onHide, loadUrl } = props; + const inputRef = useRef(); + + return ( + + + +
+ + + {/* TODO: add validation for Url */} +
+
+ + loadUrl(inputRef.current.value)} /> + +
+ ); +}; + +export default ModalUrl; diff --git a/src/ui/Modals/Modals.module.css b/src/ui/Modals/Modals.module.css new file mode 100644 index 00000000..a9db28e5 --- /dev/null +++ b/src/ui/Modals/Modals.module.css @@ -0,0 +1,168 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1003; + background-color: rgba(0, 0, 0, 0.5); +} + +.modal { + z-index: 1004; + position: absolute; + width: 93%; + top: 15vh; + left: 49%; + margin: 0 5px; + transform: translateX(-50%); + color: var(--white); + border-radius: 5px; + background-color: var(--dark-gray); + transition: 1s ease-out; + display: flex; + flex-direction: column; +} + +.header, +.body, +.footer { + padding: 15px 20px; +} + +.header, +.footer { + display: flex; + align-items: center; +} + +.header { + box-sizing: content-box; + justify-content: space-between; + border-bottom: 1px solid var(--gray); + min-height: 36px; +} + +.footer { + justify-content: flex-end; + border-top: 1px solid var(--gray); +} + +.body { + position: relative; + top: 0; + right: 0; + bottom: 0; + left: 0; + overflow-y: visible; +} + +.title { + padding: 0; + margin: 0; + font-size: 16px; + font-weight: 600; +} + +.close:hover svg, +.close:focus svg { + fill: var(--gray); +} + +.cards { + display: grid; + grid-gap: 15px; + grid-template-columns: auto auto; +} + +.card { + border-radius: 4px; + overflow: hidden; +} + +.card:hover, +.card:focus { + box-shadow: 0px 2px 10px 4px rgba(255, 255, 255, 0.2); +} + +.row { + display: flex; + flex-wrap: wrap; +} + +.row label { + font-size: 14px; +} + +.row *:not(:first-child) { + margin-top: 10px; +} + +.label { + margin: 0; + padding: 0; + display: flex; + align-items: center; +} + +.input { + flex-grow: 1; + border: 1px solid var(--dark-gray); + background-color: var(--gray); + border-radius: 5px; + padding: 8px; + font: inherit; + color: inherit; +} + +.input::placeholder { + color: inherit; + font: inherit; +} + +.input:focus { + outline-color: var(--light); +} + +.button { + background-color: transparent; + border-radius: 5px; + border: 1px solid var(--light); + padding: 5px 10px; + font-weight: 400; + letter-spacing: 0.5px; + font-size: 16px; +} + +.button:hover { + background-color: var(--light); + color: var(--dark-gray); +} + +.text { + margin: 0; + padding: 0; + font-size: 18px; + line-height: 1.5; + color: var(--white); +} + +@media screen and (min-width: 768px) { + .modal { + width: 600px; + top: calc(50vh - 180px); + } + + .cards { + grid-template-columns: repeat(auto-fill, 128px); + } + + .row label { + font-size: 16px; + } +} diff --git a/src/ui/Modals/UiModalBilateral.jsx b/src/ui/Modals/UiModalBilateral.jsx new file mode 100644 index 00000000..d0ab73c8 --- /dev/null +++ b/src/ui/Modals/UiModalBilateral.jsx @@ -0,0 +1,194 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { connect } from 'react-redux'; + +import { Nouislider } from '../Nouislider/Nouislider'; + +import GaussSmoother from '../../engine/imgproc/Gauss'; + +import StoreActionType from '../../store/ActionTypes'; +import ViewMode from '../../store/ViewMode'; +import Modes3d from '../../store/Modes3d'; +import { Modal, ModalBody, ModalFooter, ModalHeader } from './ModalBase'; +import { UIButton } from '../Button/Button'; + +import buttonCss from '../Button/Button.module.css'; + +class UiModalBilateral extends React.Component { + constructor(props) { + super(props); + this.onModalShow = this.onModalShow.bind(this); + this.onModalHide = this.onModalHide.bind(this); + this.onButtonStart = this.onButtonStart.bind(this); + this.onChangeSliderKoefDist = this.onChangeSliderKoefDist.bind(this); + this.onChangeSliderKoefVal = this.onChangeSliderKoefVal.bind(this); + + this.onBilateralCallback = this.onBilateralCallback.bind(this); + + this.m_hideFunc = null; + this.m_gauss = null; + + this.state = { + showModalGauss: false, + text: 'dump', + }; + + this.m_kernelSize = 10; + this.m_koefDist = 3.0; + this.m_koefVal = 0.1; + } + + onButtonStart() { + console.log('on button start Bilateral with kernel = ' + this.m_kernelSize.toString()); + this.m_hideFunc(); + + const store = this.props; + + const volSet = store.volumeSet; + const volIndex = store.volumeIndex; + const vol = volSet.getVolume(volIndex); + + if (vol === undefined || vol === null) { + console.log('onButtonSobel: no volume!'); + return; + } + this.m_vol = vol; + const xDim = vol.m_xDim; + const yDim = vol.m_yDim; + const zDim = vol.m_zDim; + if (xDim * yDim * zDim < 1) { + console.log(`onButtonBilateral: bad volume! dims = ${xDim}*${yDim}*${zDim}`); + return; + } + // let volTextureSrc = vol.m_dataArray; + const ONE = 1; + if (vol.m_bytesPerVoxel !== ONE) { + console.log('onButtonBilateral: supported only 1bpp volumes'); + return; + } + + console.log('onButtonBilateral: start 3d bilateral filtration...'); + //const xyzDim = xDim * yDim * zDim; + //const volTextureDst = new Uint8Array(xyzDim); + + const NEED_HW = true; + const gauss = new GaussSmoother(NEED_HW); + + // test + // gauss.testSimple(); + + const kernelSize = this.m_kernelSize; + gauss.start(vol, kernelSize, this.m_koefDist, this.m_koefVal); + this.m_gauss = gauss; + store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); + const UPDATE_DELAY_MSEC = 150; + this.m_timerId = setTimeout(this.onBilateralCallback, UPDATE_DELAY_MSEC); + } + + onBilateralCallback() { + this.m_gauss.update(); + + const store = this.props; + + let ratioUpdate = this.m_gauss.getRatio(); + ratioUpdate = ratioUpdate < 1.0 ? ratioUpdate : 1.0; + ratioUpdate *= 100; + ratioUpdate = Math.floor(ratioUpdate); + // console.log('ratio = ' + ratioUpdate.toString() ); + + store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: ratioUpdate }); + const isFinished = this.m_gauss.isFinished(); + + if (isFinished) { + console.log('onBilateralCallback: iters finished!'); + store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); + + clearInterval(this.m_timerId); + this.m_timerId = 0; + + const volSet = store.volumeSet; + const volIndex = store.volumeIndex; + const vol = volSet.getVolume(volIndex); + + const xDim = vol.m_xDim; + const yDim = vol.m_yDim; + const zDim = vol.m_zDim; + const xyzDim = xDim * yDim * zDim; + const pixelsDst = this.m_gauss.getPixelsDst(); + for (let i = 0; i < xyzDim; i++) { + vol.m_dataArray[i] = Math.floor(pixelsDst[i]); + } // for i + this.m_gauss.stop(); + + // rebuild 3d data + store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: volSet }); + store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); + store.dispatch({ type: StoreActionType.SET_MODE_VIEW, viewMode: ViewMode.VIEW_2D }); + store.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); + } // if finished + // update render + store.graphics2d.forceUpdate(); + // next update timer + if (!isFinished) { + const UPDATE_DELAY_MSEC = 150; + this.m_timerId = setTimeout(this.onBilateralCallback, UPDATE_DELAY_MSEC); + } + } // end onBilateralCallback + + // + onModalShow() { + this.setState({ showModalGauss: true }); + } + + onModalHide() { + this.setState({ showModalGauss: false }); + } + + onChangeSliderKoefDist(value) { + this.m_updateEnable = false; + this.m_koefDist = value; + } + + onChangeSliderKoefVal(value) { + this.m_updateEnable = false; + this.m_koefVal = value; + } + + // + render() { + const stateVis = this.props.stateVis; + const onHideFunc = this.props.onHide; + this.m_hideFunc = onHideFunc; + + const defaultDist = 3; + const defaultVal = 0.1; + + return ( + + + + + Select koefficient distance (kd) + + Select koefficient value (kv) + +

+ Hints to setup values:
+ kd = 0.5, kv = 0.1 ={'>'} original image
+ kd = 3.0, kv = 0.1 ={'>'} denoise image
+ kd = 3.0, kv = 4.0 ={'>'} image blur
+

+
+ + + +
+ ); + } +} + +export default connect((store) => store)(UiModalBilateral); diff --git a/src/ui/Modals/UiModalDicomSeries.js b/src/ui/Modals/UiModalDicomSeries.js new file mode 100644 index 00000000..c9997d86 --- /dev/null +++ b/src/ui/Modals/UiModalDicomSeries.js @@ -0,0 +1,99 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { connect } from 'react-redux'; +import { Modal, ModalBody, ModalHeader } from './ModalBase'; + +class UiModalDicomSeries extends React.Component { + constructor(props) { + super(props); + this.m_onHide = null; + this.m_onSelect = null; + this.m_strStyle = ''; + + this.onClickRow = this.onClickRow.bind(this); + } + + onClickRow(evt, row, rowIndex) { + // console.log(`clicked row = ${rowIndex}`); + this.m_onHide(); + this.m_onSelect(rowIndex); + } + + // special code to fix bootstrap table + // clippimng problem + // componentDidUpdate() { + // // document.querySelector('.react-bs-table-container').style.height = "auto"; + // this.m_strStyle = 'auto'; + // } + + componentDidUpdate() { + // document.querySelector('.react-bs-table-container').style.height = "100%"; + this.m_strStyle = '100%'; + } + + render() { + const isVisible = this.props.stateVis; + const store = this.props; + const arrSeries = store.dicomSeries; + this.m_onHide = this.props.onHide; + this.m_onSelect = this.props.onSelect; + // + // const strColumns = [ + // { + // dataField: 'm_patientName', + // text: 'Patient name', + // }, + // { + // dataField: 'm_studyDescr', + // text: 'Study description', + // }, + // { + // dataField: 'm_studyDate', + // text: 'Study date', + // }, + // { + // dataField: 'm_seriesTime', + // text: 'Series time', + // }, + // { + // dataField: 'm_seriesDescr', + // text: 'Series descriotpon', + // }, + // { + // dataField: 'm_bodyPartExamined', + // text: 'Body part examined', + // }, + // { + // dataField: 'm_numSlices', + // text: 'Number of slices', + // }, + // { + // dataField: 'm_hash', + // text: 'Hash code', + // }, + // ]; + + return ( + + + + {/* todo: output columns*/} +
    + {arrSeries.map((row) => ( +
  • + {row.map((cell) => ( + {cell} + ))} +
  • + ))} +
+
+
+ ); + } // end render +} // end class +export default connect((store) => store)(UiModalDicomSeries); diff --git a/src/demo/ui/UiModalGoogle.js b/src/ui/Modals/UiModalGoogle.js similarity index 60% rename from src/demo/ui/UiModalGoogle.js rename to src/ui/Modals/UiModalGoogle.js index 17c900c3..2ef2841c 100644 --- a/src/demo/ui/UiModalGoogle.js +++ b/src/ui/Modals/UiModalGoogle.js @@ -1,30 +1,22 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + /** * @fileOverview UiModalGoogle * @author Epam * @version 1.0.0 */ - // ******************************************************** // Imports // ******************************************************** import React from 'react'; import { connect } from 'react-redux'; +import { Modal, ModalHeader } from './ModalBase'; -import { Modal, ListGroup, OverlayTrigger, Tooltip } from 'react-bootstrap'; - -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiModalGoogle some text later... - */ class UiModalGoogle extends React.Component { /** * @param {object} props - props from up level object @@ -37,7 +29,7 @@ class UiModalGoogle extends React.Component { this.onDemo = this.onDemo.bind(this); this.state = { - showModalDemo: false + showModalDemo: false, }; } @@ -81,7 +73,7 @@ class UiModalGoogle extends React.Component { this.m_onHideFunc(); const strTextMenu = evt.target.innerHTML; const ind = UiModalGoogle.getIndex(this.m_arrMenu, strTextMenu); - if ((ind >= 0) && (this.m_funcDemo !== undefined)) { + if (ind >= 0 && this.m_funcDemo !== undefined) { // perform action on cliked demo index //console.log(`onClick: element = ${ind}`); this.m_funcDemo(ind); @@ -93,45 +85,34 @@ class UiModalGoogle extends React.Component { this.m_arrMenu = arrMenu; const stateVis = this.props.stateVis; this.m_onHideFunc = this.props.onHide; - this.m_funcDemo = this.props.onSelectDemo; - - const jsxModalDemo = - - - - Load from Google cloud - - - - - - - {arrMenu.map( (d, i) => { - const strId = `id_${i}`; - const strTooltip = d.tooltip; - return + + + {arrMenu.map((d, i) => { + const strId = `id_${i}`; + const strTooltip = d.tooltip; + return ( + - {strTooltip} - - } + overlay={{strTooltip}} > - +

{d.text} - +

- })} - -
- -
-
; + ); + })} + + + ); return jsxModalDemo; } // end render } // end class -export default connect(store => store)(UiModalGoogle); +export default connect((store) => store)(UiModalGoogle); diff --git a/src/ui/Modals/UiModalSaveNifti.jsx b/src/ui/Modals/UiModalSaveNifti.jsx new file mode 100644 index 00000000..6c0dd00c --- /dev/null +++ b/src/ui/Modals/UiModalSaveNifti.jsx @@ -0,0 +1,90 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useState } from 'react'; +import { useSelector } from 'react-redux'; + +import SaverNifti from '../../engine/savers/SaverNifti'; +import { Modal, ModalBody, ModalHeader } from './ModalBase'; +import { UIButton } from '../Button/Button'; + +export function UiModalSaveNifti(props) { + const { stateVis, onHide } = props; + const [fileName, setFileName] = useState('dump'); + const { volumeSet, volumeIndex, volumeRenderer } = useSelector((state) => state); + + const onSaveNifti = () => { + const vol = volumeSet.getVolume(volumeIndex); + + const xDim = vol.m_xDim; + const yDim = vol.m_yDim; + const zDim = vol.m_zDim; + const xBox = vol.m_boxSize.x; + const yBox = vol.m_boxSize.y; + const zBox = vol.m_boxSize.z; + const volSize = { + x: xDim, + y: yDim, + z: zDim, + pixdim1: xBox / xDim, + pixdim2: yBox / yDim, + pixdim3: zBox / zDim, + }; + let volData = vol.m_dataArray; + const vR = volumeRenderer; + if (vR !== null) { + volData = vR.volumeUpdater.bufferR; + } + const niiArr = SaverNifti.writeBuffer(volData, volSize); + const textToSaveAsBlob = new Blob([niiArr], { type: 'application/octet-stream' }); + const textToSaveAsURL = window.URL.createObjectURL(textToSaveAsBlob); + const goodSuffix = fileName.trim().endsWith('.nii'); + if (!goodSuffix) { + setFileName((prev) => `${prev.trim()}.nii`); + } + // console.log(`Save to file ${fileName}`); + + const downloadLink = document.createElement('a'); + downloadLink.download = fileName; + downloadLink.innerHTML = 'Download File'; + downloadLink.href = textToSaveAsURL; + downloadLink.onclick = (event) => document.body.removeChild(event.target); + downloadLink.style.display = 'none'; + document.body.appendChild(downloadLink); + + downloadLink.click(); + }; // end on save nifti + + const onTexChange = (evt) => { + const strText = evt.target.value; + setFileName(strText); + }; + + const handleFormSubmit = () => { + evt.preventDefault(); + onSaveNifti(); + }; + + return ( + + + + { + handleFormSubmit(evt); + }} + /> + .nii + + + + + ); +} diff --git a/src/demo/ui/UiModalText.js b/src/ui/Modals/UiModalText.jsx similarity index 50% rename from src/demo/ui/UiModalText.js rename to src/ui/Modals/UiModalText.jsx index 2b526c1b..a8f2da0b 100644 --- a/src/demo/ui/UiModalText.js +++ b/src/ui/Modals/UiModalText.jsx @@ -1,26 +1,15 @@ -/** - * @fileOverview UiModalText - * @author Epam - * @version 1.0.0 +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 */ -// ******************************************************** -// Imports -// ******************************************************** - import React from 'react'; import { connect } from 'react-redux'; - -import { Modal, Button, Form, Row, Col } from 'react-bootstrap'; - -// ******************************************************** -// Class -// ******************************************************** +import { Modal, ModalBody, ModalFooter, ModalHeader } from './ModalBase'; +import { UIButton } from '../Button/Button'; +import css from './Modals.module.css'; class UiModalText extends React.Component { - /** - * @param {object} props - props from up level object - */ constructor(props) { super(props); this.onButtonOk = this.onButtonOk.bind(this); @@ -32,7 +21,7 @@ class UiModalText extends React.Component { this.m_hideFunc = null; this.state = { - text: '' + text: '', }; } // end constr @@ -73,43 +62,28 @@ class UiModalText extends React.Component { this.m_showFunc = onShowFunc; // console.log(`UiModalText. setup funcs: ${this.m_showFunc}, ${this.m_hideFunc}`); - const jsxModalText = - - - - - - Input text - - -
this.handleFormSubmit(evt)} > - - - - - - - - - - - - - - - - -
- -
- return jsxModalText; - } // end render - -} // end class + return ( + + + + + + + + + + + ); + } +} -export default connect(store => store)(UiModalText); +export default connect((store) => store)(UiModalText); diff --git a/src/demo/ui/UiModalWinCW.js b/src/ui/Modals/UiModalWinCW.jsx similarity index 62% rename from src/demo/ui/UiModalWinCW.js rename to src/ui/Modals/UiModalWinCW.jsx index 0a7f6e58..45354874 100644 --- a/src/demo/ui/UiModalWinCW.js +++ b/src/ui/Modals/UiModalWinCW.jsx @@ -1,41 +1,27 @@ -/** - * @fileOverview UiModalWinCW - * @author Epam - * @version 1.0.0 +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 */ - -// ******************************************************** -// Imports -// ******************************************************** - -// special css for NoUiSlioder -import 'nouislider/distribute/nouislider.css'; - import React from 'react'; import { connect } from 'react-redux'; -import { Modal, Container, Row, Col, Button, ListGroup } from 'react-bootstrap'; +import { Nouislider } from '../Nouislider/Nouislider'; +import { Modal, ModalBody, ModalFooter, ModalHeader } from './ModalBase'; +import { UIButton } from '../Button/Button'; +import buttonCss from '../Button/Button.module.css'; -import Nouislider from 'react-nouislider'; - -// ******************************************************** -// Const -// ******************************************************** - -const LARGE_NUMBER = 0x3FFFFFFF; +const LARGE_NUMBER = 0x3fffffff; const DEFAULT_WIN_MIN = 650 - 2000 / 2; const DEFAULT_WIN_MAX = 650 + 2000 / 2; -// ******************************************************** -// Class -// ******************************************************** - class UiModalWindowCenterWidth extends React.Component { constructor(props) { super(props); - this.m_objCanvas = null; + this.m_objCanvas = React.createRef(); + this.m_updateEnable = true; + this.m_dataMin = LARGE_NUMBER; this.m_dataMax = LARGE_NUMBER; @@ -45,7 +31,7 @@ class UiModalWindowCenterWidth extends React.Component { this.state = { showModalWindowCenterWidth: false, windowMin: DEFAULT_WIN_MIN, - windowMax: DEFAULT_WIN_MAX, + windowMax: DEFAULT_WIN_MAX, }; } // end constructor @@ -54,7 +40,7 @@ class UiModalWindowCenterWidth extends React.Component { } reset() { - // restore data params to initial for next lloading + // restore data params to initial for the next loading this.m_dataMin = LARGE_NUMBER; this.m_dataMax = LARGE_NUMBER; this.setState({ windowMin: DEFAULT_WIN_MIN }); @@ -65,9 +51,7 @@ class UiModalWindowCenterWidth extends React.Component { onButtonCancel() { // console.log('TODO: on Cancel ...'); this.reset(); - - const onHideFunc = this.props.onHide; - onHideFunc(false); + this.props.onHide && this.props.onHide(false); } // @@ -82,7 +66,7 @@ class UiModalWindowCenterWidth extends React.Component { // set loader features according current modal properties (window min, max) loaderDicom.m_windowCenter = (this.state.windowMin + this.state.windowMax) * 0.5; - loaderDicom.m_windowWidth = (this.state.windowMax - this.state.windowMin); + loaderDicom.m_windowWidth = this.state.windowMax - this.state.windowMin; // apply for single slice dicom read // select 1st slice and hash @@ -92,28 +76,23 @@ class UiModalWindowCenterWidth extends React.Component { const hashCode = series[i].m_hash; loaderDicom.createVolumeFromSlices(volSet, i, hashCode); } - - // hide this modal - const onHideFunc = this.props.onHide; - onHideFunc(true); + this.props.onHide && this.props.onHide(true); } // componentDidMount() { - // use onRef to provide access to this for the parent component - // ini react hierarchy - this.props.onRef(this); + this.initWindowRange(); this.renderPreview(); } - componentWillUnmount() { - this.props.onRef(undefined); - } - componentDidUpdate() { this.renderPreview(); } + shouldComponentUpdate() { + return this.m_updateEnable; + } + drawSlice(ctx, wScreen, hScreen, imgData, dataDst, series, loaderDicom) { const serie = series[0]; const slices = serie.m_slices; @@ -124,21 +103,19 @@ class UiModalWindowCenterWidth extends React.Component { let maxSliceNum = slices[0].m_sliceNumber; for (let s = 0; s < numSlices; s++) { const num = slices[s].m_sliceNumber; - minSliceNum = (num < minSliceNum) ? num : minSliceNum; - maxSliceNum = (num > maxSliceNum) ? num : maxSliceNum; + minSliceNum = num < minSliceNum ? num : minSliceNum; + maxSliceNum = num > maxSliceNum ? num : maxSliceNum; } const difSlceNum = maxSliceNum - minSliceNum; if (difSlceNum > 0) { // sort slices by slice number (read from dicom tag) slices.sort((a, b) => { - const zDif = a.m_sliceNumber - b.m_sliceNumber; - return zDif; + return a.m_sliceNumber - b.m_sliceNumber; }); } else { // sort slices by slice location (read from diocom tag) slices.sort((a, b) => { - const zDif = a.m_sliceLocation - b.m_sliceLocation; - return zDif; + return a.m_sliceLocation - b.m_sliceLocation; }); } // assign new slice numbers according accending location @@ -163,15 +140,14 @@ class UiModalWindowCenterWidth extends React.Component { let valSrc = sliceData16[i]; // check big endian if (!loaderDicom.m_littleEndian) { - const valBytesSwap = (valSrc >> 8) | ((valSrc << 8) & 0xffff); - valSrc = valBytesSwap; + valSrc = (valSrc >> 8) | ((valSrc << 8) & 0xffff); } // check pad value - valSrc = (valSrc === loaderDicom.m_padValue) ? 0 : valSrc; - + valSrc = valSrc === loaderDicom.m_padValue ? 0 : valSrc; + const valData = valSrc * loaderDicom.m_rescaleSlope + loaderDicom.m_rescaleIntercept; - minVal = (valData < minVal) ? valData : minVal; - maxVal = (valData > maxVal) ? valData : maxVal; + minVal = valData < minVal ? valData : minVal; + maxVal = valData > maxVal ? valData : maxVal; } // for (i) all slice pixels // console.log(`Modal dcm. min/max val = ${minVal} / ${maxVal}`); // this.m_dataMin = minVal; @@ -199,23 +175,22 @@ class UiModalWindowCenterWidth extends React.Component { let valSrc = sliceData16[i]; // check big endian if (!loaderDicom.m_littleEndian) { - const valBytesSwap = (valSrc >> 8) | ((valSrc << 8) & 0xffff); - valSrc = valBytesSwap; + valSrc = (valSrc >> 8) | ((valSrc << 8) & 0xffff); } // check pad value - valSrc = (valSrc === loaderDicom.m_padValue) ? 0 : valSrc; + valSrc = valSrc === loaderDicom.m_padValue ? 0 : valSrc; const valScaled = valSrc * loaderDicom.m_rescaleSlope + loaderDicom.m_rescaleIntercept; let val = 0; if (loaderDicom.m_rescaleHounsfield) { // rescale for hounsfield units - val = Math.floor((valScaled - winMin) * 255 / ww); + val = Math.floor(((valScaled - winMin) * 255) / ww); } else { // usual (default) rescale - val = Math.floor(127 + (valScaled - wc) * 128 / (ww / 2)); + val = Math.floor(127 + ((valScaled - wc) * 128) / (ww / 2)); } - val = (val >= 0) ? val : 0; - val = (val < 255) ? val : 255; + val = val >= 0 ? val : 0; + val = val < 255 ? val : 255; dataArray[zOff + i] = val; } // for i @@ -223,7 +198,7 @@ class UiModalWindowCenterWidth extends React.Component { let j = 0; const xStep = xDim / wScreen; const yStep = yDim / hScreen; - let ay = 0.0; + let ay = 0.0; for (let y = 0; y < hScreen; y++, ay += yStep) { const ySrc = Math.floor(ay); const yOff = ySrc * xDim; @@ -231,7 +206,7 @@ class UiModalWindowCenterWidth extends React.Component { for (let x = 0; x < wScreen; x++, ax += xStep) { const xSrc = Math.floor(ax); const val = dataArray[zOff + yOff + xSrc]; - dataDst[j + 0] = val; + dataDst[j] = val; dataDst[j + 1] = val; dataDst[j + 2] = val; dataDst[j + 3] = 255; // opacity @@ -245,7 +220,7 @@ class UiModalWindowCenterWidth extends React.Component { // render preview window with slice and selected window properties // renderPreview() { - const objCanvas = this.m_objCanvas; + const objCanvas = this.m_objCanvas.current; if (objCanvas === null) { return; } @@ -266,15 +241,12 @@ class UiModalWindowCenterWidth extends React.Component { let j = 0; const TEST_RAINBOW = false; if (TEST_RAINBOW) { - console.log("special rainbow test instead of slice render"); + console.log('special rainbow test instead of slice render'); for (let y = 0; y < hScreen; y++) { for (let x = 0; x < wScreen; x++) { - let b = Math.floor(255.0 * x / wScreen); - let g = Math.floor(255.0 * y / hScreen); - let r = 50; - dataDst[j + 0] = r; - dataDst[j + 1] = g; - dataDst[j + 2] = b; + dataDst[j] = 50; + dataDst[j + 1] = Math.floor((255.0 * y) / hScreen); + dataDst[j + 2] = Math.floor((255.0 * x) / wScreen); dataDst[j + 3] = 255; j += 4; } @@ -294,17 +266,11 @@ class UiModalWindowCenterWidth extends React.Component { this.drawSlice(ctx, wScreen, hScreen, imgData, dataDst, series, loaderDicom); } // end render preview - // - // callbakc on user change window range (min, max) - // - onSliderWindowRange() - { - const arrVals = this.refs.sliderRange.slider.get(); - const vMin = parseInt(arrVals[0]); - const vMax = parseInt(arrVals[1]); - this.setState({ windowMin: vMin }); - this.setState({ windowMax: vMax }); - // console.log(`slider min/max = ${vMin} / ${vMax}`); + onSliderWindowRange(value) { + this.m_updateEnable = false; + const [min, max] = value; + this.setState({ windowMin: min }); + this.setState({ windowMax: max }); } getDataMinMax(store, loaderDicom) { @@ -326,15 +292,14 @@ class UiModalWindowCenterWidth extends React.Component { let valSrc = sliceData16[i]; // check big endian if (!loaderDicom.m_littleEndian) { - const valBytesSwap = (valSrc >> 8) | ((valSrc << 8) & 0xffff); - valSrc = valBytesSwap; + valSrc = (valSrc >> 8) | ((valSrc << 8) & 0xffff); } // check pad value - valSrc = (valSrc === loaderDicom.m_padValue) ? 0 : valSrc; - + valSrc = valSrc === loaderDicom.m_padValue ? 0 : valSrc; + const valData = valSrc * loaderDicom.m_rescaleSlope + loaderDicom.m_rescaleIntercept; - minVal = (valData < minVal) ? valData : minVal; - maxVal = (valData > maxVal) ? valData : maxVal; + minVal = valData < minVal ? valData : minVal; + maxVal = valData > maxVal ? valData : maxVal; } // for (i) all slice pixels // console.log(`Modal dcm. min/max val = ${minVal} / ${maxVal}`); this.m_dataMin = minVal; @@ -352,9 +317,9 @@ class UiModalWindowCenterWidth extends React.Component { const loaderDicom = store.loaderDicom; if (loaderDicom !== null) { let isValid = true; - isValid = (loaderDicom.m_windowCenter === LARGE_NUMBER) ? false : isValid; - isValid = (loaderDicom.m_windowWidth === LARGE_NUMBER) ? false : isValid; - isValid = (loaderDicom.m_windowWidth <= 0) ? false : isValid; + isValid = loaderDicom.m_windowCenter === LARGE_NUMBER ? false : isValid; + isValid = loaderDicom.m_windowWidth === LARGE_NUMBER ? false : isValid; + isValid = loaderDicom.m_windowWidth <= 0 ? false : isValid; if (isValid) { // console.log('initWindowRange: use predefined in tags window center, width'); @@ -367,22 +332,16 @@ class UiModalWindowCenterWidth extends React.Component { } // if loader dicom ready } // end init - // render + // render render() { - //const stateVis = true; const stateVis = this.props.stateVis; - const onHideFunc = this.props.onHide; const stylePreview = { width: '500px', height: '400px', }; - const jsxCanvas = {this.m_objCanvas = mount} } style={stylePreview} width="500px" height="400px" />; - - const valToolTps = true; - let valMin = 0; let valMax = 5000; let valDelta = valMax - valMin; @@ -395,61 +354,29 @@ class UiModalWindowCenterWidth extends React.Component { } const rangeTwo = { - 'min': Math.floor(valMin - valDelta / 4), - 'max': Math.floor(valMax + valDelta / 4) - } + min: Math.floor(valMin - valDelta / 4), + max: Math.floor(valMax + valDelta / 4), + }; const wMin = Math.floor(this.state.windowMin); const wMax = Math.floor(this.state.windowMax); const wArr = [wMin, wMax]; - const jxsModal = - - - - Select window center and width to display Dicom - - - - - - {this.m_objCol = mount} } > -

- {jsxCanvas} -

- -
- - - - Window range

-
- - - -
- - - - - - - - - - -
- -
+ return ( + + + + Window range + +

+ +

+
+ + +
- return jxsModal; + ); } // end render } // end class UiWindowCenterWidth -export default connect(store => store)(UiModalWindowCenterWidth); +export default connect((store) => store)(UiModalWindowCenterWidth); diff --git a/src/ui/Modals/demoData.js b/src/ui/Modals/demoData.js new file mode 100644 index 00000000..b392cd4a --- /dev/null +++ b/src/ui/Modals/demoData.js @@ -0,0 +1,55 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +export const demoData = [ + { + id: 0, + tooltip: 'Lungs 20101108 from ktx', + image: 'images/thumb_lungs.png', + alt: 'lungs', + }, + { + id: 1, + tooltip: 'Brain set from ktx', + image: 'images/thumb_brain.png', + alt: 'lungs', + }, + { + id: 2, + tooltip: 'Grandmother (gm3) from nifti', + image: 'images/thumb_gm3_512_512_165.png', + alt: 'gm3', + }, + { + id: 3, + tooltip: 'Woman pelvis from dicom', + image: 'images/thumb_woman_pelvis.png', + alt: 'woman_pelvis', + }, + { + id: 4, + tooltip: 'Lungs 00cba...957e from dicom', + image: 'images/thumb_ocb.png', + alt: 'lungs_ocb', + }, + { + id: 5, + tooltip: 'CT 256^3 from ktx', + image: 'images/thumb_ct_256.png', + alt: 'ct_256', + }, + { + id: 6, + tooltip: 'Lungs 256^3 from ktx', + image: 'images/thumb_lungs_256.png', + alt: 'lungs_256', + }, + { + id: 7, + tooltip: 'Brain with ROI (colored) from Hdr+Img', + image: 'images/thumb_set.png', + alt: 'hdr_set_roi', + }, +]; diff --git a/src/ui/Nouislider/Nouislider.jsx b/src/ui/Nouislider/Nouislider.jsx new file mode 100644 index 00000000..28f7642d --- /dev/null +++ b/src/ui/Nouislider/Nouislider.jsx @@ -0,0 +1,65 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React from 'react'; +import { Slider } from '@mui/material'; +import styled from '@emotion/styled'; + +const ColorizedSlider = styled(Slider)(() => ({ + color: '#3880ff', + height: 2, + padding: '15px 0', + '& .MuiSlider-thumb': { + height: 30, + width: 10, + borderRadius: 5, + backgroundColor: '#fff', + '&:focus, &:hover, &.Mui-active': { + boxShadow: '0 3px 1px rgba(0,0,0,0.1),0 4px 8px rgba(0,0,0,0.3),0 0 0 1px rgba(0,0,0,0.02)', + }, + }, + '& .MuiSlider-valueLabel': { + fontSize: 12, + fontWeight: 'normal', + top: -6, + backgroundColor: 'unset', + '&:before': { + display: 'none', + }, + '& *': { + background: 'transparent', + }, + }, + '& .MuiSlider-track': { + height: 10, + border: 'none', + background: 'var(--red)', + }, + '& .MuiSlider-rail': { + height: 10, + opacity: 0.5, + backgroundColor: '#bfbfbf', + }, +})); + +// eslint-disable-next-line react/display-name +export const Nouislider = (props) => { + const { range, step, onChange, getAriaValueText, value } = props; + const onSliderChange = (event, value) => { + if (!event || !onChange) return; + onChange(value); + }; + + return ( + + ); +}; diff --git a/src/demo/ui/UiOpenMenu.js b/src/ui/OpenFile/UiOpenMenu.jsx similarity index 63% rename from src/demo/ui/UiOpenMenu.js rename to src/ui/OpenFile/UiOpenMenu.jsx index 5129184e..fc554f12 100644 --- a/src/demo/ui/UiOpenMenu.js +++ b/src/ui/OpenFile/UiOpenMenu.jsx @@ -1,49 +1,24 @@ -/** - * @fileOverview UiOpenMenu - * @author Epam - * @version 1.0.0 +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 */ - -// ******************************************************** -// Imports -// ******************************************************** - - -import React from 'react'; -import { connect } from 'react-redux'; -import { NavDropdown, Button, Modal, InputGroup, FormControl, } from 'react-bootstrap'; // import { gzip, ungzip } from 'node-gzip'; -import zlib from 'zlib'; -import createReadStream from 'filereader-stream'; - -import VolumeSet from '../engine/VolumeSet'; -import Volume from '../engine/Volume'; -import Texture3D from '../engine/Texture3D'; - -import UiModalDemo from './UiModalDemo'; -import UiModalGoogle from './UiModalGoogle'; -import UiModalWindowCenterWidth from './UiModalWinCW'; // import UiModalDicomSeries from './UiModalDicomSeries'; -import StoreActionType from '../store/ActionTypes'; -import ModeView from '../store/ModeView'; -import Modes3d from '../store/Modes3d'; - -// import { timingSafeEqual } from 'crypto'; -import LoadResult from '../engine/LoadResult'; -import FileTools from '../engine/loaders/FileTools'; -import LoaderDicom from '../engine/loaders/LoaderDicom'; -import LoaderHdr from '../engine/loaders/LoaderHdr'; - -import LoaderUrlDicom from '../engine/loaders/LoaderUrlDicom'; -import LoaderDcmDaikon from '../engine/loaders/LoaderDcmDaikon'; -import LoaderDcmUrlDaikon from '../engine//loaders/LoadDcmUrlDiakon'; -import config from '../config/config'; - -// ******************************************************** -// Const -// ******************************************************** +import React from 'react'; +import { connect } from 'react-redux'; +import UiModalDemo from '../Modals/ModalDemo'; +import UIModalUrl from '../Modals/ModalUrl'; +import UiModalWindowCenterWidth from '../Modals/UiModalWinCW'; +import { UIButton } from '../Button/Button'; +import css from './UiOpenMenu.module.css'; +import { UiSaveMenu } from './UiSaveMenu'; +import { UiReportMenu } from './UiReportMenu'; +import { Tooltip } from '../Tooltip/Tooltip'; +import { Container } from '../Layout/Container'; +import FileReader from '../../engine/loaders/FileReader'; +import StoreActionType from '../../store/ActionTypes'; /** Need to have demo menu */ const NEED_DEMO_MENU = true; @@ -54,21 +29,10 @@ const NEED_TEXTURE_SIZE_4X = true; // use daikon parser for Dicom (*dcm) file loading const READ_DICOM_VIA_DAIKON = true; -// ******************************************************** -// Class -// ******************************************************** - - -/** - * Class UiOpenMenu some text later... - */ -class UiOpenMenu extends React.Component { - /** - * @param {object} props - props from up level object - */ +class UiOpenMenu extends FileReader { constructor(props) { super(props); - this.onButtonLocalFile = this.onButtonLocalFile.bind(this); + this.onButtonOpenLocalFileClick = this.onButtonOpenLocalFileClick.bind(this); this.handleFileSelected = this.handleFileSelected.bind(this); this.onFileContentReadSingleFile = this.onFileContentReadSingleFile.bind(this); this.onFileContentReadMultipleDicom = this.onFileContentReadMultipleDicom.bind(this); @@ -84,7 +48,7 @@ class UiOpenMenu extends React.Component { this.onModalDemoOpenHide = this.onModalDemoOpenHide.bind(this); this.onDemoSelected = this.onDemoSelected.bind(this); - this.onModalWindowCWHide = this.onModalWindowCWHide.bind(this); + this.onModalWindowCWHide = this.onModalWindowCWHide.bind(this); this.onModalGoogleShow = this.onModalGoogleShow.bind(this); this.onModalGoogleHide = this.onModalGoogleHide.bind(this); @@ -103,8 +67,8 @@ class UiOpenMenu extends React.Component { this.m_fileName = ''; this.m_fileIndex = 0; this.m_fileReader = null; + this.m_fileSize = null; this.state = { - strUrl: '', showModalUrl: false, showModalDemo: false, showModalGoogle: false, @@ -120,12 +84,12 @@ class UiOpenMenu extends React.Component { finalizeSuccessLoadedVolume(volSet, fileNameIn) { const store = this.props; - console.assert(volSet instanceof VolumeSet, "finalizeSuccessLoadedVolume: should be VolumeSet"); - console.assert(volSet.getNumVolumes() >= 1, "finalizeSuccessLoadedVolume: should be more or 1 volume"); + console.assert(volSet instanceof VolumeSet, 'finalizeSuccessLoadedVolume: should be VolumeSet'); + console.assert(volSet.getNumVolumes() >= 1, 'finalizeSuccessLoadedVolume: should be more or 1 volume'); const indexVol = 0; const vol = volSet.getVolume(indexVol); - console.assert(vol !== null, "finalizeSuccessLoadedVolume: should be non zero volume"); + console.assert(vol !== null, 'finalizeSuccessLoadedVolume: should be non zero volume'); if (vol.m_dataArray !== null) { console.log(`success loaded volume from ${fileNameIn}`); @@ -133,10 +97,10 @@ class UiOpenMenu extends React.Component { vol.makeDimensions4x(); } // invoke notification - + // send update (repaint) if was loaded prev model if (store.isLoaded) { - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); + store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); } store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: volSet }); @@ -144,11 +108,9 @@ class UiOpenMenu extends React.Component { store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); store.dispatch({ type: StoreActionType.SET_FILENAME, fileName: fileNameIn }); store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: [] }); - const tex3d = new Texture3D(); - tex3d.createFromRawVolume(vol); - store.dispatch({ type: StoreActionType.SET_TEXTURE3D, texture3d: tex3d }); - store.dispatch({ type: StoreActionType.SET_MODE_VIEW, modeView: ModeView.VIEW_2D }); + store.dispatch({ type: StoreActionType.SET_MODE_VIEW, viewMode: ViewMode.VIEW_2D }); store.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); + store.dispatch({ type: StoreActionType.SET_SPINNER, spinner: false }); } } @@ -169,26 +131,42 @@ class UiOpenMenu extends React.Component { store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volume: null }); store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: arrErrors }); store.dispatch({ type: StoreActionType.SET_FILENAME, fileName: fileNameIn }); - - const uiapp = store.uiApp; - uiapp.doHideProgressBar(); + store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); } callbackReadProgress(ratio01) { // console.log(`callbackReadProgress = ${ratio01}`); const ratioPrc = Math.floor(ratio01 * 100); const store = this.props; - const uiapp = store.uiApp; - if (uiapp !== null) { - if (ratioPrc === 0) { - uiapp.doShowProgressBar('Loading...'); - } - if (ratioPrc >= 99) { - // console.log(`callbackReadProgress. hide on = ${ratio01}`); - uiapp.doHideProgressBar(); - } else { - uiapp.doSetProgressBarRatio(ratioPrc); - } + console.log('ratioPrc ===================> ' + ratioPrc); + console.log('ratio01 ===================> ' + ratio01); + store.dispatch({ + type: StoreActionType.SET_PROGRESS, + progress: ratioPrc, + }); + store.dispatch({ + type: StoreActionType.SET_PROGRESS_INFO, + titleProgressBar: 'Loading file...', + }); + if (ratioPrc >= 99) { + // console.log(`callbackReadProgress. hide on = ${ratio01}`); + store.dispatch({ + type: StoreActionType.SET_PROGRESS, + progress: 0, + }); + store.dispatch({ + type: StoreActionType.SET_PROGRESS_INFO, + titleProgressBar: 'Loading file...', + }); + } else { + store.dispatch({ + type: StoreActionType.SET_PROGRESS, + progress: ratioPrc, + }); + store.dispatch({ + type: StoreActionType.SET_PROGRESS_INFO, + titleProgressBar: 'Loading file...', + }); } } // callback progress @@ -202,10 +180,14 @@ class UiOpenMenu extends React.Component { } } const store = this.props; - const uiapp = store.uiApp; - // console.log(`callbackReadComplete wiyth err = ${loadErrorCode}`); - uiapp.doHideProgressBar(); - + store.dispatch({ + type: StoreActionType.SET_PROGRESS, + progress: 0, + }); + store.dispatch({ + type: StoreActionType.SET_PROGRESS_INFO, + titleProgressBar: 'The file has been uploaded', + }); if (errCode === LoadResult.SUCCESS) { // console.log('callbackReadComplete finished OK'); this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); @@ -220,17 +202,12 @@ class UiOpenMenu extends React.Component { callbackReadSingleDicomComplete(errCode) { if (errCode === LoadResult.SUCCESS) { - // console.log('TODO: UI select window center /width ...'); - const store = this.props; store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: this.m_volumeSet }); store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: 0 }); // save dicom loader to store store.dispatch({ type: StoreActionType.SET_LOADER_DICOM, loaderDicom: this.m_loader }); - // setup modal: window min, max - this.childModalWindowCenterWidth.initWindowRange(); - // show modal: select window center, width this.setState({ showModalWindowCW: true }); return; // do nothing immediately after: wait for dialog @@ -245,33 +222,10 @@ class UiOpenMenu extends React.Component { } } - onFileReadSingleUncompressedFile(strContent, callbackProgress, callbackComplete, callbackCompleteSingleDicom) { - if (this.m_fileName.endsWith('.ktx') || this.m_fileName.endsWith('.KTX')) { - // if read ktx - this.m_volumeSet.readFromKtx(strContent, callbackProgress, callbackComplete); - } else if (this.m_fileName.endsWith('.nii') || this.m_fileName.endsWith('.NII')) { - this.m_volumeSet.readFromNifti(strContent, callbackProgress, callbackComplete); - } else if (this.m_fileName.endsWith('.dcm') || this.m_fileName.endsWith('.DCM')) { - this.m_loader = new LoaderDicom(); - this.m_loader.m_zDim = 1; - this.m_loader.m_numFiles = 1; - this.m_volumeSet.readFromDicom(this.m_loader, strContent, callbackProgress, callbackCompleteSingleDicom); - } else if (this.m_fileName.endsWith('.hdr') || this.m_fileName.endsWith('.HDR')) { - // readOk = vol.readFromHdrHeader(strContent, callbackProgress, callbackComplete); - console.log(`cant read single hdr file: ${this.m_fileName}`); - // readStatus = LoadResult.BAD_HEADER; - } else if (this.m_fileName.endsWith('.img') || this.m_fileName.endsWith('.IMG')) { - // readOk = vol.readFromHdrImage(strContent, callbackProgress, callbackComplete); - console.log(`cant read single img file: ${this.m_fileName}`); - // readStatus = LoadResult.BAD_HEADER; - } else { - console.log(`onFileContentReadSingleFile: unknown file type: ${this.m_fileName}`); - } - } - onFileContentReadSingleFile() { let strContent = this.m_fileReader.result; this.onFileReadSingleBuffer(strContent); + console.log(this.onFileReadSingleBuffer(strContent)); } // @@ -279,8 +233,7 @@ class UiOpenMenu extends React.Component { // strContent is ArrayBuffer readSliceDicomViaDaikon(fileIndex, fileName, ratioLoad, strContent) { const loaderDaikon = new LoaderDcmDaikon(); - const ret = loaderDaikon.readSlice(this.m_loader, fileIndex, fileName, strContent); - return ret; + return loaderDaikon.readSlice(this.m_loader, fileIndex, fileName, strContent); } // end read single slice via daikon // @@ -290,7 +243,7 @@ class UiOpenMenu extends React.Component { onFileReadSingleBuffer(strContent) { // daikon read // strContent is ArrayBuffer - if ( (this.m_fileName.endsWith('.dcm') || this.m_fileName.endsWith('.DCM')) && READ_DICOM_VIA_DAIKON) { + if ((this.m_fileName.endsWith('.dcm') || this.m_fileName.endsWith('.DCM')) && READ_DICOM_VIA_DAIKON) { const loaderDcm = new LoaderDcmDaikon(); const store = this.props; const fileIndex = this.m_fileIndex; @@ -306,14 +259,14 @@ class UiOpenMenu extends React.Component { // console.log(`onFileContentRead. type = ${typeof strContent}`); this.m_volumeSet = new VolumeSet(); // add empty [0]-th volume in set to read single file - this.m_volumeSet.addVolume(new Volume()) + this.m_volumeSet.addVolume(new Volume()); const callbackProgress = this.callbackReadProgress; const callbackComplete = this.callbackReadComplete; const callbackCompleteSingleDicom = this.callbackReadSingleDicomComplete; - if (this.m_fileName.endsWith('.ktx') || this.m_fileName.endsWith('.KTX')) { // if read ktx + // debugger; this.m_volumeSet.readFromKtx(strContent, callbackProgress, callbackComplete); } else if (this.m_fileName.endsWith('.nii') || this.m_fileName.endsWith('.NII')) { this.m_volumeSet.readFromNifti(strContent, callbackProgress, callbackComplete); @@ -340,7 +293,6 @@ class UiOpenMenu extends React.Component { } else { console.log(`onFileContentReadSingleFile: unknown file type: ${this.m_fileName}`); } - } // @@ -349,8 +301,8 @@ class UiOpenMenu extends React.Component { onFileContentReadMultipleHdr() { const VALID_NUM_FILES_2 = 2; const VALID_NUM_FILES_4 = 4; - if ((this.m_numFiles !== VALID_NUM_FILES_2) && (this.m_numFiles !== VALID_NUM_FILES_4)) { - console.log(`onFileContentReadMultipleHdr: can read ${VALID_NUM_FILES_2} or ${VALID_NUM_FILES_4} files for multiple hdr loader`); + if (this.m_numFiles !== VALID_NUM_FILES_2 && this.m_numFiles !== VALID_NUM_FILES_4) { + console.log(`onFileContentReadMultipleHdr: can read ${VALID_NUM_FILES_2} or ${VALID_NUM_FILES_4} files for multiple hdr loader`); return; } @@ -369,7 +321,7 @@ class UiOpenMenu extends React.Component { this.callbackReadProgress(0.0); } - if ((this.m_numFiles === VALID_NUM_FILES_4) && (this.m_volumeRoi === null)) { + if (this.m_numFiles === VALID_NUM_FILES_4 && this.m_volumeRoi === null) { this.m_volumeRoi = new Volume(); } @@ -379,7 +331,7 @@ class UiOpenMenu extends React.Component { const regExpFileName = /([\S]+)\.[\S]+/; const fnameArr = regExpFileName.exec(this.m_fileName); const numFN = fnameArr.length; - let detectedMask = false; + let detectedMask = false; let detectedIntensity = false; if (numFN === 2) { const fname = fnameArr[1]; @@ -408,7 +360,7 @@ class UiOpenMenu extends React.Component { } // read header or image from src files - let readOk = false; + let readOk; if (isHdr) { readOk = this.m_loader.readFromBufferHeader(volDst, strContent, callbackProgress, callbackComplete); } else { @@ -417,7 +369,7 @@ class UiOpenMenu extends React.Component { // create final volume from readed data volDst = this.m_volumeSet.getVolume(0); - if (readOk && (this.m_fileIndex === this.m_numFiles)) { + if (readOk && this.m_fileIndex === this.m_numFiles) { let ok = false; if (this.m_numFiles === VALID_NUM_FILES_2) { ok = this.m_loader.createVolumeFromHeaderAndImage(volDst); @@ -445,7 +397,6 @@ class UiOpenMenu extends React.Component { this.m_fileName = file.name; this.m_fileReader.readAsArrayBuffer(file); } - } // on multuple hdr // on complete read multuple dicom @@ -476,7 +427,7 @@ class UiOpenMenu extends React.Component { this.callbackReadProgress(0.0); } - // FIX 05/06/2020: read multiple dicom callback complete + // FIX 05/06/2020: read multiple dicom callback complete // can be invoked with error code const callbackColmpleteVoid = this.callbackCompleteMultipleDicom; @@ -485,14 +436,21 @@ class UiOpenMenu extends React.Component { if (READ_DICOM_VIA_DAIKON) { readStatus = this.readSliceDicomViaDaikon(this.m_fileIndex - 1, this.m_fileName, ratioLoad, strContent); } else { - readStatus = this.m_volumeSet.readSingleSliceFromDicom(this.m_loader, this.m_fileIndex - 1, - this.m_fileName, ratioLoad, strContent, callbackProgress, callbackColmpleteVoid); + readStatus = this.m_volumeSet.readSingleSliceFromDicom( + this.m_loader, + this.m_fileIndex - 1, + this.m_fileName, + ratioLoad, + strContent, + callbackProgress, + callbackColmpleteVoid + ); } if (readStatus !== LoadResult.SUCCESS) { console.log('onFileContentReadMultipleDicom. Error read individual file'); } - if ( (readStatus === LoadResult.SUCCESS) && (this.m_fileIndex === this.m_numFiles)) { + if (readStatus === LoadResult.SUCCESS && this.m_fileIndex === this.m_numFiles) { // setup global vars const store = this.props; store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: 0 }); @@ -504,40 +462,35 @@ class UiOpenMenu extends React.Component { this.callbackReadProgress(1.0); this.callbackReadComplete(LoadResult.SUCCESS); - this.childModalWindowCenterWidth.initWindowRange(); - // show modal: select window center, width this.setState({ showModalWindowCW: true }); return; // do nothing immediately after: wait for dialog /* - - const numSeries = this.m_loader.m_slicesVolume.m_series.length; - console.log(`num series = ${numSeries}`); - const series = this.m_loader.m_slicesVolume.getSeries(); - // save loaded series description to store - if (numSeries === 1) { - const indexSerie = 0; - const hash = series[indexSerie].m_hash; - this.m_loader.createVolumeFromSlices(this.m_volumeSet, indexSerie, hash); - this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); - console.log(`onFileContentReadMultipleDicom read all ${this.m_numFiles} files`); - } else { - // now we have loaded more then 1 series from dicon files set - for (let i = 0; i < numSeries; i++) { - const hashCode = series[i].m_hash; - this.m_loader.createVolumeFromSlices(this.m_volumeSet, i, hashCode); - } - this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); - console.log(`onFileContentReadMultipleDicom create ${numSeries} volumes for ${this.m_numFiles} files`); - - // setup dicom series (volumes info) for global store: select volume later - const store = this.props; - store.dispatch({ type: StoreActionType.SET_DICOM_SERIES, dicomSeries: series }); - } - - this.callbackReadProgress(1.0); - this.callbackReadComplete(LoadResult.SUCCESS); - */ + const numSeries = this.m_loader.m_slicesVolume.m_series.length; + console.log(`num series = ${numSeries}`); + const series = this.m_loader.m_slicesVolume.getSeries(); + // save loaded series description to store + if (numSeries === 1) { + const indexSerie = 0; + const hash = series[indexSerie].m_hash; + this.m_loader.createVolumeFromSlices(this.m_volumeSet, indexSerie, hash); + this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); + console.log(`onFileContentReadMultipleDicom read all ${this.m_numFiles} files`); + } else { + // now we have loaded more then 1 series from dicon files set + for (let i = 0; i < numSeries; i++) { + const hashCode = series[i].m_hash; + this.m_loader.createVolumeFromSlices(this.m_volumeSet, i, hashCode); + } + this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); + console.log(`onFileContentReadMultipleDicom create ${numSeries} volumes for ${this.m_numFiles} files`); + // setup dicom series (volumes info) for global store: select volume later + const store = this.props; + store.dispatch({ type: StoreActionType.SET_DICOM_SERIES, dicomSeries: series }); + } + this.callbackReadProgress(1.0); + this.callbackReadComplete(LoadResult.SUCCESS); + */ } // end if successfully read all files (multiple dicom read) // read again new file if (readStatus === LoadResult.SUCCESS) { @@ -545,11 +498,11 @@ class UiOpenMenu extends React.Component { // print console loading progress const NUM_PARTS_REPORT = 16; const STEP_PROGRESS = Math.floor(this.m_numFiles / NUM_PARTS_REPORT); - if ((this.m_fileIndex % STEP_PROGRESS) === 0) { + if (this.m_fileIndex % STEP_PROGRESS === 0) { // console.log(`onFileContentReadMultipleDicom. Loading completed = ${ratioLoad}`); this.callbackReadProgress(ratioLoad); } - + this.m_fileReader.onloadend = this.onFileContentReadMultipleDicom; const file = this.m_files[this.m_fileIndex]; this.m_fileName = file.name; @@ -573,10 +526,16 @@ class UiOpenMenu extends React.Component { return; } console.log(`UiOpenMenu. handleFileSelected. file[0] = ${evt.target.files[0].name}`); + // debugger; + console.log('evt = ' + evt.target.files); this.m_volumeSet = new VolumeSet(); if (numFiles === 1) { const file = evt.target.files[0]; this.m_fileName = file.name; + this.m_fileSize = file.size; + console.log('this.m_fileSize ->>>>>>>>>>>>>> ' + this.m_fileSize); + console.log('evt.loaded ->>>>>>>>>>>>>> ' + evt.loaded); + console.log('evt.total ->>>>>>>>>>>>>> ' + evt.total); // read gzip if (this.m_fileName.endsWith('.gz')) { @@ -591,16 +550,14 @@ class UiOpenMenu extends React.Component { const gunzip = zlib.createGunzip(); createReadStream(file).pipe(gunzip); gunzip.on('data', (data) => { - // progress - const uiapp = store.uiApp; if (this.m_unzippedBuffer == null) { - uiapp.doShowProgressBar('Read gzip...'); + store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); } else { const readSize = this.m_unzippedBuffer.length; const allSize = file.size; const KOEF_DEFLATE = 0.28; - const ratio100 = Math.floor(readSize * 100.0 * KOEF_DEFLATE / allSize); - uiapp.doSetProgressBarRatio(ratio100); + const ratio100 = Math.floor((readSize * 100.0 * KOEF_DEFLATE) / allSize); + store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: ratio100 }); } // read the data chunk-by-chunk @@ -624,14 +581,11 @@ class UiOpenMenu extends React.Component { }); gunzip.on('end', () => { - // close progress - const uiapp = store.uiApp; - uiapp.doHideProgressBar(); - + store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); // now all chunks are read. Need to check raw ungzipped buffer const sizeBuffer = this.m_unzippedBuffer.length; if (sizeBuffer < 128) { - console.log('Too small ungzipped data: ' + sizeBuffer.toString() + ' bytes. canat read volume data'); + console.log('Too small ungzipped data: ' + sizeBuffer.toString() + " bytes. can't read volume data"); return; } // check correct nifti header after extract raw bytes from gzip @@ -658,8 +612,12 @@ class UiOpenMenu extends React.Component { }); return; } // if gzipped file - this.m_fileReader = new FileReader(); + const progressHandler = ({ loaded, total }) => { + // debugger; + this.callbackReadProgress(loaded / total); + }; + this.m_fileReader.addEventListener('progress', progressHandler); this.m_fileReader.onloadend = this.onFileContentReadSingleFile; this.m_fileReader.readAsArrayBuffer(file); } else { @@ -670,21 +628,19 @@ class UiOpenMenu extends React.Component { this.m_fileReader = new FileReader(); // if multiple files, create Dicom loader this.m_loader = null; - if (evt.target.files[0].name.endsWith(".dcm")) { - + if (evt.target.files[0].name.endsWith('.dcm')) { // remove non-dcm files let numFilesNew = 0; for (let i = numFiles - 1; i >= 0; i--) { - if (this.m_files[i].name.endsWith(".dcm")) { - numFilesNew ++; + if (this.m_files[i].name.endsWith('.dcm')) { + numFilesNew++; } else { this.m_files.splice(i, 1); } - } numFiles = numFilesNew; this.m_numFiles = numFilesNew; - + this.m_loader = new LoaderDicom(numFiles); const dicomInfo = this.m_loader.m_dicomInfo; @@ -696,11 +652,11 @@ class UiOpenMenu extends React.Component { store.dispatch({ type: StoreActionType.SET_LOADER_DICOM, loaderDicom: this.m_loader }); this.m_fileReader.onloadend = this.onFileContentReadMultipleDicom; - } else if ((evt.target.files[0].name.endsWith(".hdr")) || (evt.target.files[0].name.endsWith(".img"))) { + } else if (evt.target.files[0].name.endsWith('.hdr') || evt.target.files[0].name.endsWith('.img')) { this.m_loader = new LoaderHdr(numFiles); this.m_fileReader.onloadend = this.onFileContentReadMultipleHdr; } - + //const vol = new Volume(); //this.m_volume = vol; this.m_volumeRoi = null; @@ -709,28 +665,29 @@ class UiOpenMenu extends React.Component { this.m_fileName = file.name; this.m_fileReader.readAsArrayBuffer(file); } // if num files > 1 - } // if event is mnot empty + } // if event is not empty } buildFileSelector() { const fileSelector = document.createElement('input'); fileSelector.setAttribute('type', 'file'); - fileSelector.setAttribute('accept', '.ktx,.dcm,.nii,.hdr,.h,.img,.gz'); - fileSelector.setAttribute('multiple', ''); + fileSelector.setAttribute('hidden', 'true'); + fileSelector.setAttribute('accept', '.txt,.ktx,.dcm,.nii,.hdr,.h,.img,.gz'); + fileSelector.setAttribute('multiple', 'true'); + document.body.appendChild(fileSelector); fileSelector.onchange = this.handleFileSelected; return fileSelector; } - onButtonLocalFile(evt) { + onButtonOpenLocalFileClick(evt) { // console.log('onButtonLocalFile started'); + // debugger; evt.preventDefault(); this.m_fileSelector.click(); } // onModalUrlShow() { - console.log(`onModalUrlShow`); - this.setState({ strUrl: '' }); this.setState({ showModalUrl: true }); } @@ -739,12 +696,6 @@ class UiOpenMenu extends React.Component { this.setState({ showModalUrl: false }); } - onChangeUrlString(evt) { - const str = evt.target.value; - this.setState({ strUrl: str }); - // console.log(`onChangeUrlString. str = ${str}`) - } - callbackReadCompleteUrlKtxNii(codeResult) { if (codeResult !== LoadResult.SUCCESS) { console.log(`onCompleteFromUrlKtx. Bad result: ${codeResult}`); @@ -753,7 +704,6 @@ class UiOpenMenu extends React.Component { const strErr = LoadResult.getResultString(codeResult); arrErrors.push(strErr); this.finalizeFailedLoadedVolume(this.m_volumeSet, this.m_fileName, arrErrors); - return; } else { this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); this.callbackReadComplete(LoadResult.SUCCESS, null, 0, null); @@ -761,19 +711,19 @@ class UiOpenMenu extends React.Component { } loadFromUrl(strUrl) { - const fileTools = new FileTools(); - const isValid = fileTools.isValidUrl(strUrl); - if (isValid) { + if (FileTools.isValidUrl(strUrl)) { this.m_url = strUrl; - this.m_fileName = fileTools.getFileNameFromUrl(strUrl); + this.m_fileName = FileTools.getFileNameFromUrl(strUrl); this.m_volumeSet = new VolumeSet(); this.m_volumeSet.addVolume(new Volume()); if (strUrl.endsWith('.ktx')) { + // debugger; const callbackProgress = this.callbackReadProgress; const callbackComplete = this.callbackReadCompleteUrlKtxNii; this.callbackReadProgress(0.0); + // debugger; this.m_volumeSet.readFromKtxUrl(strUrl, callbackProgress, callbackComplete); // if KTX } else if (strUrl.endsWith('.nii')) { @@ -785,8 +735,7 @@ class UiOpenMenu extends React.Component { } else if (strUrl.endsWith('.dcm')) { if (READ_DICOM_VIA_DAIKON) { const loaderUrlDcm = new LoaderDcmUrlDaikon(); - const ret = loaderUrlDcm.readFromUrl(this.m_volumeSet, strUrl, this.callbackReadCompleteUrlKtxNii, this.callbackReadProgress); - return ret; + return loaderUrlDcm.readFromUrl(this.m_volumeSet, strUrl, this.callbackReadCompleteUrlKtxNii, this.callbackReadProgress); } const callbackProgress = this.callbackReadProgress; @@ -794,17 +743,15 @@ class UiOpenMenu extends React.Component { this.callbackReadProgress(0.0); this.m_volumeSet.readFromDicomUrl(strUrl, callbackProgress, callbackComplete); // if Dicom - } else if (strUrl.endsWith('.h')) { + } else if (strUrl.endsWith('.hdr')) { const callbackProgress = this.callbackReadProgress; const callbackComplete = this.callbackReadCompleteUrlKtxNii; this.callbackReadProgress(0.0); this.m_volumeSet.readFromHdrUrl(strUrl, callbackProgress, callbackComplete); // if Hdr } else { - console.log(`UiOpenMenu. Unknow file type from URL = ${strUrl}`); + console.log(`UiOpenMenu. Unknown file type from URL = ${strUrl}`); } - - // if valid url } else { const strErr = `UiOpenMenu. Bad URL = ${strUrl}`; console.log(strErr); @@ -812,9 +759,8 @@ class UiOpenMenu extends React.Component { } } - onClickLoadUrl() { + onClickLoadUrl(strUrl) { this.setState({ showModalUrl: false }); - const strUrl = this.state.strUrl; console.log(`onClickLoadUrl with strUrl = ${strUrl}`); this.loadFromUrl(strUrl); } @@ -834,7 +780,7 @@ class UiOpenMenu extends React.Component { let str = ''; for (let i = 0; i < numLet; i++) { const n = arrNums[i]; - str = str.concat( String.fromCharCode(n) ); + str = str.concat(String.fromCharCode(n)); } return str; } @@ -853,6 +799,16 @@ class UiOpenMenu extends React.Component { } onDemoSelected(index) { + const store = this.props; + store.dispatch({ + type: StoreActionType.SET_PROGRESS, + progress: 0, + }); + store.dispatch({ + type: StoreActionType.SET_PROGRESS_INFO, + titleProgressBar: 'Loading demo file, please, wait...', + }); + store.dispatch({ type: StoreActionType.SET_SPINNER, spinner: true }); const arr = config.demoUrls; if (arr.length >= 8) { const fileName = arr[index]; @@ -860,38 +816,25 @@ class UiOpenMenu extends React.Component { this.loadFromUrl(fileName); return; } - let fileName = ''; - if (index === 0) { - // 20101108.ktx - // const FN_ENCODED = 'http://www.e-joufs.sv/qsjwbuf/nfe4xfc/ebub/luy/31212219.luy'; - const FN_ENCODED = 'https://med3web.pqfotpvsdf.fqbn.dpn/nfe4xfc3131/31212219.luy'; - const ft = new FileTools(); - fileName = ft.decodeUrl(FN_ENCODED); - // console.log(`onDemoSelected. enc = ${fileName}`); - } else if (index === 1) { - // set00.ktx - // const FN_ENCO = 'http://www.e-joufs.sv/qsjwbuf/nfe4xfc/ebub/luy/tfu11.luy'; - const FN_ENCO = 'https://med3web.pqfotpvsdf.fqbn.dpn/nfe4xfc3131/tfu11.luy'; - const ft = new FileTools(); - fileName = ft.decodeUrl(FN_ENCO); - // console.log(`onDemoSelected. enc = ${fileName}`); - } else if (index === 2) { - // gm3 nii - // const FN_GM_ENCODED = 'http://www.e-joufs.sv/qsjwbuf/nfe4xfc/ebub/ojguj/hn4_623_623_276.ojj'; - const FN_GM_ENCODED = 'https://med3web.pqfotpvsdf.fqbn.dpn/nfe4xfc3131/hn4_623_623_276.ojj'; - const ft = new FileTools(); - fileName = ft.decodeUrl(FN_GM_ENCODED); - // fileName = ft.encodeUrl(FN_GM_DECODED); - // console.log(`onDemoSelected. enc = ${fileName}`); - } else if (index === 3) { + + const DEMO_URL = 'https://d8ohfj70qg23c.cloudfront.net/demo/'; + + let fileName = + DEMO_URL + + [ + '01_lungs/20101108.ktx', + '02_brain_set/brain256.ktx', + '03_grandmother_gm3/gm3_512_512_165.nii', + '04_woman_pelvis/file_list.txt', + '05_lungs_00cba/file_list.txt', + '06_ct_256/ct_256_256_256.ktx', + '07_lungs_256/lungs_256_256_256.ktx', + '08_brain_with_roi/set_intn.hdr', + ][index] || console.log(`onDemoSelected. not implemented for index = ${index}`); + + if (fileName === '04_woman_pelvis/file_list.txt') { const numUrls = config.demoWomanPelvisUrls.length; - if (numUrls === 0) { - // woman pelvis - // const FN_WOMM_ENCODED = 'http://www.e-joufs.sv/qsjwbuf/nfe4xfc/ebub/ejdpn/xpnbo_qfmwjt/wig.:12.edn'; - const FN_WOMM_ENCODED = 'https://med3web.pqfotpvsdf.fqbn.dpn/nfe4xfc3131/xpnbo_qfmwjt/wig.:12.edn'; - const ft = new FileTools(); - fileName = ft.decodeUrl(FN_WOMM_ENCODED); - } else { + if (numUrls > 0) { const strPrefix = config.demoWomanPelvisPrefix; // console.log(`config. prefix = ${strPrefix}`); const arrFileNames = []; @@ -906,17 +849,11 @@ class UiOpenMenu extends React.Component { loader.loadFromUrlArray(arrFileNames, GOOGLE_HEADER); return; } - } else if (index === 4) { + } + if (fileName === '05_lungs_00cba/file_list.txt') { const numUrls = config.demoLungsUrls.length; - if (numUrls === 0) { - // lungs dicom 00cba..957e.dcm - // const FN_OCB_ENCODED = 'http://www.e-joufs.sv/qsjwbuf/nfe4xfc/ebub/ejdpn/11dcb1:2gb5be73dd4311b768bfc:68f/145784245dcfg6fb26gg:f1d91:1611b.edn'; - const FN_OCB_ENCODED = 'https://med3web.pqfotpvsdf.fqbn.dpn/nfe4xfc3131/11dcb1:2gb5be73dd4311b768bfc:68f/145784245dcfg6fb26gg:f1d91:1611b.edn'; - const ft = new FileTools(); - fileName = ft.decodeUrl(FN_OCB_ENCODED); - } else { + if (numUrls > 0) { const strPrefix = config.demoLungsPrefix; - console.log(`config. Lungs prefix = ${strPrefix}`); const arrFileNames = []; for (let i = 0; i < numUrls; i++) { const strFn = config.demoLungsUrls[i]; @@ -929,35 +866,12 @@ class UiOpenMenu extends React.Component { loader.loadFromUrlArray(arrFileNames, GOOGLE_HEADER); return; } - } else if (index === 5) { - // ct_256_256_256.ktx - // const FN_CT256_ENCODED = 'http://www.e-joufs.sv/qsjwbuf/nfe4xfc/ebub/luy/du_367_367_367.luy'; - const FN_CT256_ENCODED = 'https://med3web.pqfotpvsdf.fqbn.dpn/nfe4xfc3131/du_367_367_367.luy'; - const ft = new FileTools(); - fileName = ft.decodeUrl(FN_CT256_ENCODED); - // fileName = ft.encodeUrl(FN_CT256_DECODED); - // console.log(`onDemoSelected. enc = ${fileName}`); - } else if (index === 6) { - // lungs_256_256_256.ktx - // const FN_LUNGS256_ENCODED = 'http://www.e-joufs.sv/qsjwbuf/nfe4xfc/ebub/luy/mvoht_367_367_367.luy'; - const FN_LUNGS256_ENCODED = 'https://med3web.pqfotpvsdf.fqbn.dpn/nfe4xfc3131/mvoht_367_367_367.luy'; - const ft = new FileTools(); - fileName = ft.decodeUrl(FN_LUNGS256_ENCODED); - // fileName = ft.encodeUrl(FN_LUNGS256_DECODED); - // console.log(`onDemoSelected. enc = ${fileName}`); - } else if (index === 7) { - // hdr set (roi) - // const FN_HDRSET_ENCODED = 'http://www.e-joufs.sv/qsjwbuf/nfe4xfc/ebub/ies/tfu_jouo.i'; - const FN_HDRSET_ENCODED = 'https://med3web.pqfotpvsdf.fqbn.dpn/nfe4xfc3131/ies/tfu_jouo.i'; - const ft = new FileTools(); - fileName = ft.decodeUrl(FN_HDRSET_ENCODED); - } else { - console.log(`onDemoSelected. not implemented for index = ${index}`); } if (fileName.length > 0) { + console.log(`onDemoSelected. enc = ${fileName}`); this.loadFromUrl(fileName); - } // if fileName not empty - } // end of onDemoSelected + } + } // shouldComponentUpdate() { @@ -1010,112 +924,58 @@ class UiOpenMenu extends React.Component { this.m_fileSelector = this.buildFileSelector(); const fileNameOnLoad = this.m_fileNameOnLoad; // console.log(`UiOpenMenu. componentDidMount. fnonl = ${fileNameOnLoad}`); - if ((fileNameOnLoad.length > 0) && (this.state.onLoadCounter > 0)) { + if (fileNameOnLoad.length > 0 && this.state.onLoadCounter > 0) { this.setState({ onLoadCounter: 0 }); const TIMEOUT_MS = 50; - setTimeout( this.loadFromUrl(fileNameOnLoad), TIMEOUT_MS ); + // debugger; + setTimeout(this.loadFromUrl(fileNameOnLoad), TIMEOUT_MS); } } // render render() { - const isGoogle = config.googleCloudDemoActivce; - - const fileNameOnLoad = this.props.fileNameOnLoad; - this.m_fileNameOnLoad = fileNameOnLoad; - // console.log(`UiOpenMenu. render. fnol = ${this.m_fileNameOnLoad}`); - let jsxOnLoad = ''; - if (fileNameOnLoad.length > 2) { - jsxOnLoad =

; - return jsxOnLoad; - } - - const jsGoo = (isGoogle) ? - - - Google cloud models - : -

; - - const jsDemo = (NEED_DEMO_MENU) ? - - - Demo models Open - : -

; - - const jsVidiver = (isGoogle || NEED_DEMO_MENU) ? - : -

; - - // const store = this.props; - // const isVisibleDicomSeries = (store.dicomSeries.length !== 0); - - const jsxOpenMenu = - - - Open - - } > - this.onButtonLocalFile(evt)}> - - Computer - - - - Url - - - {jsVidiver} - - {jsGoo} - - {jsDemo} - - - - Load data from external source - - - - - - - - - Input URL to open - - - - - - - - - - - - - - - (this.childModalWindowCenterWidth = ref)} /> - - - - // return (jsxOnLoad.length > 1) ? jsxOnLoad : jsxOpenMenu; - return jsxOpenMenu; + this.m_fileNameOnLoad = this.props.fileNameOnLoad; + + return ( + <> + + + this.onButtonOpenLocalFileClick(evt)} /> + + + + + {NEED_DEMO_MENU && ( + + + + )} + + + {this.props.isLoaded && ( +
+ + +
+ )} + + {this.state.showModalUrl && ( + + )} + + {this.state.showModalDemo && ( + + )} + {this.state.showModalWindowCW && ( + + )} + + {/**/} + + ); } } -export default connect(store => store)(UiOpenMenu); +export default connect((store) => store)(UiOpenMenu); diff --git a/src/ui/OpenFile/UiOpenMenu.module.css b/src/ui/OpenFile/UiOpenMenu.module.css new file mode 100644 index 00000000..dc180cf1 --- /dev/null +++ b/src/ui/OpenFile/UiOpenMenu.module.css @@ -0,0 +1,20 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.save-file__area { + height: 50px; + display: flex; + align-content: center; + align-items: center; + justify-content: space-between; +} + +.save-file__area div { + margin-right: 10px; +} + +.filename { + gap: 8px; +} diff --git a/src/ui/OpenFile/UiReportMenu.js b/src/ui/OpenFile/UiReportMenu.js new file mode 100644 index 00000000..7df88cdd --- /dev/null +++ b/src/ui/OpenFile/UiReportMenu.js @@ -0,0 +1,57 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useState } from 'react'; + +import Screenshot from '../../engine/utils/Screenshot'; +import ViewMode from '../../store/ViewMode'; +import { Tooltip } from '../Tooltip/Tooltip'; +import { UIButton } from '../Button/Button'; +import UiModalInfo from '../Modals/ModalInfo'; +import { useSelector } from 'react-redux'; + +export const UiReportMenu = () => { + const [showModalDicomTags, setShowModalDicomTags] = useState(false); + + const { viewMode, graphics2d, volumeRenderer, isLoaded } = useSelector((state) => state); + const onModalDicomTagsShow = () => { + setShowModalDicomTags(true); + }; + + const onModalDicomTagsHide = () => { + setShowModalDicomTags(false); + }; + + const onModalScreenshot = () => { + const SHOT_W = 800; + const SHOT_H = 600; + + const viewModeLocal = viewMode; + if (viewModeLocal === ViewMode.VIEW_2D) { + const gra2d = graphics2d; + Screenshot.makeScreenshot(gra2d, SHOT_W, SHOT_H); + } else if (viewModeLocal === ViewMode.VIEW_3D || viewModeLocal === ViewMode.VIEW_3D_LIGHT) { + const volRender = volumeRenderer; + Screenshot.makeScreenshot(volRender, SHOT_W, SHOT_H); + } else { + console.log('onModalScreenshot. not implemented yet'); + } + }; + + const isLoadedLocal = isLoaded; + const strDisabled = !isLoadedLocal; + return ( + <> + + + + + + + + {showModalDicomTags && } + + ); +}; diff --git a/src/ui/OpenFile/UiSaveMenu.js b/src/ui/OpenFile/UiSaveMenu.js new file mode 100644 index 00000000..8e8c0be0 --- /dev/null +++ b/src/ui/OpenFile/UiSaveMenu.js @@ -0,0 +1,36 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useState } from 'react'; + +import { useSelector } from 'react-redux'; + +import { UiModalSaveNifti } from '../Modals/UiModalSaveNifti'; +import { UIButton } from '../Button/Button'; +import { Tooltip } from '../Tooltip/Tooltip'; + +export const UiSaveMenu = () => { + /** + * @param {object} props - props from up level object + */ + const [showModalSaveNifti, setShowModalSaveNifti] = useState(false); + const { isLoaded } = useSelector((state) => state); + + const onModalSaveNiftiShow = () => { + setShowModalSaveNifti(true); + }; + + const onModalSaveNiftiHide = () => { + setShowModalSaveNifti(false); + }; + return ( + <> + + onModalSaveNiftiShow(evt)} mode={isLoaded ? 'accent' : ''} /> + + + + ); +}; diff --git a/src/ui/Panels/Mode2dSettingsPanel.jsx b/src/ui/Panels/Mode2dSettingsPanel.jsx new file mode 100644 index 00000000..492ba893 --- /dev/null +++ b/src/ui/Panels/Mode2dSettingsPanel.jsx @@ -0,0 +1,25 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { SegmentationProperty } from './Properties2d/SegmentationProperty'; +import SelectVolumeProperty from './Properties2d/SelectVolumeProperty'; +import { SliderCaption } from '../Form'; +import { TransverseProperty } from './Properties2d/TransverseProperty'; +import { useSelector } from 'react-redux'; + +export const Mode2dSettingsPanel = () => { + const { volumeSet } = useSelector((state) => state); + const { m_volumes } = volumeSet; + + return ( + <> + + + + {m_volumes.length > 1 && } + + ); +}; diff --git a/src/ui/Panels/Mode3dSettingsPanel.jsx b/src/ui/Panels/Mode3dSettingsPanel.jsx new file mode 100644 index 00000000..bb77eccb --- /dev/null +++ b/src/ui/Panels/Mode3dSettingsPanel.jsx @@ -0,0 +1,23 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { CutProperty } from './Properties3d/CutProperty'; +import { BrightnessProperty } from './Properties3d/BrightnessProperty'; +import { QualityProperty } from './Properties3d/QualityProperty'; +import { OpacityProperty } from './Properties3d/OpacityProperty'; +import { HistogramProperty } from './Properties3d/HistogramProperty'; + +export const Mode3dSettingsPanel = () => { + return ( + <> + + + + + + + ); +}; diff --git a/src/ui/Panels/ModeFast3dSettingsPanel.jsx b/src/ui/Panels/ModeFast3dSettingsPanel.jsx new file mode 100644 index 00000000..f7fa521d --- /dev/null +++ b/src/ui/Panels/ModeFast3dSettingsPanel.jsx @@ -0,0 +1,43 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React from 'react'; +import { useSelector } from 'react-redux'; +import { BrightnessProperty } from './Properties3d/BrightnessProperty'; +import { QualityProperty } from './Properties3d/QualityProperty'; +import { CutProperty } from './Properties3d/CutProperty'; +import { ContrastProperty } from './Properties3d/ContrastProperty'; +import { useNeedShow3d } from '../../utils/useNeedShow3d'; +import { RoiSelectProperty } from './Properties3d/RoiSelectProperty'; +import { OpacityProperty } from './Properties3d/OpacityProperty'; +import { RGBProperty } from './Properties3d/RGBProperty'; +import { Mode3dSelectionTabs } from './Tabs/Mode3dSelectionTabs'; + +export const ModeFast3dSettingsPanel = () => { + const { isTool3D, volumeSet, volumeIndex } = useSelector((state) => state); + const needShow3d = useNeedShow3d(volumeSet, volumeIndex); + + return ( + <> + {needShow3d ? ( + + ) : ( + <> + + + + + )} + + {isTool3D ? ( + + ) : ( + <> + + + + )} + + ); +}; diff --git a/src/ui/Panels/ModeFast3dSettingsPanel.test.jsx b/src/ui/Panels/ModeFast3dSettingsPanel.test.jsx new file mode 100644 index 00000000..6f8634be --- /dev/null +++ b/src/ui/Panels/ModeFast3dSettingsPanel.test.jsx @@ -0,0 +1,71 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { ModeFast3dSettingsPanel } from './ModeFast3dSettingsPanel'; +import { renderWithState } from '../../utils/configureTest'; +import { CutProperty } from './Properties3d/CutProperty'; +import { BrightnessProperty } from './Properties3d/BrightnessProperty'; +import { QualityProperty } from './Properties3d/QualityProperty'; +import { ContrastProperty } from './Properties3d/ContrastProperty'; +import { useNeedShow3d } from '../../utils/useNeedShow3d'; +import { Mode3dSelectionTabs } from './Tabs/Mode3dSelectionTabs'; +import { RoiSelectProperty } from './Properties3d/RoiSelectProperty'; +import { RGBProperty } from './Properties3d/RGBProperty'; +import { OpacityProperty } from './Properties3d/OpacityProperty'; + +jest.mock('./Tabs/Mode3dSelectionTabs', () => ({ Mode3dSelectionTabs: jest.fn(() =>
Mode3dSelectionTabs
) })); +jest.mock('./Properties3d/RoiSelectProperty', () => ({ RoiSelectProperty: jest.fn(() =>
RoiSelectProperty
) })); +jest.mock('./Properties3d/RGBProperty', () => ({ RGBProperty: jest.fn(() =>
RGBProperty
) })); +jest.mock('./Properties3d/OpacityProperty', () => ({ OpacityProperty: jest.fn(() =>
OpacityProperty
) })); +jest.mock('./Properties3d/CutProperty', () => ({ CutProperty: jest.fn(() => null) })); +jest.mock('./Properties3d/BrightnessProperty', () => ({ BrightnessProperty: jest.fn(() => null) })); +jest.mock('./Properties3d/QualityProperty', () => ({ QualityProperty: jest.fn(() => null) })); +jest.mock('./Properties3d/ContrastProperty', () => ({ ContrastProperty: jest.fn(() => null) })); + +jest.mock('../../utils/useNeedShow3d'); +const mockedUseNeedShow3d = useNeedShow3d; + +describe('Test ModeFast3dSettingsPanel', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should render', () => { + mockedUseNeedShow3d.mockReturnValue(true); + renderWithState(); + + expect(Mode3dSelectionTabs).toBeCalledTimes(1); + expect(CutProperty).toBeCalledTimes(1); + expect(BrightnessProperty).toBeCalledTimes(1); + expect(QualityProperty).toBeCalledTimes(1); + + expect(ContrastProperty).toBeCalledTimes(0); + expect(RoiSelectProperty).toBeCalledTimes(0); + expect(RGBProperty).toBeCalledTimes(0); + expect(OpacityProperty).toBeCalledTimes(0); + }); + + it('should render when needShow3d is false', () => { + mockedUseNeedShow3d.mockReturnValue(false); + renderWithState(); + + expect(Mode3dSelectionTabs).toBeCalledTimes(0); + + expect(RoiSelectProperty).toBeCalledTimes(1); + expect(RGBProperty).toBeCalledTimes(1); + expect(OpacityProperty).toBeCalledTimes(1); + }); + + it('should render when isTool3d true', () => { + mockedUseNeedShow3d.mockReturnValue(true); + renderWithState(, { isTool3D: true }); + + expect(ContrastProperty).toBeCalledTimes(1); + + expect(BrightnessProperty).toBeCalledTimes(0); + expect(QualityProperty).toBeCalledTimes(0); + }); +}); diff --git a/src/ui/Panels/Properties2d/SegmentationProperty.jsx b/src/ui/Panels/Properties2d/SegmentationProperty.jsx new file mode 100644 index 00000000..f12274e5 --- /dev/null +++ b/src/ui/Panels/Properties2d/SegmentationProperty.jsx @@ -0,0 +1,42 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React, { useState } from 'react'; +import { useSelector } from 'react-redux'; + +import { Switch, SwitchRow } from '../../Form'; + +export const SegmentationProperty = () => { + const [isSegmented, setSegmented] = useState(false); + const { graphics2d } = useSelector((state) => state); + + const toggleSegmentation = () => { + const value = !isSegmented; + setSegmented(value); + + if (graphics2d !== null) { + graphics2d.m_isSegmented = value; + graphics2d.forceUpdate(); + graphics2d.forceRender(); + + const { segm2d } = graphics2d; + if (segm2d !== null && value) { + if (segm2d.model == null) { + segm2d.onLoadModel(); + } + } + } + }; + + return ( + <> + You can use automatic 2d image segmentation only for brain-like data + + Segmentation 2d (brain only) + + + Switch checker above on and see segmentation result on right + + ); +}; diff --git a/src/ui/Panels/Properties2d/SelectVolumeProperty.js b/src/ui/Panels/Properties2d/SelectVolumeProperty.js new file mode 100644 index 00000000..daa87a7d --- /dev/null +++ b/src/ui/Panels/Properties2d/SelectVolumeProperty.js @@ -0,0 +1,109 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React from 'react'; +import { connect } from 'react-redux'; + +import StoreActionType from '../../../store/ActionTypes'; + +import { UiVolIcon } from './UiVolIcon'; + +const NEED_TEXTURE_SIZE_4X = true; + +class SelectVolumeProperty extends React.Component { + constructor(props) { + super(props); + this.onClickRow = this.onClickRow.bind(this); + } + + setVolumeIndex(indexSelected) { + const store = this.props; + const volumeSet = store.volumeSet; + + // finalize load + const vol = volumeSet.getVolume(indexSelected); + console.assert(vol !== null, 'setVolumeIndex: vol should be non zero volume'); + + if (vol.m_dataArray !== null) { + if (NEED_TEXTURE_SIZE_4X) { + vol.makeDimensions4x(); + } + // invoke notification + + // send update (repaint) if was loaded prev model + if (store.isLoaded) { + store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); + } + + store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: volumeSet }); + store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: indexSelected }); + store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); + + const gra = store.graphics2d; + gra.clear(); + gra.forceUpdate(indexSelected); + gra.forceRender(); + } + } + + onClickRow(ind) { + console.assert(typeof ind == 'number'); + const store = this.props; + if (ind !== store.volumeIndex) { + // set global selected volume index + store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: ind }); + this.setVolumeIndex(ind); + } + } + + render() { + const store = this.props; + const volumeSet = store.volumeSet; + const vols = volumeSet.m_volumes; + const volumeIndex = store.volumeIndex; + + const strPatName = store.dicomInfo.m_patientName; + const strStudyDescr = store.dicomInfo.m_studyDescr; + const strTitle = `Volume select. [${strPatName}]: ${strStudyDescr}`; + + return ( + <> + {strTitle} + {vols.map((vol, i) => { + const numSlices = vol.m_zDim; + const strSer = vol.m_seriesDescr; + const strVo = `vol ${strSer} [${numSlices}] slices`; + let jsxListItem; + if (i === volumeIndex) { + jsxListItem = ( +

{ + this.onClickRow(i); + }} + active + > + {strVo} {' '} +

+ ); + } else { + jsxListItem = ( +

{ + this.onClickRow(i); + }} + > + {strVo} {' '} +

+ ); + } + return jsxListItem; + })} + + ); + } +} + +export default connect((store) => store)(SelectVolumeProperty); diff --git a/src/ui/Panels/Properties2d/TransverseProperty.jsx b/src/ui/Panels/Properties2d/TransverseProperty.jsx new file mode 100644 index 00000000..edf995f3 --- /dev/null +++ b/src/ui/Panels/Properties2d/TransverseProperty.jsx @@ -0,0 +1,72 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { Nouislider } from '../../Nouislider/Nouislider'; +import { SliderRow } from '../../Form'; +import { useDispatch, useSelector } from 'react-redux'; +import Modes2d from '../../../store/Modes2d'; +import StoreActionType from '../../../store/ActionTypes'; + +export const TransverseProperty = () => { + const dispatch = useDispatch(); + const { volumeSet, volumeIndex, sliceRatio, mode2d, graphics2d } = useSelector((state) => state); + const { m_volumes } = volumeSet; + let xDim = 0, + yDim = 0, + zDim = 0; + if (m_volumes.length > 0) { + const volume = volumeSet.getVolume(volumeIndex); + if (volume !== null) { + xDim = volume.m_xDim; + yDim = volume.m_yDim; + zDim = volume.m_zDim; + } + } + + // slider maximum value is depend on current x or y or z 2d mode selection + const getMaxRange = () => { + if (mode2d === Modes2d.SAGGITAL) { + return xDim - 1; + } else if (mode2d === Modes2d.CORONAL) { + return yDim - 1; + } else if (mode2d === Modes2d.TRANSVERSE) { + return zDim - 1; + } + }; + const slideRangeMax = getMaxRange(); + + const onChangeSliderSlice = (value) => { + const ratio = value / slideRangeMax; + dispatch({ type: StoreActionType.SET_SLIDER_2D, sliceRatio: ratio }); + // clear all 2d tools + graphics2d.clear(); + + // re-render (and rebuild segm if present) + graphics2d.forceUpdate(); + + // render just builded image + graphics2d.forceRender(); + }; + + const start = [Math.floor(sliceRatio * slideRangeMax)]; + + const getAriaValueText = (value) => { + return Math.floor(value).toString(); + }; + + return ( + + + + ); +}; diff --git a/src/ui/Panels/Properties2d/UiVolIcon.js b/src/ui/Panels/Properties2d/UiVolIcon.js new file mode 100644 index 00000000..562b2c22 --- /dev/null +++ b/src/ui/Panels/Properties2d/UiVolIcon.js @@ -0,0 +1,62 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useRef, useEffect } from 'react'; + +import { useSelector } from 'react-redux'; +import { VOLUME_ICON_SIDE } from '../../../engine/Volume'; + +export const UiVolIcon = (props) => { + let m_volIndex = -1; + useEffect(() => { + // console.log("UiVlIcon.componentDidMount"); + const store = useSelector((state) => state); + const volSet = store.volumeSet; + const vol = volSet.getVolume(m_volIndex); + // console.log(`vol icon = ${vol.m_xIcon} * ${vol.m_yIcon}`); + const objCanvas = useRef(null); + if (objCanvas === null) { + return; + } + const ctx = objCanvas.current.getContext('2d'); + const w = objCanvas.current.clientWidth; + const h = objCanvas.current.clientHeight; + if (w * h === 0) { + return; + } + // clear dest image + ctx.fillStyle = 'rgb(64, 64, 64)'; + ctx.fillRect(0, 0, w, h); + if (vol.m_xIcon <= 0) { + // draw cross on whole image + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(w - 1, h - 1); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(w - 1, 0); + ctx.lineTo(0, h - 1); + ctx.stroke(); + return; + } + const imgData = ctx.createImageData(w, h); + const dataDst = imgData.data; + const numPixels = w * h; + let j = 0; + for (let i = 0; i < numPixels; i++) { + const val = vol.m_dataIcon[i]; + dataDst[j + 0] = val; + dataDst[j + 1] = val; + dataDst[j + 2] = val; + dataDst[j + 3] = 255; + j += 4; + } + ctx.putImageData(imgData, 0, 0); + }, []); + const side = VOLUME_ICON_SIDE; + m_volIndex = props.index; + return ; +}; diff --git a/src/ui/Panels/Properties3d/AmbientOcclusionProperty.jsx b/src/ui/Panels/Properties3d/AmbientOcclusionProperty.jsx new file mode 100644 index 00000000..b71d344a --- /dev/null +++ b/src/ui/Panels/Properties3d/AmbientOcclusionProperty.jsx @@ -0,0 +1,30 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Switch, SwitchRow } from '../../Form'; +import React, { useState } from 'react'; +import { useSelector } from 'react-redux'; + +export function AmbientOcclusionProperty() { + const [ambient, setAmbient] = useState(false); + const { volumeRenderer, isoThresholdValue } = useSelector((state) => state); + + const onChange = (value) => { + if (value) { + volumeRenderer.setAmbientTextureMode(isoThresholdValue); + } else { + volumeRenderer.offAmbientTextureMode(); + } + setAmbient(value); + }; + return ( + <> + + Ambient Occlusion + + + + ); +} diff --git a/src/ui/Panels/Properties3d/BrightnessProperty.jsx b/src/ui/Panels/Properties3d/BrightnessProperty.jsx new file mode 100644 index 00000000..f3b8b7cb --- /dev/null +++ b/src/ui/Panels/Properties3d/BrightnessProperty.jsx @@ -0,0 +1,30 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React from 'react'; +import { Nouislider } from '../../Nouislider/Nouislider'; +import { SliderRow } from '../../Form'; +import StoreActionType from '../../../store/ActionTypes'; +import { useDispatch, useSelector } from 'react-redux'; + +export const BrightnessProperty = () => { + const dispatch = useDispatch(); + const { brightness3DValue } = useSelector((state) => state); + + const onChangeSliderBrightness = (value) => { + dispatch({ type: StoreActionType.SET_SLIDER_Brightness, brightness3DValue: value }); + }; + + return ( + + + + ); +}; diff --git a/src/ui/Panels/Properties3d/ContrastProperty.jsx b/src/ui/Panels/Properties3d/ContrastProperty.jsx new file mode 100644 index 00000000..ebcb608c --- /dev/null +++ b/src/ui/Panels/Properties3d/ContrastProperty.jsx @@ -0,0 +1,32 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Nouislider } from '../../Nouislider/Nouislider'; +import { SliderRow } from '../../Form'; +import React from 'react'; +import StoreActionType from '../../../store/ActionTypes'; +import { useDispatch, useSelector } from 'react-redux'; + +export function ContrastProperty() { + const dispatch = useDispatch(); + const { brightness3DValue } = useSelector((state) => state); + + const onChangeSliderContrast3D = (value) => { + dispatch({ type: StoreActionType.SET_SLIDER_Contrast3D, sliderContrast3D: value }); + }; + + return ( + + + + ); +} diff --git a/src/ui/Panels/Properties3d/CutProperty.jsx b/src/ui/Panels/Properties3d/CutProperty.jsx new file mode 100644 index 00000000..b7f12533 --- /dev/null +++ b/src/ui/Panels/Properties3d/CutProperty.jsx @@ -0,0 +1,25 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Nouislider } from '../../Nouislider/Nouislider'; +import { SliderRow } from '../../Form'; +import React from 'react'; +import StoreActionType from '../../../store/ActionTypes'; +import { useDispatch, useSelector } from 'react-redux'; + +export function CutProperty() { + const dispatch = useDispatch(); + const { cut3DRatio } = useSelector((state) => state); + + const onChange = (value) => { + dispatch({ type: StoreActionType.SET_SLIDER_Cut, cut3DRatio: value }); + }; + + return ( + + + + ); +} diff --git a/src/ui/Panels/Properties3d/DepthProperty.jsx b/src/ui/Panels/Properties3d/DepthProperty.jsx new file mode 100644 index 00000000..545659bf --- /dev/null +++ b/src/ui/Panels/Properties3d/DepthProperty.jsx @@ -0,0 +1,27 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Nouislider } from '../../Nouislider/Nouislider'; +import { SliderCaption, SliderRow } from '../../Form'; +import React from 'react'; +import StoreActionType from '../../../store/ActionTypes'; +import { useDispatch, useSelector } from 'react-redux'; + +export function DepthProperty() { + const dispatch = useDispatch(); + const { sliderErDepth } = useSelector((state) => state); + + const onChange = (value) => { + dispatch({ type: StoreActionType.SET_SLIDER_ErDepth, sliderErDepth: value }); + }; + return ( + <> + + + + + + ); +} diff --git a/src/ui/Panels/Properties3d/HistogramProperty.jsx b/src/ui/Panels/Properties3d/HistogramProperty.jsx new file mode 100644 index 00000000..ea21cf45 --- /dev/null +++ b/src/ui/Panels/Properties3d/HistogramProperty.jsx @@ -0,0 +1,21 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React from 'react'; +import { useSelector } from 'react-redux'; +import UiHistogram from '../../Histogram/UiHistogram'; + +export function HistogramProperty() { + const { volumeSet, volumeIndex, volumeRenderer } = useSelector((state) => state); + + const volume = volumeSet.getVolume(volumeIndex); + + const transfer = (value) => { + const { m_handleX, m_handleY } = value; + // console.log(`moved point[${m_indexMoved}] = ${m_handleX[i]}, ${m_handleY[i]} `); + volumeRenderer.updateTransferFuncTexture(m_handleX, m_handleY); + }; + + return ; +} diff --git a/src/ui/Panels/Properties3d/IsosurfaceProperty.jsx b/src/ui/Panels/Properties3d/IsosurfaceProperty.jsx new file mode 100644 index 00000000..d0811f0b --- /dev/null +++ b/src/ui/Panels/Properties3d/IsosurfaceProperty.jsx @@ -0,0 +1,27 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Nouislider } from '../../Nouislider/Nouislider'; +import { SliderCaption, SliderRow } from '../../Form'; +import React from 'react'; +import StoreActionType from '../../../store/ActionTypes'; +import { useDispatch, useSelector } from 'react-redux'; + +export function IsosurfaceProperty() { + const dispatch = useDispatch(); + const { isoThresholdValue } = useSelector((state) => state); + + const onChange = (value) => { + dispatch({ type: StoreActionType.SET_SLIDER_Isosurface, isoThresholdValue: value }); + }; + return ( + <> + + + + + + ); +} diff --git a/src/ui/Panels/Properties3d/OpacityProperty.jsx b/src/ui/Panels/Properties3d/OpacityProperty.jsx new file mode 100644 index 00000000..3f25bb23 --- /dev/null +++ b/src/ui/Panels/Properties3d/OpacityProperty.jsx @@ -0,0 +1,30 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Nouislider } from '../../Nouislider/Nouislider'; +import { SliderRow } from '../../Form'; +import React from 'react'; +import StoreActionType from '../../../store/ActionTypes'; +import { useDispatch, useSelector } from 'react-redux'; + +export function OpacityProperty() { + const dispatch = useDispatch(); + const { opacityValue3D } = useSelector((state) => state); + + const onChangeSliderOpacity = (value) => { + dispatch({ type: StoreActionType.SET_SLIDER_Opacity, opacityValue3D: value }); + }; + return ( + + + + ); +} diff --git a/src/ui/Panels/Properties3d/QualityProperty.jsx b/src/ui/Panels/Properties3d/QualityProperty.jsx new file mode 100644 index 00000000..df2fb54c --- /dev/null +++ b/src/ui/Panels/Properties3d/QualityProperty.jsx @@ -0,0 +1,31 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import { useDispatch, useSelector } from 'react-redux'; +import StoreActionType from '../../../store/ActionTypes'; +import { SliderRow } from '../../Form'; +import { Nouislider } from '../../Nouislider/Nouislider'; +import React from 'react'; + +export const QualityProperty = () => { + const dispatch = useDispatch(); + const { quality3DStepSize } = useSelector((state) => state); + + const onChangeSliderQuality = (value) => { + dispatch({ type: StoreActionType.SET_SLIDER_Quality, quality3DStepSize: value }); + }; + + return ( + + + + ); +}; diff --git a/src/ui/Panels/Properties3d/RGBProperty.jsx b/src/ui/Panels/Properties3d/RGBProperty.jsx new file mode 100644 index 00000000..669bec90 --- /dev/null +++ b/src/ui/Panels/Properties3d/RGBProperty.jsx @@ -0,0 +1,32 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Nouislider } from '../../Nouislider/Nouislider'; +import { SliderRow } from '../../Form'; +import React from 'react'; +import StoreActionType from '../../../store/ActionTypes'; +import { useDispatch, useSelector } from 'react-redux'; + +export function RGBProperty({ changeOnlyRG = false }) { + const dispatch = useDispatch(); + const { slider3d_r, slider3d_g, slider3d_b } = useSelector((state) => state); + + const onChange = (value) => { + const [r, g, b] = value; + dispatch({ type: StoreActionType.SET_SLIDER_3DR, slider3d_r: r }); + dispatch({ type: StoreActionType.SET_SLIDER_3DG, slider3d_g: g }); + if (!changeOnlyRG) { + dispatch({ type: StoreActionType.SET_SLIDER_3DB, slider3d_b: b }); + } + }; + + const wArr = changeOnlyRG ? [slider3d_r, slider3d_g] : [slider3d_r, slider3d_g, slider3d_b]; + + return ( + + + + ); +} diff --git a/src/ui/Panels/Properties3d/RadiusProperty.jsx b/src/ui/Panels/Properties3d/RadiusProperty.jsx new file mode 100644 index 00000000..15281366 --- /dev/null +++ b/src/ui/Panels/Properties3d/RadiusProperty.jsx @@ -0,0 +1,27 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Nouislider } from '../../Nouislider/Nouislider'; +import { SliderCaption, SliderRow } from '../../Form'; +import React from 'react'; +import StoreActionType from '../../../store/ActionTypes'; +import { useDispatch, useSelector } from 'react-redux'; + +export function RadiusProperty() { + const dispatch = useDispatch(); + const { sliderErRadius } = useSelector((state) => state); + + const onChange = (value) => { + dispatch({ type: StoreActionType.SET_SLIDER_ErRadius, sliderErRadius: value }); + }; + return ( + <> + + + + + + ); +} diff --git a/src/ui/Panels/Properties3d/RoiSelectProperty.jsx b/src/ui/Panels/Properties3d/RoiSelectProperty.jsx new file mode 100644 index 00000000..a897ac59 --- /dev/null +++ b/src/ui/Panels/Properties3d/RoiSelectProperty.jsx @@ -0,0 +1,65 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React from 'react'; +import { useSelector } from 'react-redux'; +import { Checkbox, FormControlLabel, FormGroup } from '@mui/material'; +import { getPalette } from '../../../engine/loaders/RoiPaletteItems'; + +export const RoiSelectProperty = () => { + const { volumeRenderer } = useSelector((state) => state); + const [isSelectedAll, setSelectedAll] = React.useState(false); + const [checked, setChecked] = React.useState([]); + + const palette = getPalette(); + + const selectAll = () => { + const newChecked = isSelectedAll ? [] : palette.map((item) => item.roiId); + setSelectedAll(!isSelectedAll); + + setChecked(newChecked); + volumeRenderer.updateSelectedRoiMap(newChecked); + }; + + const handleToggle = (value) => () => { + const currentIndex = checked.indexOf(value); + const newChecked = [...checked]; + + if (currentIndex === -1) { + newChecked.push(value); + } else { + newChecked.splice(currentIndex, 1); + } + + setChecked(newChecked); + volumeRenderer.updateSelectedRoiMap(newChecked); + }; + + const getColorByRGB = (color) => { + const [r, g, b] = color.split(' '); + const rCol = Math.floor(r * 255); + const gCol = Math.floor(g * 255); + const bCol = Math.floor(b * 255); + return '#' + rCol.toString(16) + gCol.toString(16) + bCol.toString(16); + }; + + return ( + <> + ROI Selector + + } label={isSelectedAll ? 'Select none' : 'Select all'} /> + {palette.map(({ roiId, name, roiColor }) => { + return ( + } + label={name} + color={getColorByRGB(roiColor)} + /> + ); + })} + + + ); +}; diff --git a/src/ui/Panels/RightPanel.jsx b/src/ui/Panels/RightPanel.jsx new file mode 100644 index 00000000..db8ce28b --- /dev/null +++ b/src/ui/Panels/RightPanel.jsx @@ -0,0 +1,24 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { useSelector } from 'react-redux'; + +import { Mode2dSettingsPanel } from './Mode2dSettingsPanel'; +import { Mode3dSettingsPanel } from './Mode3dSettingsPanel'; +import ViewMode from '../../store/ViewMode'; +import { DragAndDropContainer } from '../DragAndDrop/DragAndDropContainer'; +import { ModeFast3dSettingsPanel } from './ModeFast3dSettingsPanel'; + +export const RightPanel = () => { + const { viewMode } = useSelector((state) => state); + return ( + + {viewMode === ViewMode.VIEW_2D && } + {viewMode === ViewMode.VIEW_3D_LIGHT && } + {viewMode === ViewMode.VIEW_3D && } + + ); +}; diff --git a/src/ui/Panels/Tabs/Mode3dSelectionTabs.jsx b/src/ui/Panels/Tabs/Mode3dSelectionTabs.jsx new file mode 100644 index 00000000..5d7c1bcb --- /dev/null +++ b/src/ui/Panels/Tabs/Mode3dSelectionTabs.jsx @@ -0,0 +1,91 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import StoreActionType from '../../../store/ActionTypes'; +import { useDispatch, useSelector } from 'react-redux'; +import Modes3d from '../../../store/Modes3d'; +import { Box, Tab, Tabs } from '@mui/material'; +import { TabPanel } from './TabPanel'; +import css from '../../Form/Slider.module.css'; +import { HistogramProperty } from '../Properties3d/HistogramProperty'; +import { IsosurfaceProperty } from '../Properties3d/IsosurfaceProperty'; +import { AmbientOcclusionProperty } from '../Properties3d/AmbientOcclusionProperty'; +import { SliderCaption } from '../../Form'; +import { RGBProperty } from '../Properties3d/RGBProperty'; +import { OpacityProperty } from '../Properties3d/OpacityProperty'; +import { RadiusProperty } from '../Properties3d/RadiusProperty'; +import { DepthProperty } from '../Properties3d/DepthProperty'; +import { FlexRow } from '../../Layout/FlexRow'; +import { UIButton } from '../../Button/Button'; +import { MuiStyledTooltip } from '../../Tooltip/atoms/MuiStyledTooltip'; + +export function Mode3dSelectionTabs() { + const dispatch = useDispatch(); + const { mode3d, volumeRenderer } = useSelector((state) => state); + + const handleChange = (event, value) => { + dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: value }); + volumeRenderer.offAmbientTextureMode(); + + if (value === Modes3d.EREASER) { + volumeRenderer.setEraserMode(true); + } else { + volumeRenderer.setEraserMode(false); + } + }; + + const onUndo = () => { + volumeRenderer.undoEraser(); + }; + + const onSave = () => { + volumeRenderer.volumeUpdater.updateVolumeTextureWithMask(); + }; + + return ( + <> + +

3D mode selection

+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + Press Control + Mouse Down [+ Mouse Move] for erase + + + + + + + + + + ); +} diff --git a/src/ui/Panels/Tabs/TabPanel.jsx b/src/ui/Panels/Tabs/TabPanel.jsx new file mode 100644 index 00000000..c03d9b11 --- /dev/null +++ b/src/ui/Panels/Tabs/TabPanel.jsx @@ -0,0 +1,15 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React from 'react'; + +export function TabPanel(props) { + const { children, value, index, ...other } = props; + + return ( + + ); +} diff --git a/src/ui/ProgressBar/UIProgressBar.jsx b/src/ui/ProgressBar/UIProgressBar.jsx new file mode 100644 index 00000000..c0234121 --- /dev/null +++ b/src/ui/ProgressBar/UIProgressBar.jsx @@ -0,0 +1,31 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { useSelector } from 'react-redux'; +import css from './UIprogressBar.module.css'; + +const UIProgressBar = () => { + const { progress, titleProgressBar } = useSelector((state) => state); + const progressWidth = `${progress < 1 ? progress * 100 : progress}%`; + + return ( + <> +
+ {titleProgressBar} +
+
+ + ); +}; + +export default React.memo(UIProgressBar); diff --git a/src/ui/ProgressBar/UISpinner.jsx b/src/ui/ProgressBar/UISpinner.jsx new file mode 100644 index 00000000..9a14fb75 --- /dev/null +++ b/src/ui/ProgressBar/UISpinner.jsx @@ -0,0 +1,13 @@ +import React from 'react'; +import css from './UISpinner.module.css'; + +const Spinner = () => { + return ( +
+
+
Loading...
+
+ ); +}; + +export default Spinner; diff --git a/src/ui/ProgressBar/UISpinner.module.css b/src/ui/ProgressBar/UISpinner.module.css new file mode 100644 index 00000000..5ff49874 --- /dev/null +++ b/src/ui/ProgressBar/UISpinner.module.css @@ -0,0 +1,63 @@ +.spinner { + position: absolute; + height: 100vh; + width: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.loader, +.loader:after { + margin: 0 5px; + padding: 12px; + border-radius: 50%; + width: 5em; + height: 5em; +} +.loader { + font-size: 10px; + position: relative; + text-indent: -9999em; + border-top: 0.6em solid rgba(230, 107, 107, 0.4); + border-right: 0.6em solid rgba(230, 107, 107, 0.4); + border-bottom: 0.6em solid rgba(230, 107, 107, 0.4); + border-left: 0.6em solid var(--red); + -webkit-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); + -webkit-animation: load8 1.1s infinite linear; + animation: load8 1.1s infinite linear; + z-index: 11; +} +@-webkit-keyframes load8 { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes load8 { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +.overlay { + position: absolute; + width: 100%; + height: 100vh; + background-color: var(--extreme-black); + opacity: 0.4; + top: 0; + left: 0; + z-index: 1003; +} diff --git a/src/ui/ProgressBar/UIprogressBar.module.css b/src/ui/ProgressBar/UIprogressBar.module.css new file mode 100644 index 00000000..8fb86c53 --- /dev/null +++ b/src/ui/ProgressBar/UIprogressBar.module.css @@ -0,0 +1,56 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.progress { + position: absolute; + top: 5px; + left: 6px; + right: 6px; + height: 20px; + display: flex; + align-items: stretch; + background-color: var(--gray); + overflow: hidden; + border-radius: 100px; + z-index: 1001; + padding: 2px 2px; +} + +.progressBar { + background-color: var(--red); + background-image: linear-gradient( + 45deg, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 80px 80px; + animation: progressAnimation 2s linear infinite; + border-radius: 100px; +} + +.label { + position: absolute; + top: 4px; + left: 50%; + transform: translateX(-50%); + font-size: 0.8rem; + letter-spacing: 0.5px; + color: var(--white); + z-index: 1001; +} + +@keyframes progressAnimation { + 0% { + background-position: 0 0; + } + 100% { + background-position: 80px 0; + } +} diff --git a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx new file mode 100644 index 00000000..7fd38353 --- /dev/null +++ b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx @@ -0,0 +1,21 @@ +import React from 'react'; +import css from './RecentlyFiles.module.css'; +const RecentlyFiles = () => { + return ( +
+
Recently opened files:
+
+
+
29 minutes ago
+
Mar 28 2023, 10:55 AM
+
+
+
demo_file.dicom
+
lunk.ktx
+
+
+
+ ); +}; + +export default RecentlyFiles; diff --git a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css new file mode 100644 index 00000000..4d5e3cc6 --- /dev/null +++ b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css @@ -0,0 +1,28 @@ +.files_container { + margin: 0; + margin-top: 10px; + background-color: var(--extreme-black); + font-size: 14px; + width: 100%; + padding: 15px; + border-radius: 6px; + box-sizing: border-box; +} + +.header { + margin-bottom: 10px; + display: flex; +} + +.files { + display: flex; +} + +.left { + color: var(--dark-gray4); + margin-right: 20px; +} + +.element:not(:first-child) { + margin-top: 10px; +} diff --git a/src/ui/StartScreen/SmartContainer/SmartContainer.jsx b/src/ui/StartScreen/SmartContainer/SmartContainer.jsx new file mode 100644 index 00000000..a5b36a5f --- /dev/null +++ b/src/ui/StartScreen/SmartContainer/SmartContainer.jsx @@ -0,0 +1,95 @@ +import React from 'react'; +import RecentlyFiles from '../RecentlyFiles/RecentlyFiles'; +import { UIButton } from '../../Button/Button'; + +import { connect } from 'react-redux'; +import css from './SmartContainer.module.css'; +import { SVG } from '../../Button/SVG'; +import UiModalDemo from '../../Modals/ModalDemo'; +import UiModalWindowCenterWidth from '../../Modals/UiModalWinCW'; +import FileReader from '../../../engine/loaders/FileReader'; +import { UiSaveMenu } from '../../OpenFile/UiSaveMenu'; +import { UiReportMenu } from '../../OpenFile/UiReportMenu'; +import UIModalUrl from '../../Modals/ModalUrl'; + +const IMG_DROPZONE_SIZE = 49; + +// This component cannot be refactor to FC yet, as we need to extend it from FileReader for now +class SmartContainer extends FileReader { + constructor(props) { + super(props); + this.state = { + windowDimensions: this.getWindowDimensions(), + }; + this.handleResize = this.handleResize.bind(this); + } + + getWindowDimensions() { + const { innerWidth: width, innerHeight: height } = window; + return { + width, + height, + }; + } + + componentDidMount() { + window.addEventListener('resize', this.handleResize); + } + + componentWillUnmount() { + window.removeEventListener('resize', this.handleResize); + } + + handleResize() { + this.setState({ + windowDimensions: this.getWindowDimensions(), + }); + } + + render() { + const { windowDimensions } = this.state; + const isMobile = windowDimensions.width < 900; + + return ( +
+ {!isMobile && ( + <> + +

Drag and drop files here

+

OR

+ + )} +
+ this.onButtonOpenLocalFileClick(evt)} + cx={css.button_start_screen} + /> + + +
+ + {this.props.isLoaded && ( +
+ + +
+ )} + + {this.state.showModalUrl && ( + + )} + + {this.state.showModalDemo && ( + + )} + {this.state.showModalWindowCW && ( + + )} +
+ ); + } +} + +export default connect((store) => store)(SmartContainer); diff --git a/src/ui/StartScreen/SmartContainer/SmartContainer.module.css b/src/ui/StartScreen/SmartContainer/SmartContainer.module.css new file mode 100644 index 00000000..e759ac24 --- /dev/null +++ b/src/ui/StartScreen/SmartContainer/SmartContainer.module.css @@ -0,0 +1,40 @@ +.smart_container { + margin: 0 15px; + padding: 35px 15px 15px; + background-color: var(--black); + border: 2px dashed var(--red); + border-radius: 8px; + display: flex; + flex-direction: column; + align-items: center; +} + +.buttons_toolbar { + display: flex; + justify-content: space-between; +} + +.button_start_screen { + display: flex; + flex-direction: column; + align-items: center; +} + +.button_start_screen svg { + margin-bottom: 5px; +} + +@media screen and (min-width: 768px) { + .smart_container { + margin: 0; + } + + .button_start_screen { + flex-direction: row; + } + + .button_start_screen svg { + margin-right: 5px; + margin-bottom: 0; + } +} diff --git a/src/ui/StartScreen/StartScreen.jsx b/src/ui/StartScreen/StartScreen.jsx new file mode 100644 index 00000000..2b887154 --- /dev/null +++ b/src/ui/StartScreen/StartScreen.jsx @@ -0,0 +1,24 @@ +import React from 'react'; +import css from './StartScreen.module.css'; +import SmartContainer from './SmartContainer/SmartContainer'; +import { SVG } from '../Button/SVG'; +import { GithubLink } from '../GithubLink/GithubLink'; + +const StartScreen = () => { + return ( +
+ +

MRI Viewer

+
+ +

Open Source 2D/3D viewer developed by EPAM Systems. Supports DICOM, NIFTI, KTX, HDR.

+
+ +
+ +
+
+ ); +}; + +export default StartScreen; diff --git a/src/ui/StartScreen/StartScreen.module.css b/src/ui/StartScreen/StartScreen.module.css new file mode 100644 index 00000000..c2ca3472 --- /dev/null +++ b/src/ui/StartScreen/StartScreen.module.css @@ -0,0 +1,55 @@ +.screen { + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; + height: 100%; +} + +.header_text { + margin: 0; + margin-top: 40px; + font-weight: 400; + font-size: 30px; + line-height: 36.31px; + color: var(--white); +} + +.subheader { + margin: 0; + display: flex; + flex-direction: column-reverse; + align-items: center; + justify-content: center; +} + +.subheader_text { + margin: 0; + margin-bottom: 10px; + opacity: 0.6; + font-size: 14px; + line-height: 36.31px; + font-weight: 400; + text-align: center; + color: var(--white); +} + +.github_link { + margin-right: 10px; +} + +.container { + margin-top: 30px; +} + +@media screen and (min-width: 768px) { + .subheader { + flex-direction: row; + } + + .subheader_text { + margin: 0; + margin-left: 10px; + text-align: left; + } +} diff --git a/src/ui/Toolbars/FullScreen.jsx b/src/ui/Toolbars/FullScreen.jsx new file mode 100644 index 00000000..f999b077 --- /dev/null +++ b/src/ui/Toolbars/FullScreen.jsx @@ -0,0 +1,22 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; + +import { Container } from '../Layout/Container'; +import { UIButton } from '../Button/Button'; +import { Tooltip } from '../Tooltip/Tooltip'; + +const FullScreen = ({ isFullMode, handler }) => { + return ( + + + + + + ); +}; + +export default FullScreen; diff --git a/src/ui/Tooltip/Tooltip.jsx b/src/ui/Tooltip/Tooltip.jsx new file mode 100644 index 00000000..06720d10 --- /dev/null +++ b/src/ui/Tooltip/Tooltip.jsx @@ -0,0 +1,41 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useCallback, useState } from 'react'; +import { usePopper } from 'react-popper'; + +import css from './Tooltip.module.css'; + +export const Tooltip = ({ children, content, placement = 'bottom' }) => { + const [isOpen, setIsOpen] = useState(false); + const [refEl, setRefEl] = useState(null); + const [popperEl, setPopperEl] = useState(null); + const [arrowEl, setArrowEl] = useState(null); + + const { styles, attributes } = usePopper(refEl, popperEl, { + modifiers: [ + { name: 'offset', enabled: true, options: { offset: [0, 10] } }, + { name: 'arrow', options: { element: arrowEl } }, + ], + placement, + }); + + const hide = useCallback(() => setIsOpen(false), []); + const show = useCallback(() => setIsOpen(true), []); + + return ( + <> +
+ {children} +
+ {isOpen && ( +
+
{content}
+
+
+ )} + + ); +}; diff --git a/src/ui/Tooltip/Tooltip.module.css b/src/ui/Tooltip/Tooltip.module.css new file mode 100644 index 00000000..cfd17829 --- /dev/null +++ b/src/ui/Tooltip/Tooltip.module.css @@ -0,0 +1,59 @@ +/*! + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.wrapper { + display: inline-block; +} + +.tooltip { + display: flex; + z-index: 1000; + border-radius: 5px; + box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.14); + padding: 10px 15px; + background-color: var(--dark-gray2); + opacity: 0.98; +} + +.body { + font-size: 16px; + line-height: 20px; + color: var(--white); + white-space: pre; +} + +.arrow, +.arrow:before { + position: absolute; + background: var(--dark-gray2); + width: 15px; + height: 15px; +} + +.arrow { + visibility: hidden; +} + +.arrow::before { + visibility: visible; + content: ''; + transform: rotate(45deg); +} + +.tooltip[data-popper-placement^='top']>.arrow { + bottom: -6px; +} + +.tooltip[data-popper-placement^='bottom']>.arrow { + top: -6px; +} + +.tooltip[data-popper-placement^='left']>.arrow { + right: -6px; +} + +.tooltip[data-popper-placement^='right']>.arrow { + left: -6px; +} \ No newline at end of file diff --git a/src/ui/Tooltip/atoms/MuiStyledTooltip.jsx b/src/ui/Tooltip/atoms/MuiStyledTooltip.jsx new file mode 100644 index 00000000..1a379ddd --- /dev/null +++ b/src/ui/Tooltip/atoms/MuiStyledTooltip.jsx @@ -0,0 +1,21 @@ +import React from 'react'; +import Tooltip, { tooltipClasses } from '@mui/material/Tooltip'; +import { styled } from '@mui/material/styles'; + +export const MuiStyledTooltip = styled(({ className, ...props }) => )(() => ({ + [`& .${tooltipClasses.tooltip}`]: { + display: 'inline-block', + maxWidth: 500, + zIndex: 1000, + borderRadius: '5px', + boxShadow: '0 0 8px 0 rgba(0, 0, 0, 0.14)', + padding: '10px 15px', + backgroundColor: '#46494e', + opacity: 0.98, + fontSize: '16px', + lineHeight: '20px', + color: 'white', + whiteSpace: 'pre', + fontFamily: "'Inter', 'sans-serif'", + }, +})); diff --git a/src/ui/TopToolbar/ExploreTools.jsx b/src/ui/TopToolbar/ExploreTools.jsx new file mode 100644 index 00000000..69a3f609 --- /dev/null +++ b/src/ui/TopToolbar/ExploreTools.jsx @@ -0,0 +1,103 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useState } from 'react'; + +import { Container } from '../Layout/Container'; +import { buttonsBuilder } from '../Button/Button'; +import Tools2dType from '../../engine/tools2d/ToolTypes'; +import StoreActionType from '../../store/ActionTypes'; +import { connect } from 'react-redux'; + +const ExploreTools = (props) => { + const [activeButton, setActiveButton] = useState(Tools2dType.ZOOM_100); + + const mediator = (buttonId) => { + setActiveButton(buttonId); + console.log(`${buttonId} button clicked`); + props.dispatch({ type: StoreActionType.SET_2D_TOOLS_INDEX, indexTools2d: buttonId }); + + if (buttonId === Tools2dType.ZOOM_100) { + props.dispatch({ type: StoreActionType.SET_2D_ZOOM, render2dZoom: 1.0 }); + props.dispatch({ type: StoreActionType.SET_2D_X_POS, render2dxPos: 0.0 }); + props.dispatch({ type: StoreActionType.SET_2D_Y_POS, render2dyPos: 0.0 }); + + props.graphics2d.forceUpdate(); + props.graphics2d.forceRender(); + } + + if (buttonId === Tools2dType.CLEAR) { + const gra2d = props.graphics2d; + gra2d.clear(); + } + }; + + const buttons = [ + { + id: Tools2dType.NONE, + icon: 'cursor', + caption: 'Explore model', + handler: mediator.bind(null, Tools2dType.NONE), + }, + { + icon: 'target', + caption: 'Get voxel intensity', + handler: mediator.bind(null, Tools2dType.INTENSITY), + id: Tools2dType.INTENSITY, + }, + { + icon: 'line', + caption: 'Measure distance between voxels', + handler: mediator.bind(null, Tools2dType.DISTANCE), + id: Tools2dType.DISTANCE, + }, + { + icon: 'angle', + caption: 'Measure angle between voxels', + handler: mediator.bind(null, Tools2dType.ANGLE), + id: Tools2dType.ANGLE, + }, + { + icon: 'area', + caption: 'Calculate arbitrary area', + handler: mediator.bind(null, Tools2dType.AREA), + id: Tools2dType.AREA, + }, + { + icon: 'square', + caption: 'Calculate rectangular area', + handler: mediator.bind(null, Tools2dType.RECT), + id: Tools2dType.RECT, + }, + { + icon: 'T', + caption: 'Add annotation text', + handler: mediator.bind(null, Tools2dType.TEXT), + id: Tools2dType.TEXT, + }, + { + icon: 'edit', + caption: 'Move annotation text', + handler: mediator.bind(null, Tools2dType.EDIT), + id: Tools2dType.EDIT, + }, + { + icon: 'clear', + caption: 'Clear all objects', + handler: mediator.bind(null, Tools2dType.CLEAR), + id: Tools2dType.CLEAR, + }, + { + icon: 'eraser', + caption: 'Delete annotation object', + handler: mediator.bind(null, Tools2dType.DELETE), + id: Tools2dType.DELETE, + }, + ]; + + return {buttonsBuilder(buttons, { activeButton })}; +}; + +export default connect((store) => store)(ExploreTools); diff --git a/src/ui/TopToolbar/Filter/BilateralTool.jsx b/src/ui/TopToolbar/Filter/BilateralTool.jsx new file mode 100644 index 00000000..448d5225 --- /dev/null +++ b/src/ui/TopToolbar/Filter/BilateralTool.jsx @@ -0,0 +1,27 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useState } from 'react'; +import { ToolButton } from '../ToolButton'; +import UiModalBilateral from '../../Modals/UiModalBilateral'; + +export const BilateralTool = () => { + const [showModal, setShowModal] = useState(false); + + const hideModal = () => { + setShowModal(false); + }; + + const handleChange = () => { + setShowModal(true); + }; + + return ( + <> + + {showModal && } + + ); +}; diff --git a/src/ui/TopToolbar/Filter/DetectBrainTool.jsx b/src/ui/TopToolbar/Filter/DetectBrainTool.jsx new file mode 100644 index 00000000..da2dd283 --- /dev/null +++ b/src/ui/TopToolbar/Filter/DetectBrainTool.jsx @@ -0,0 +1,40 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { ToolButton } from '../ToolButton'; +import { useAppContext } from '../../App/AppContext'; +import { checkVolume } from './checkVolume'; +import { detectBrainJob } from './Jobs/detectBrainJob'; +import StoreActionType from '../../../store/ActionTypes'; +import ViewMode from '../../../store/ViewMode'; +import Modes3d from '../../../store/Modes3d'; + +export const DetectBrainTool = () => { + const dispatch = useDispatch(); + const { startJob } = useAppContext(); + const { volumeSet, volumeIndex, graphics2d } = useSelector((state) => state); + + const volume = volumeSet.getVolume(volumeIndex); + + const handleChange = () => { + if (!checkVolume(volume)) { + return; + } + + startJob(detectBrainJob(volume), () => { + dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: volumeSet }); + dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); + dispatch({ type: StoreActionType.SET_MODE_VIEW, viewMode: ViewMode.VIEW_2D }); + dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); + + // update render + graphics2d.forceUpdate(); + }); + }; + + return ; +}; diff --git a/src/ui/TopToolbar/Filter/Jobs/detectBrainJob.js b/src/ui/TopToolbar/Filter/Jobs/detectBrainJob.js new file mode 100644 index 00000000..98f1c693 --- /dev/null +++ b/src/ui/TopToolbar/Filter/Jobs/detectBrainJob.js @@ -0,0 +1,63 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import ActiveVolume from '../../../../engine/actvolume/actvol'; + +export const detectBrainJob = (volume) => { + let xDim = volume.m_xDim; + let yDim = volume.m_yDim; + let zDim = volume.m_zDim; + let volTexSrc = volume.m_dataArray; + const xyzDim = xDim * yDim * zDim; + const volTextureDst = new Uint8Array(xyzDim); + let progress = 0; + let actVolume = null; + let geoRender = null; + + const setProgress = (value) => { + progress = value; + }; + const getProgress = () => progress; + + const run = () => { + if (getProgress() === 0) { + const NEED_LOG = true; + const CREATE_TYPE = ActiveVolume.REMOVE_SKULL; + actVolume = new ActiveVolume(); + + geoRender = actVolume.skullRemoveStart(xDim, yDim, zDim, volTexSrc, volTextureDst, CREATE_TYPE, NEED_LOG); + + setProgress(2); + return false; + } + + if (getProgress() > 0) { + const { m_updateCounter, m_numPredSteps } = actVolume; + + let ratioUpdate = m_updateCounter / m_numPredSteps; + ratioUpdate = ratioUpdate < 1.0 ? ratioUpdate : 1.0; + ratioUpdate *= 100; + let currentProgress = ratioUpdate < 2 ? 2 : ratioUpdate; + + setProgress(currentProgress); + + const isFinished = actVolume.skullRemoveUpdate(geoRender); + if (isFinished) { + actVolume.skullRemoveStop(geoRender); + + // perform finalize skull remove + volume.m_dataArray = actVolume.m_volTexDst; + + setProgress(0); + return true; + } + return false; + } + + return true; + }; + + return { run, getProgress }; +}; diff --git a/src/ui/TopToolbar/Filter/Jobs/lungsFillJob.js b/src/ui/TopToolbar/Filter/Jobs/lungsFillJob.js new file mode 100644 index 00000000..7a83edf7 --- /dev/null +++ b/src/ui/TopToolbar/Filter/Jobs/lungsFillJob.js @@ -0,0 +1,268 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import SeedPoints from '../../../../engine/actvolume/lungsfill/seedPoints'; +import FloodFillTool from '../../../../engine/actvolume/lungsfill/floodfill'; + +const getSeedPointOnCentralSlice = (volTexSrc, xDim, yDim, zDim) => { + let vSeed = { x: 0, y: 0, z: 0 }; + const seedPoints = new SeedPoints(volTexSrc, xDim, yDim, zDim); + const resFind = seedPoints.findSeedPointOnCentralSlice(vSeed); + if (resFind) { + console.log('Lungs Central fill run: seed point not found'); + return false; + } + return vSeed; +}; + +const getSeedPointOnFirstSlice = (volTexSrc, xDim, yDim, zDim) => { + let vSeed = { x: 0, y: 0, z: 0 }; + const seedPoints = new SeedPoints(volTexSrc, xDim, yDim, zDim); + const resFind = seedPoints.findSeedPointOnFirstSlice(vSeed); + if (resFind) { + console.log('Airway fill run: seed point not found'); + return false; + } + return vSeed; +}; + +const copyFilled = (volTexMask, xyzDim) => { + for (let x = 0; x < xyzDim; x++) { + volTexMask[x] = volTexMask[x] === 255 ? 255 : 0; + } +}; + +const floodFill = (xDim, yDim, zDim, texMask, vSeed, threshold) => { + const fillTool = new FloodFillTool(); + fillTool.floodFill3dThreshold(xDim, yDim, zDim, texMask, vSeed, threshold); +}; + +const detectNonEmptyBox = (xDim, yDim, zDim, volTexMask) => { + const MIN_VAL_BARRIER = 8; + const xDimHalf = Math.floor(xDim / 2); + const yDimHalf = Math.floor(yDim / 2); + const xyDim = xDim * yDim; + + const checkIsEmptyPlane = (x, y, isReturnX = true) => { + for (let z = 0; z < zDim; z++) { + const off = z * xyDim + y * xDim + x; + if (volTexMask[off] > MIN_VAL_BARRIER) { + return isReturnX ? x : y; + } + } + return false; + }; + + const getXBorderMin = () => { + for (let x = 0; x < xDimHalf; x++) { + for (let y = 0; y < yDim; y++) { + const res = checkIsEmptyPlane(x, y, true); + if (res) { + return res; + } + } + } + return xDimHalf - 1; + }; + + const getXBorderMax = () => { + for (let x = xDim - 1; x > xDimHalf; x--) { + for (let y = 0; y < yDim; y++) { + const res = checkIsEmptyPlane(x, y, true); + if (res) { + return res; + } + } + } + return xDimHalf + 1; + }; + + const getYBorderMin = () => { + for (let y = 0; y < yDimHalf; y++) { + for (let x = 0; x < xDim; x++) { + const res = checkIsEmptyPlane(x, y, false); + if (res) { + return res; + } + } + } + return yDimHalf - 1; + }; + + const getYBorderMax = () => { + for (let y = yDim - 1; y > yDimHalf; y--) { + for (let x = 0; x < xDim; x++) { + const res = checkIsEmptyPlane(x, y, false); + if (res) { + return res; + } + } + } + return yDimHalf + 1; + }; + + const xBorderMin = getXBorderMin(); + const xBorderMax = getXBorderMax(); + + const yBorderMin = getYBorderMin(); + const yBorderMax = getYBorderMax(); + return { xBorderMin, xBorderMax, yBorderMin, yBorderMax }; +}; + +export const lungsFillJob = (volume) => { + let xDim = volume.m_xDim; + let yDim = volume.m_yDim; + let zDim = volume.m_zDim; + let volTexSrc = volume.m_dataArray; + let volTexMask = new Uint8Array(xDim * yDim * zDim); + let volTexMask1 = new Uint8Array(xDim * yDim * zDim); + let volTexMask2 = new Uint8Array(xDim * yDim * zDim); + const xyzDim = xDim * yDim * zDim; + let seedOnCentralSlice = null; + let seedOnFirstSlice = null; + let minv = 0; + let progress = 0; + + const setProgress = (value) => { + progress = value; + }; + const getProgress = () => progress; + + const delatation = (boxBorder) => { + const { xBorderMin, xBorderMax, yBorderMin, yBorderMax } = boxBorder; + + let x, y, z; + let x1, y1, z1; + let zOff = 0; + let yOff = 0; + let count = 0; + for (z = 0; z < zDim; z++) { + for (y = yBorderMin; y < yBorderMax; y++) { + for (x = xBorderMin; x < xBorderMax; x++) { + count = 0; + for (z1 = -1; z1 < 2; z1++) { + zOff = (z + z1) * xDim * yDim; + for (y1 = -1; y1 < 2; y1++) { + yOff = (y + y1) * xDim; + for (x1 = -1; x1 < 2; x1++) { + if (volTexMask[x + x1 + yOff + zOff] === 255) { + count++; + } + } + } + } + volTexMask1[x + y * xDim + z * xDim * yDim] = count > 0 ? 255 : 0; + } + } + } + }; + + const erosion = (boxBorder) => { + const { xBorderMin, xBorderMax, yBorderMin, yBorderMax } = boxBorder; + + let x, y, z; + let x1, y1, z1; + let zOff = 0; + let yOff = 0; + let off = 0; + let count = 0; + for (z = 0; z < zDim; z++) { + for (y = yBorderMin; y < yBorderMax; y++) { + for (x = xBorderMin; x < xBorderMax; x++) { + off = x + y * xDim + z * xDim * yDim; + volTexMask2[off] = volTexMask1[off]; + if (volTexMask1[off] !== volTexMask[off]) { + count = 0; + for (z1 = -1; z1 < 2; z1++) { + zOff = (z + z1) * xDim * yDim; + for (y1 = -1; y1 < 2; y1++) { + yOff = (y + y1) * xDim; + for (x1 = -1; x1 < 2; x1++) { + if (volTexMask1[x + x1 + yOff + zOff] === 0) { + count++; + } + } + } + } + if (count > 0) { + volTexMask2[off] = 0; + } + } + } + } + } + }; + + const run = () => { + if (getProgress() === 0) { + seedOnCentralSlice = getSeedPointOnCentralSlice(volTexSrc, xDim, yDim, zDim); + if (!seedOnCentralSlice) { + setProgress(0); + return true; + } + // copy dst volume before fill + for (let i = 0; i < xyzDim; i++) { + volTexMask[i] = volTexSrc[i]; + } + setProgress(20); + return false; + } + + if (getProgress() === 20) { + floodFill(xDim, yDim, zDim, volTexMask, seedOnCentralSlice, 40); + setProgress(50); + return false; + } + + if (getProgress() === 50) { + copyFilled(volTexMask, xyzDim); + setProgress(80); + return false; + } + + if (getProgress() === 80) { + const boxBorder = detectNonEmptyBox(xDim, yDim, zDim, volTexMask); + delatation(boxBorder); + erosion(boxBorder); + + for (let i = 0; i < xyzDim; i++) { + volTexMask1[i] = volTexSrc[i]; + } + + seedOnFirstSlice = getSeedPointOnFirstSlice(volTexSrc, xDim, yDim, zDim); + if (!seedOnFirstSlice) { + setProgress(0); + return true; + } + + minv = seedOnFirstSlice.z; + seedOnFirstSlice.z = 2; + console.log(`Airway fill run: seed point: ${seedOnFirstSlice.x} ${seedOnFirstSlice.y} ${seedOnFirstSlice}`); + + setProgress(90); + return false; + } + + if (getProgress() === 90) { + floodFill(xDim, yDim, zDim, volTexMask1, seedOnFirstSlice, minv); + + const HALF = 128.0; + for (let x = 0; x < xyzDim; x++) { + let val = 0.5 * volTexMask[x]; + if (volTexMask2[x] - volTexMask[x] === 255) { + val = HALF + volTexSrc[x]; + } + if (volTexMask1[x] === 255) { + val = 255; + } + volTexSrc[x] = val; + } + setProgress(0); + } + + return true; + }; + return { run, getProgress }; +}; diff --git a/src/ui/TopToolbar/Filter/Jobs/lungsFillJob.test.js b/src/ui/TopToolbar/Filter/Jobs/lungsFillJob.test.js new file mode 100644 index 00000000..f4092d11 --- /dev/null +++ b/src/ui/TopToolbar/Filter/Jobs/lungsFillJob.test.js @@ -0,0 +1,36 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import { lungsFillJob } from './lungsFillJob'; +jest.mock('../../../../engine/actvolume/lungsfill/seedPoints', () => { + return function () { + return { + findSeedPointOnCentralSlice: jest.fn(() => false), + findSeedPointOnFirstSlice: jest.fn(() => false), + }; + }; +}); + +describe('Test lungsFillJob', () => { + it('should run job', () => { + const job = lungsFillJob({ m_xDim: 0, m_yDim: 0, m_zDim: 0, m_dataArray: [] }); + expect(job.getProgress()).toBe(0); + + expect(job.run()).toBe(false); + expect(job.getProgress()).toBe(20); + + expect(job.run()).toBe(false); + expect(job.getProgress()).toBe(50); + + expect(job.run()).toBe(false); + expect(job.getProgress()).toBe(80); + + expect(job.run()).toBe(false); + expect(job.getProgress()).toBe(90); + + expect(job.run()).toBe(true); + expect(job.getProgress()).toBe(0); + }); +}); diff --git a/src/ui/TopToolbar/Filter/Jobs/sobelJob.js b/src/ui/TopToolbar/Filter/Jobs/sobelJob.js new file mode 100644 index 00000000..4ef253c4 --- /dev/null +++ b/src/ui/TopToolbar/Filter/Jobs/sobelJob.js @@ -0,0 +1,62 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import SobelEdgeDetector from '../../../../engine/imgproc/Sobel'; + +export const sobelJob = (volume) => { + let xDim = volume.m_xDim; + let yDim = volume.m_yDim; + let zDim = volume.m_zDim; + const xyzDim = xDim * yDim * zDim; + let progress = 0; + + const sobel = new SobelEdgeDetector(); + + const setProgress = (value) => { + progress = value; + }; + const getProgress = () => progress; + + const run = () => { + if (getProgress() === 0) { + sobel.start(volume); + + setProgress(2); + return false; + } + + if (getProgress() > 0) { + sobel.update(); + + let ratioUpdate = sobel.getRatio(); + ratioUpdate = ratioUpdate < 1.0 ? ratioUpdate : 1.0; + ratioUpdate *= 100; + let currentProgress = ratioUpdate < 2 ? 2 : Math.floor(ratioUpdate); + + setProgress(currentProgress); + + const isFinished = sobel.isFinished(); + + if (isFinished) { + sobel.normalizeDstImage(); + + // copy result pixels into source + const pixelsDst = sobel.getPixelsDst(); + for (let i = 0; i < xyzDim; i++) { + volume.m_dataArray[i] = Math.floor(pixelsDst[i]); + } + sobel.stop(); + + setProgress(0); + return true; + } + return false; + } + + return true; + }; + + return { run, getProgress }; +}; diff --git a/src/ui/TopToolbar/Filter/LungsTool.jsx b/src/ui/TopToolbar/Filter/LungsTool.jsx new file mode 100644 index 00000000..271f913d --- /dev/null +++ b/src/ui/TopToolbar/Filter/LungsTool.jsx @@ -0,0 +1,31 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { useSelector } from 'react-redux'; +import { ToolButton } from '../ToolButton'; +import { checkVolume } from './checkVolume'; +import { useAppContext } from '../../App/AppContext'; +import { lungsFillJob } from './Jobs/lungsFillJob'; + +export const LungsTool = () => { + const { startJob } = useAppContext(); + const { volumeSet, volumeIndex, graphics2d } = useSelector((state) => state); + + const volume = volumeSet.getVolume(volumeIndex); + + const handleChange = () => { + if (!checkVolume(volume)) { + return; + } + + startJob(lungsFillJob(volume), () => { + // update render + graphics2d.forceUpdate(); + }); + }; + + return ; +}; diff --git a/src/ui/TopToolbar/Filter/LungsTool.test.jsx b/src/ui/TopToolbar/Filter/LungsTool.test.jsx new file mode 100644 index 00000000..12fab735 --- /dev/null +++ b/src/ui/TopToolbar/Filter/LungsTool.test.jsx @@ -0,0 +1,45 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { renderWithState } from '../../../utils/configureTest'; +import { AppContextProvider } from '../../App/AppContext'; +import { LungsTool } from './LungsTool'; +import VolumeSet from '../../../engine/VolumeSet'; +import Volume from '../../../engine/Volume'; +import { fireEvent, screen } from '@testing-library/react'; +import { ToolbarContextProvider } from '../ToolbarContext'; + +jest.mock('./Jobs/lungsFillJob', () => ({ lungsFillJob: jest.fn(() => ({ run: () => true, getProgress: () => 0 })) })); +jest.useFakeTimers(); +jest.spyOn(global, 'setInterval'); + +describe('Test LungsTool', () => { + it('should render', async () => { + const forceUpdate = jest.fn(); + const volumeSet = new VolumeSet(); + const volume = new Volume(); + volume.createEmptyBytesVolume(16, 16, 16); + volumeSet.addVolume(volume); + + renderWithState( + + + + + , + { volumeSet: volumeSet, volumeIndex: 0, graphics2d: { forceUpdate: forceUpdate } } + ); + + expect(forceUpdate).toBeCalledTimes(0); + fireEvent.click(screen.getByRole('button')); + + await expect(setInterval).toHaveBeenCalledTimes(1); + + jest.runOnlyPendingTimers(); + + expect(forceUpdate).toBeCalledTimes(1); + }); +}); diff --git a/src/ui/TopToolbar/Filter/SobelTool.jsx b/src/ui/TopToolbar/Filter/SobelTool.jsx new file mode 100644 index 00000000..204e0fd1 --- /dev/null +++ b/src/ui/TopToolbar/Filter/SobelTool.jsx @@ -0,0 +1,40 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { ToolButton } from '../ToolButton'; +import { useAppContext } from '../../App/AppContext'; +import { checkVolume } from './checkVolume'; +import StoreActionType from '../../../store/ActionTypes'; +import ViewMode from '../../../store/ViewMode'; +import Modes3d from '../../../store/Modes3d'; +import { sobelJob } from './Jobs/sobelJob'; + +export const SobelTool = () => { + const dispatch = useDispatch(); + const { startJob } = useAppContext(); + const { volumeSet, volumeIndex, graphics2d } = useSelector((state) => state); + + const volume = volumeSet.getVolume(volumeIndex); + + const handleChange = () => { + if (!checkVolume(volume)) { + return; + } + + startJob(sobelJob(volume), () => { + dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: volumeSet }); + dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); + dispatch({ type: StoreActionType.SET_MODE_VIEW, viewMode: ViewMode.VIEW_2D }); + dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); + + // update render + graphics2d.forceUpdate(); + }); + }; + + return ; +}; diff --git a/src/ui/TopToolbar/Filter/checkVolume.js b/src/ui/TopToolbar/Filter/checkVolume.js new file mode 100644 index 00000000..c7e904dc --- /dev/null +++ b/src/ui/TopToolbar/Filter/checkVolume.js @@ -0,0 +1,22 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +export const checkVolume = (volume) => { + if (volume === undefined || volume === null) { + console.log('onButtonDetectBrain: no volume!'); + return false; + } + const { m_xDim, m_yDim, m_zDim } = volume; + if (m_xDim * m_yDim * m_zDim < 1) { + console.log(`onButtonDetectBrain: bad volume! dims = ${m_xDim}*${m_yDim}*${m_zDim}`); + return false; + } + const ONE = 1; + if (volume.m_bytesPerVoxel !== ONE) { + console.log('onButtonDetectBrain: supported only 1bpp volumes'); + return false; + } + return true; +}; diff --git a/src/ui/TopToolbar/FilterTools.jsx b/src/ui/TopToolbar/FilterTools.jsx new file mode 100644 index 00000000..5a683b01 --- /dev/null +++ b/src/ui/TopToolbar/FilterTools.jsx @@ -0,0 +1,26 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; + +import { Container } from '../Layout/Container'; +import { LungsTool } from './Filter/LungsTool'; +import { DetectBrainTool } from './Filter/DetectBrainTool'; +import { ToolbarContextProvider } from './ToolbarContext'; +import { SobelTool } from './Filter/SobelTool'; +import { BilateralTool } from './Filter/BilateralTool'; + +export const FilterTools = () => { + return ( + + + + + + + + + ); +}; diff --git a/src/ui/TopToolbar/ToolButton.jsx b/src/ui/TopToolbar/ToolButton.jsx new file mode 100644 index 00000000..d1f65ca7 --- /dev/null +++ b/src/ui/TopToolbar/ToolButton.jsx @@ -0,0 +1,27 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { UIButton } from '../Button/Button'; +import { Tooltip } from '../Tooltip/Tooltip'; +import { useToolbarContext } from './ToolbarContext'; + +export const ToolButton = (props) => { + const { onChange, content, icon } = props; + const { activeTool, setActiveTool } = useToolbarContext(); + + const handleChange = () => { + setActiveTool(icon); + onChange(); + }; + + return ( + <> + + + + + ); +}; diff --git a/src/ui/TopToolbar/ToolbarContext.jsx b/src/ui/TopToolbar/ToolbarContext.jsx new file mode 100644 index 00000000..fbd9502b --- /dev/null +++ b/src/ui/TopToolbar/ToolbarContext.jsx @@ -0,0 +1,23 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import React, { useContext, useState } from 'react'; + +const ToolbarContext = React.createContext(null); +export const ToolbarContextProvider = ({ children }) => { + const [activeTool, setActiveTool] = useState(null); + const value = { activeTool, setActiveTool }; + return {children}; +}; + +export const useToolbarContext = () => { + const context = useContext(ToolbarContext); + const contextName = 'ToolbarContext'; + + if (!context) { + throw new Error(`Used outside of "${contextName}"`); + } + + return context; +}; diff --git a/src/ui/TopToolbar/TopToolbar.jsx b/src/ui/TopToolbar/TopToolbar.jsx new file mode 100644 index 00000000..5927434d --- /dev/null +++ b/src/ui/TopToolbar/TopToolbar.jsx @@ -0,0 +1,22 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { useSelector } from 'react-redux'; + +import ModeView from '../../store/ViewMode'; +import ExploreTools from './ExploreTools'; +import { FilterTools } from './FilterTools'; + +export const TopToolbar = () => { + const { viewMode } = useSelector((state) => state); + + return ( + <> + {viewMode === ModeView.VIEW_2D && } + {viewMode === ModeView.VIEW_2D && } + + ); +}; diff --git a/src/ui/UiCtrl3dLight.module.css b/src/ui/UiCtrl3dLight.module.css new file mode 100644 index 00000000..b93c7848 --- /dev/null +++ b/src/ui/UiCtrl3dLight.module.css @@ -0,0 +1,11 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +.container { + display: flex; + flex-direction: column; + gap: 10px; + margin-bottom: 7px; +} diff --git a/src/ui/UiErrConsole.js b/src/ui/UiErrConsole.js new file mode 100644 index 00000000..3ddf1e86 --- /dev/null +++ b/src/ui/UiErrConsole.js @@ -0,0 +1,31 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileOverview UiErrConsole + * @author Epam + * @version 1.0.0 + */ + +// ******************************************************** +// Imports +// ******************************************************** + +import React from 'react'; +import { connect } from 'react-redux'; + +class UiErrConsole extends React.Component { + render() { + return ( + <> + Errors during read + {this.props.arrErrors.map((d) => ( + <>{d} + ))} + + ); + } +} +export default connect((store) => store)(UiErrConsole); diff --git a/src/demo/ui/UiSkelAni.js b/src/ui/UiSkelAni.js similarity index 56% rename from src/demo/ui/UiSkelAni.js rename to src/ui/UiSkelAni.js index 34d5844a..231317b7 100644 --- a/src/demo/ui/UiSkelAni.js +++ b/src/ui/UiSkelAni.js @@ -1,39 +1,67 @@ -/** - * @fileOverview UiSkelAni - * @author Epam - * @version 1.0.0 +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 */ -// ******************************************************** -// Imports -// ******************************************************** - import React from 'react'; import { connect } from 'react-redux'; -// ******************************************************** -// Const -// ******************************************************** - -// ******************************************************** -// Class -// ******************************************************** - -/** - * Class UiSkelAni some text later... - */ class UiSkelAni extends React.Component { - /** - * @param {object} props - props from up level object - */ constructor(props) { super(props); this.animate = this.animate.bind(this); - this.m_mount = null; + this.m_mount = React.createRef(); this.m_frameId = null; + } + /** + * Transform pic coords to screen coords with current object center (xHeart, yHeart) , + * scale and mirror feature + * + * @param {*} xHeart + * @param {*} yHeart + * @param {*} scale + * @param {*} isMirroredX + * @param {*} x + * @param {*} y + * @param {*} vec + */ + static vecTransform(xHeart, yHeart, scale, isMirroredX, x, y, vec) { + const X_HEART = 178.0; + const Y_HEART = 112.0; + const xRelCenter = isMirroredX ? X_HEART - x : x - X_HEART; + const yRelCenter = y - Y_HEART; + vec.x = xHeart + xRelCenter * scale; + vec.y = yHeart + yRelCenter * scale; + } + + /** + * Draw small leave near line segment of blood vessel + * + * @param {object} ctx + * @param {number} x0 - first point, x coordinate + * @param {number} y0 - first point, y coordinate + * @param {number} x1 - second point, x coordinate + * @param {number} y1 - second point, y coordinate + * @param {number} index - index of point in set + */ + static drawLeave(ctx, x0, y0, x1, y1, index) { + const dx = x1 - x0; + const dy = y1 - y0; + const ang = (index & 1) === 0 ? (25.0 * 3.14) / 180.0 : -((25.0 * 3.14) / 180.0); + const vx = dx * Math.cos(ang) - dy * Math.sin(ang); + const vy = dx * Math.sin(ang) + dy * Math.cos(ang); + const xc = Math.floor((x0 + x1) * 0.5); + const yc = Math.floor((y0 + y1) * 0.5); + + const MULT = 0.8; + + ctx.beginPath(); + ctx.moveTo(xc, yc); + ctx.lineTo(Math.floor(xc + vx * MULT), Math.floor(yc + vy * MULT)); + ctx.stroke(); } animate() { @@ -66,17 +94,13 @@ class UiSkelAni extends React.Component { * Main component render func callback */ render() { - const strStyle = { - border: '0px solid black' - }; - const jsxAni = {this.m_mount = mount} } min-width="240px" width="240px" height="200px" /> - return jsxAni; - } // end render + return ; + } /** * Draw center part of lungs pixtre - * - * @param {object} ctx + * + * @param {object} ctx * @param {number} w - screen width * @param {number} h - screen heigth * @param {number} timeCur - current time @@ -94,11 +118,11 @@ class UiSkelAni extends React.Component { const Y_SPINE_BOT = 195.0; ctx.beginPath(); - ctx.moveTo(w2, Math.floor(h * Y_SPINE_BOT / H_REF)); - ctx.lineTo(w2, Math.floor(h * Y_SPINE_LINE_TOP / H_REF)); + ctx.moveTo(w2, Math.floor((h * Y_SPINE_BOT) / H_REF)); + ctx.lineTo(w2, Math.floor((h * Y_SPINE_LINE_TOP) / H_REF)); ctx.stroke(); - const MARK_WIDTH = w * 20.0 / W_REF; + const MARK_WIDTH = (w * 20.0) / W_REF; const NUM_SPINE_MARKS = 5; for (let i = 0; i <= NUM_SPINE_MARKS; i++) { const tHeight = i / NUM_SPINE_MARKS; @@ -106,7 +130,7 @@ class UiSkelAni extends React.Component { const TIME_MULT = 0.0008; const PHASE_MULT = 3.1415926 * 0.4; - const timeArg = timeCur * TIME_MULT + (tHeight * PHASE_MULT); + const timeArg = timeCur * TIME_MULT + tHeight * PHASE_MULT; const wCur = Math.floor(MARK_WIDTH * 0.2 + 0.8 * MARK_WIDTH * Math.cos(timeArg)); ctx.beginPath(); @@ -118,100 +142,30 @@ class UiSkelAni extends React.Component { // draw top "heart" shape const shp = [ - 112, 89, - 112, 81, - 112, 62, - 112, 49, - 113, 36, - 104, 31, - 94, 32, - 94, 20, - 96, 8, - 108, 8, - 112, 11, - 120, 12, - 128, 11, - 132, 8, - 146, 8, - 146, 20, - 146, 32, - 136, 31, - 127, 36, - 128, 49, - 128, 62, - 128, 81, - 128, 89, - 119, 88 + 112, 89, 112, 81, 112, 62, 112, 49, 113, 36, 104, 31, 94, 32, 94, 20, 96, 8, 108, 8, 112, 11, 120, 12, 128, 11, 132, 8, 146, 8, 146, + 20, 146, 32, 136, 31, 127, 36, 128, 49, 128, 62, 128, 81, 128, 89, 119, 88, ]; const numPointsInShape = Math.floor(shp.length / 2); const numCurves2nd = Math.floor(numPointsInShape / 2); - ctx.fillStyle = 'rgb(255, 210, 210)'; + ctx.fillStyle = 'rgb(255, 255, 255)'; ctx.beginPath(); - ctx.moveTo(w2, Math.floor(h * Y_SPINE_LINE_TOP / H_REF)); + ctx.moveTo(w2, Math.floor((h * Y_SPINE_LINE_TOP) / H_REF)); let j = 0; for (let s = 0; s < numCurves2nd; s++, j += 4) { - const x1 = Math.floor(w * shp[j + 0] / W_REF); - const y1 = Math.floor(h * shp[j + 1] / H_REF); - const x2 = Math.floor(w * shp[j + 2] / W_REF); - const y2 = Math.floor(h * shp[j + 3] / H_REF); + const x1 = Math.floor((w * shp[j + 0]) / W_REF); + const y1 = Math.floor((h * shp[j + 1]) / H_REF); + const x2 = Math.floor((w * shp[j + 2]) / W_REF); + const y2 = Math.floor((h * shp[j + 3]) / H_REF); ctx.quadraticCurveTo(x1, y1, x2, y2); } ctx.stroke(); ctx.fill(); } // draw central - /** - * Transform pic coords to screen coords with current object center (xHeart, yHeart) , - * scale and mirror feature - * - * @param {*} xHeart - * @param {*} yHeart - * @param {*} scale - * @param {*} isMirroredX - * @param {*} x - * @param {*} y - * @param {*} vec - */ - static vecTransform(xHeart, yHeart, scale, isMirroredX, x, y, vec) { - const X_HEART = 178.0; - const Y_HEART = 112.0; - const xRelCenter = (isMirroredX) ? (X_HEART - x) : (x - X_HEART); - const yRelCenter = (y - Y_HEART); - vec.x = xHeart + (xRelCenter * scale); - vec.y = yHeart + (yRelCenter * scale); - } - - /** - * Draw small leave near line segment of blood vessel - * - * @param {object} ctx - * @param {number} x0 - first point, x coordinate - * @param {number} y0 - first point, y coordinate - * @param {number} x1 - second point, x coordinate - * @param {number} y1 - second point, y coordinate - * @param {number} index - index of point in set - */ - static drawLeave(ctx, x0, y0, x1, y1, index) { - const dx = x1 - x0; - const dy = y1 - y0; - const ang = ((index & 1) === 0) ? (25.0 * 3.14 / 180.0) : -(25.0 * 3.14 / 180.0); - const vx = dx * Math.cos(ang) - dy * Math.sin(ang); - const vy = dx * Math.sin(ang) + dy * Math.cos(ang); - const xc = Math.floor((x0 + x1) * 0.5); - const yc = Math.floor((y0 + y1) * 0.5); - - const MULT = 0.8; - - ctx.beginPath(); - ctx.moveTo(xc, yc); - ctx.lineTo(Math.floor(xc + vx * MULT), Math.floor(yc + vy * MULT)); - ctx.stroke(); - } - /** * Render single heart - * + * * @param {object} ctx - context to render 2d * @param {number} w - screen width * @param {number} h - screen height @@ -225,40 +179,19 @@ class UiSkelAni extends React.Component { const W_REF = 240.0; const H_REF = 200.0; const hp = [ - 186, 195, - 179, 195, - 171, 188, - 149, 166, - 132, 126, - 123, 111, - 131, 100, - 145, 78, - 145, 60, - 150, 47, - 159, 50, - 184, 56, - 203, 49, - 213, 41, - 217, 51, - 226, 77, - 218, 104, - 208, 134, - 208, 158, - 207, 167, - 203, 175, - 196, 195, - 186, 195, + 186, 195, 179, 195, 171, 188, 149, 166, 132, 126, 123, 111, 131, 100, 145, 78, 145, 60, 150, 47, 159, 50, 184, 56, 203, 49, 213, 41, + 217, 51, 226, 77, 218, 104, 208, 134, 208, 158, 207, 167, 203, 175, 196, 195, 186, 195, ]; const numLines = Math.floor((hp.length - 1) / 2); const vec0 = { x: 0.0, y: 0.0 }; const vec1 = { x: 0.0, y: 0.0 }; UiSkelAni.vecTransform(xHeart, yHeart, scale, isMirroredX, hp[0], hp[1], vec0); - UiSkelAni.vecTransform(xHeart, yHeart, scale, isMirroredX, hp[13 * 2 + 0], hp[13 * 2 + 1], vec1); - const gx0 = Math.floor(w * vec0.x / W_REF); - const gy0 = Math.floor(h * vec0.y / H_REF); - const gx1 = Math.floor(w * vec1.x / W_REF); - const gy1 = Math.floor(h * vec1.y / H_REF); + UiSkelAni.vecTransform(xHeart, yHeart, scale, isMirroredX, hp[26], hp[27], vec1); + const gx0 = Math.floor((w * vec0.x) / W_REF); + const gy0 = Math.floor((h * vec0.y) / H_REF); + const gx1 = Math.floor((w * vec1.x) / W_REF); + const gy1 = Math.floor((h * vec1.y) / H_REF); const grad = ctx.createLinearGradient(gx0, gy0, gx1, gy1); grad.addColorStop(0.0, 'rgb(86, 0, 0)'); @@ -267,8 +200,8 @@ class UiSkelAni extends React.Component { ctx.beginPath(); UiSkelAni.vecTransform(xHeart, yHeart, scale, isMirroredX, hp[0], hp[1], vec0); - const x0 = Math.floor(w * vec0.x / W_REF); - const y0 = Math.floor(h * vec0.y / H_REF); + const x0 = Math.floor((w * vec0.x) / W_REF); + const y0 = Math.floor((h * vec0.y) / H_REF); ctx.moveTo(x0, y0); let j = 2; @@ -276,75 +209,25 @@ class UiSkelAni extends React.Component { UiSkelAni.vecTransform(xHeart, yHeart, scale, isMirroredX, hp[j + 0], hp[j + 1], vec0); UiSkelAni.vecTransform(xHeart, yHeart, scale, isMirroredX, hp[j + 2], hp[j + 3], vec1); - const x0 = Math.floor(w * vec0.x / W_REF); - const y0 = Math.floor(h * vec0.y / H_REF); - const x1 = Math.floor(w * vec1.x / W_REF); - const y1 = Math.floor(h * vec1.y / H_REF); + const x0 = Math.floor((w * vec0.x) / W_REF); + const y0 = Math.floor((h * vec0.y) / H_REF); + const x1 = Math.floor((w * vec1.x) / W_REF); + const y1 = Math.floor((h * vec1.y) / H_REF); ctx.quadraticCurveTo(x0, y0, x1, y1); } // for (i) all points ctx.stroke(); ctx.fill(); // draw blood vessels - const vessel0 = [ - 151, 75, - 154, 68, - 155, 61, - 151, 55 - ]; - const vessel1 = [ - 145, 89, - 156, 86, - 165, 82, - 172, 77, - 177, 69, - 177, 61 - ]; - const vessel2 = [ - 143, 100, - 157, 101, - 168, 98, - 179, 94, - 186, 87, - 192, 80, - 197, 76, - 205, 75 - ]; - const vessel3 = [ - 146, 109, - 160, 107, - 172, 107, - 183, 112, - 192, 119, - 199, 125, - 200, 130, - 198, 137, - 195, 142, - 189, 144 - ]; - const vessel4 = [ - 145, 123, - 160, 124, - 171, 128, - 178, 138, - 183, 151, - 184, 160, - 181, 168 - ]; - const vessel5 = [ - 149, 142, - 161, 146, - 167, 153, - 171, 158, - 171, 164 - ]; - const vessels = [ - vessel0, vessel1, vessel2, vessel3, vessel4, vessel5 - ]; + const vessel0 = [151, 75, 154, 68, 155, 61, 151, 55]; + const vessel1 = [145, 89, 156, 86, 165, 82, 172, 77, 177, 69, 177, 61]; + const vessel2 = [143, 100, 157, 101, 168, 98, 179, 94, 186, 87, 192, 80, 197, 76, 205, 75]; + const vessel3 = [146, 109, 160, 107, 172, 107, 183, 112, 192, 119, 199, 125, 200, 130, 198, 137, 195, 142, 189, 144]; + const vessel4 = [145, 123, 160, 124, 171, 128, 178, 138, 183, 151, 184, 160, 181, 168]; + const vessel5 = [149, 142, 161, 146, 167, 153, 171, 158, 171, 164]; + const vessels = [vessel0, vessel1, vessel2, vessel3, vessel4, vessel5]; const strAlpha = animParam.toFixed(2); - const strColor = 'rgba(180, 180, 180, ' + strAlpha + ')'; - // console.log(`strColor = ${strColor}`); - ctx.strokeStyle = strColor; + ctx.strokeStyle = 'rgba(180, 180, 180, ' + strAlpha + ')'; ctx.lineWidth = 1; const numVessels = vessels.length; @@ -356,8 +239,8 @@ class UiSkelAni extends React.Component { let j = 0; for (let i = 0; i < numPoints; i++, j += 2) { UiSkelAni.vecTransform(xHeart, yHeart, scale, isMirroredX, ves[j + 0], ves[j + 1], vec0); - const x0 = Math.floor(w * vec0.x / W_REF); - const y0 = Math.floor(h * vec0.y / H_REF); + const x0 = Math.floor((w * vec0.x) / W_REF); + const y0 = Math.floor((h * vec0.y) / H_REF); if (i === 0) { ctx.moveTo(x0, y0); } else { @@ -370,26 +253,22 @@ class UiSkelAni extends React.Component { let yp = -1; j = 0; for (let i = 0; i < numPoints; i++, j += 2) { - UiSkelAni.vecTransform(xHeart, yHeart, scale, isMirroredX, ves[j + 0], ves[j + 1], vec0); - const x0 = Math.floor(w * vec0.x / W_REF); - const y0 = Math.floor(h * vec0.y / H_REF); + UiSkelAni.vecTransform(xHeart, yHeart, scale, isMirroredX, ves[j], ves[j + 1], vec0); + const x0 = Math.floor((w * vec0.x) / W_REF); + const y0 = Math.floor((h * vec0.y) / H_REF); if (i === 0) { + console.log(''); } else { UiSkelAni.drawLeave(ctx, xp, yp, x0, y0, i); - } // if not first - xp = x0; yp = y0; - } // for (i) all points - - - } // for (v) all vessels - - } // draw heart + } + xp = x0; + yp = y0; + } + } + } - /** - * Render scene on canvas - */ renderWithCtx() { - const objCanvas = this.m_mount; + const objCanvas = this.m_mount.current; if (objCanvas === null) { return; } @@ -399,22 +278,21 @@ class UiSkelAni extends React.Component { if (w * h === 0) { return; } - // console.log(`UiSkelAni. renderCtx. screen = ${w} * ${h}`); - // clerar all screen - ctx.fillStyle = 'rgb(250, 250, 250)'; - ctx.fillRect(0,0, w, h); + + ctx.fillStyle = 'rgb(40, 42, 45)'; + ctx.fillRect(0, 0, w, h); const timeCur = Date.now(); this.drawCentral(ctx, w, h, timeCur); const MULT_SCALE = 0.001; - const PHASE_SCALE = 3.14 * 0.5; - const lAnim = Math.abs( Math.cos(timeCur * MULT_SCALE) ); + const PHASE_SCALE = Math.PI / 2; + const lAnim = Math.abs(Math.cos(timeCur * MULT_SCALE)); const lScale = 0.6 + 0.4 * lAnim; - const rAnim = Math.abs( Math.cos((timeCur * MULT_SCALE) + PHASE_SCALE) ); + const rAnim = Math.abs(Math.cos(timeCur * MULT_SCALE + PHASE_SCALE)); const rScale = 0.6 + 0.4 * rAnim; // console.log(`UiSkelAni. lScale = ${lScale}, rScale = ${rScale}`); - + const X_HEART_R = 178.0; const Y_HEART_R = 112.0; const NOT_MIRR = false; @@ -424,9 +302,7 @@ class UiSkelAni extends React.Component { const Y_HEART_L = 112.0; const IS_MIRR = true; this.drawHeart(ctx, w, h, X_HEART_L, Y_HEART_L, IS_MIRR, lScale, lAnim); + } +} - } // end of render - -} // end class - -export default connect(store => store)(UiSkelAni); +export default connect((store) => store)(UiSkelAni); diff --git a/src/ui/UiZoomTools.jsx b/src/ui/UiZoomTools.jsx new file mode 100644 index 00000000..17fcc57d --- /dev/null +++ b/src/ui/UiZoomTools.jsx @@ -0,0 +1,49 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React, { useState } from 'react'; + +import { connect } from 'react-redux'; +import Tools2dType from '../engine/tools2d/ToolTypes'; +import StoreActionType from '../store/ActionTypes'; +import { buttonsBuilder } from './Button/Button'; +import { Container } from './Layout/Container'; + +const UiZoomTools = (props) => { + const [activeButton, setActiveButton] = useState(Tools2dType.NONE); + + const mediator = (buttonId) => { + setActiveButton(buttonId); + props.dispatch({ type: StoreActionType.SET_2D_TOOLS_INDEX, indexTools2d: buttonId }); + + if (buttonId === Tools2dType.ZOOM_100) { + props.dispatch({ type: StoreActionType.SET_2D_ZOOM, render2dZoom: 1.0 }); + props.dispatch({ type: StoreActionType.SET_2D_X_POS, render2dxPos: 0.0 }); + props.dispatch({ type: StoreActionType.SET_2D_Y_POS, render2dyPos: 0.0 }); + + props.graphics2d.forceUpdate(); + props.graphics2d.forceRender(); + } + }; + + const buttons = [ + { + icon: 'zoom', + caption: 'Zoom in/out', + handler: mediator.bind(null, Tools2dType.ZOOM), + id: Tools2dType.ZOOM, + }, + { + icon: 'zoom_100', + caption: 'Zoom to default', + handler: mediator.bind(null, Tools2dType.ZOOM_100), + id: Tools2dType.ZOOM_100, + }, + ]; + + return {buttonsBuilder(buttons, { activeButton }, 'left')}; +}; + +export default connect((store) => store)(UiZoomTools); diff --git a/src/utils/DottedRectangle.png b/src/utils/DottedRectangle.png new file mode 100644 index 00000000..858263b8 Binary files /dev/null and b/src/utils/DottedRectangle.png differ diff --git a/src/utils/Folder.png b/src/utils/Folder.png new file mode 100644 index 00000000..afe59a34 Binary files /dev/null and b/src/utils/Folder.png differ diff --git a/src/utils/Link.png b/src/utils/Link.png new file mode 100644 index 00000000..1cc3253c Binary files /dev/null and b/src/utils/Link.png differ diff --git a/src/utils/Model.png b/src/utils/Model.png new file mode 100644 index 00000000..afa6ab59 Binary files /dev/null and b/src/utils/Model.png differ diff --git a/src/utils/configureTest.js b/src/utils/configureTest.js new file mode 100644 index 00000000..457d481f --- /dev/null +++ b/src/utils/configureTest.js @@ -0,0 +1,22 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { createStore } from 'redux'; +import { render } from '@testing-library/react'; +import { Provider } from 'react-redux'; +import rootReducer from '../store/Store'; + +export function renderWithState(ui, preloadedState) { + const store = createStore(rootReducer, preloadedState); + const initialState = store.getState(); + const result = render({ui}); + + return { + ...result, + store, + initialState, + }; +} diff --git a/src/utils/rectangle.png b/src/utils/rectangle.png new file mode 100644 index 00000000..77a00d7e Binary files /dev/null and b/src/utils/rectangle.png differ diff --git a/src/utils/three.png b/src/utils/three.png new file mode 100644 index 00000000..e029a0e9 Binary files /dev/null and b/src/utils/three.png differ diff --git a/src/utils/useInterval.js b/src/utils/useInterval.js new file mode 100644 index 00000000..6395c4af --- /dev/null +++ b/src/utils/useInterval.js @@ -0,0 +1,25 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import { useEffect, useRef } from 'react'; + +export function useInterval(callback, delay) { + const savedCallback = useRef(); + + useEffect(() => { + savedCallback.current = callback; + }); + + useEffect(() => { + function tick() { + savedCallback.current(); + } + + if (delay !== null) { + let id = setInterval(tick, delay); + return () => clearInterval(id); + } + }, [delay]); +} diff --git a/src/utils/useNeedShow3d.js b/src/utils/useNeedShow3d.js new file mode 100644 index 00000000..7601b773 --- /dev/null +++ b/src/utils/useNeedShow3d.js @@ -0,0 +1,15 @@ +import { useMemo } from 'react'; + +const FOUR = 4; + +export function useNeedShow3d(volumeSet, volumeIndex) { + return useMemo(() => { + const volume = volumeSet.getVolume(volumeIndex); + if (volume !== null) { + if (volume.m_bytesPerVoxel !== FOUR) { + return true; + } + } + return false; + }, [volumeSet, volumeIndex]); +} diff --git a/zoom.puml b/zoom.puml new file mode 100644 index 00000000..ee6b72d9 --- /dev/null +++ b/zoom.puml @@ -0,0 +1,74 @@ +@startuml +Actor User +'User -> Window.onwheel: WheelDelta(+3|-3) + +User -> UI : click m_fileSelector +UI -> Browser : open file browser dialog +User -> Finder : choose file +Finder -> UI : FileList +UI -> Engine : + + +@enduml + +@startuml + +diamond diamond + +UiOpenMenu --|> React.Component +UiOpenMenu --o React.BaseSyntheticEvent + + +package DOM { + HTMLInputElement --|> HTMLElement + HTMLInputElement --o FileList + + class FileList { + ~ length + File item(index) + File [index] + } + + interface HTMLElement { + click() + } + + interface HTMLInputElement { + + FileList files + } + + interface GlobalEventHandlers { + + onchange + } + + FileBrowser -- GlobalEventHandlers +} + +package React { + interface BaseSyntheticEvent { + + } +} + +class UiOpenMenu { + - React.BaseSyntheticEvent evt + - HTMLInputElement m_fileSelector + onButtonOpenLocalFileClick(evt) + handleFileSelected() +} + +package OS { + interface FileBrowser { + emitOnChange(files) + + FileList files + } +} + +@enduml + + +@startuml +class Store { + viewMode +} +@enduml