diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a09c56d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.idea diff --git a/plp-angular/.browserslistrc b/plp-angular/.browserslistrc new file mode 100644 index 0000000..8084853 --- /dev/null +++ b/plp-angular/.browserslistrc @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/plp-angular/.editorconfig b/plp-angular/.editorconfig new file mode 100644 index 0000000..b585a76 --- /dev/null +++ b/plp-angular/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/plp-angular/.gitignore b/plp-angular/.gitignore new file mode 100644 index 0000000..67cb607 --- /dev/null +++ b/plp-angular/.gitignore @@ -0,0 +1,49 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db + +# cache etc +/.angular diff --git a/plp-angular/.htaccess b/plp-angular/.htaccess new file mode 100644 index 0000000..385fcfa --- /dev/null +++ b/plp-angular/.htaccess @@ -0,0 +1,84 @@ +RewriteEngine on + +# Don't rewrite files or directories +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Rewrite everything else to index.html to allow html5 state links +RewriteRule ^ index.html [L] + + +# Enable Compression + + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/vnd.ms-fontobject + AddOutputFilterByType DEFLATE application/x-font + AddOutputFilterByType DEFLATE application/x-font-opentype + AddOutputFilterByType DEFLATE application/x-font-otf + AddOutputFilterByType DEFLATE application/x-font-truetype + AddOutputFilterByType DEFLATE application/x-font-ttf + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/atom_xml + AddOutputFilterByType DEFLATE application/x-shockwave-flash + AddOutputFilterByType DEFLATE font/opentype + AddOutputFilterByType DEFLATE font/otf + AddOutputFilterByType DEFLATE font/ttf + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE image/x-icon + AddOutputFilterByType DEFLATE image/jpeg + AddOutputFilterByType DEFLATE image/png + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/javascript + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/xml + + + mod_gzip_on Yes + mod_gzip_dechunk Yes + mod_gzip_item_include file .(html?|txt|css|js|php|pl)$ + mod_gzip_item_include handler ^cgi-script$ + mod_gzip_item_include mime ^text/.* + mod_gzip_item_include mime ^application/x-javascript.* + mod_gzip_item_exclude mime ^image/.* + mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* + + +# Leverage Browser Caching + + ExpiresActive On + ExpiresByType image/jpg "access 1 year" + ExpiresByType image/jpeg "access 1 year" + ExpiresByType image/gif "access 1 year" + ExpiresByType image/png "access 1 year" + ExpiresByType text/css "access 1 month" + ExpiresByType text/html "access 1 month" + ExpiresByType application/pdf "access 1 month" + ExpiresByType text/x-javascript "access 1 month" + ExpiresByType application/x-shockwave-flash "access 1 month" + ExpiresByType image/x-icon "access 1 year" + ExpiresDefault "access 1 month" + + + + Header set Cache-Control "max-age=2678400, public" + + + Header set Cache-Control "max-age=7200, private, must-revalidate" + + + Header set Cache-Control "max-age=86400, public" + + + Header set Cache-Control "max-age=2678400, private" + + + +AuthType Basic +AuthName "Password Protected Area" +AuthUserFile /var/www/vhosts/plp-tool.de/httpdocs/plp-tool-live/plp-angular/dist/plp-angular/.htpasswd +Require valid-user diff --git a/plp-angular/.htpasswd b/plp-angular/.htpasswd new file mode 100644 index 0000000..98c6d92 --- /dev/null +++ b/plp-angular/.htpasswd @@ -0,0 +1 @@ +plp:$2y$10$FvzeO0lzdARUTVPMithMoO9lYM7tTCniHb2DiHjKt.YGAdtuVpodG \ No newline at end of file diff --git a/plp-angular/README.md b/plp-angular/README.md new file mode 100644 index 0000000..1cad39f --- /dev/null +++ b/plp-angular/README.md @@ -0,0 +1,27 @@ +# PlpAngular + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.3.5. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/plp-angular/angular.json b/plp-angular/angular.json new file mode 100644 index 0000000..714ac4a --- /dev/null +++ b/plp-angular/angular.json @@ -0,0 +1,149 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "plp-angular": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "crossOrigin": "anonymous", + "outputPath": "dist/plp-angular", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": true, + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/scss/styles.scss", + "./node_modules/angular-calendar/css/angular-calendar.css", + "./node_modules/ag-grid-community/styles/ag-grid.css", + "./node_modules/ag-grid-community/styles/ag-theme-balham.css" + ], + "scripts": [] + }, + "configurations": { + "gamma": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.gamma.ts" + } + ] + }, + "beta": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.beta.ts" + } + ] + }, + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "6kb", + "maximumError": "10kb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "plp-angular:build" + }, + "configurations": { + "production": { + "browserTarget": "plp-angular:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "plp-angular:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/scss/styles.scss" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "plp-angular:serve" + }, + "configurations": { + "production": { + "devServerTarget": "plp-angular:serve:production" + } + } + } + } + }}, + "defaultProject": "plp-angular" +} \ No newline at end of file diff --git a/plp-angular/e2e/protractor.conf.js b/plp-angular/e2e/protractor.conf.js new file mode 100644 index 0000000..73e4e68 --- /dev/null +++ b/plp-angular/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/plp-angular/e2e/src/app.e2e-spec.ts b/plp-angular/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..07e5fd5 --- /dev/null +++ b/plp-angular/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('plp-angular app is running!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/plp-angular/e2e/src/app.po.ts b/plp-angular/e2e/src/app.po.ts new file mode 100644 index 0000000..b8498c2 --- /dev/null +++ b/plp-angular/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText() { + return element(by.css('app-root .content span')).getText() as Promise; + } +} diff --git a/plp-angular/e2e/tsconfig.json b/plp-angular/e2e/tsconfig.json new file mode 100644 index 0000000..c92199c --- /dev/null +++ b/plp-angular/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es2018", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/plp-angular/karma.conf.js b/plp-angular/karma.conf.js new file mode 100644 index 0000000..c8e7aee --- /dev/null +++ b/plp-angular/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, './coverage/plp-angular'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/plp-angular/package-lock.json b/plp-angular/package-lock.json new file mode 100644 index 0000000..1675531 --- /dev/null +++ b/plp-angular/package-lock.json @@ -0,0 +1,12215 @@ +{ + "name": "plp-angular", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "plp-angular", + "version": "0.0.0", + "dependencies": { + "@angular-devkit/build-angular": "^15.2.8", + "@angular-devkit/schematics": "^15.2.8", + "@angular/animations": "^15.2.8", + "@angular/common": "^15.2.8", + "@angular/compiler": "^15.2.8", + "@angular/core": "^15.2.8", + "@angular/forms": "^15.2.8", + "@angular/platform-browser": "^15.2.8", + "@angular/platform-browser-dynamic": "^15.2.8", + "@angular/router": "^15.2.8", + "@ng-bootstrap/ng-bootstrap": "^14.1.1", + "@npmcli/fs": "^3.1.0", + "ag-grid-angular": "^29.3.5", + "ag-grid-community": "^29.3.5", + "angular-calendar": "^0.31.0", + "angularx-flatpickr": "^6.2.0", + "codelyzer": "^6.0.2", + "date-fns": "^1.30.1", + "eslint": "^8.40.0", + "file-saver": "^2.0.2", + "flatpickr": "^4.6.13", + "ng6-breadcrumbs": "^1.0.7", + "rxjs": "~6.6.7", + "tslib": "^2.0.0", + "zone.js": "~0.13.0" + }, + "devDependencies": { + "@angular/cli": "^15.2.8", + "@angular/compiler-cli": "^15.2.8", + "@angular/language-service": "^15.2.8", + "@types/file-saver": "^2.0.1", + "@types/jasmine": "~3.3.8", + "@types/jasminewd2": "^2.0.8", + "@types/node": "^20.1.5", + "jasmine-core": "~3.8.0", + "jasmine-spec-reporter": "~5.0.0", + "karma": "^6.4.2", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~4.0.0", + "karma-jasmine-html-reporter": "^1.5.0", + "ts-node": "~7.0.0", + "typescript": "~4.9.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1502.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.8.tgz", + "integrity": "sha512-rTltw2ABHrcKc8EGimALvXmrDTP5hlNbEy6nYolJoXEI9EwHgriWrVLVPs3OEF+/ed47dbJi9EGOXUOgzgpB5A==", + "dependencies": { + "@angular-devkit/core": "15.2.8", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.8.tgz", + "integrity": "sha512-TGDnXhhOG6h6TOrWWzfnkha7wYBOXi7iJc1o1w1VKCayE3T6TZZdF847aK66vL9KG7AKYVdGhWEGw2WBHUBUpg==", + "dependencies": { + "@ampproject/remapping": "2.2.0", + "@angular-devkit/architect": "0.1502.8", + "@angular-devkit/build-webpack": "0.1502.8", + "@angular-devkit/core": "15.2.8", + "@babel/core": "7.20.12", + "@babel/generator": "7.20.14", + "@babel/helper-annotate-as-pure": "7.18.6", + "@babel/helper-split-export-declaration": "7.18.6", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.20.7", + "@babel/plugin-transform-runtime": "7.19.6", + "@babel/preset-env": "7.20.2", + "@babel/runtime": "7.20.13", + "@babel/template": "7.20.7", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "15.2.8", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.13", + "babel-loader": "9.1.2", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "4.21.5", + "cacache": "17.0.4", + "chokidar": "3.5.3", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.16", + "css-loader": "6.7.3", + "esbuild-wasm": "0.17.8", + "glob": "8.1.0", + "https-proxy-agent": "5.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.3", + "less-loader": "11.1.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.1", + "magic-string": "0.29.0", + "mini-css-extract-plugin": "2.7.2", + "open": "8.4.1", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "piscina": "3.2.0", + "postcss": "8.4.21", + "postcss-loader": "7.0.2", + "resolve-url-loader": "5.0.0", + "rxjs": "6.6.7", + "sass": "1.58.1", + "sass-loader": "13.2.0", + "semver": "7.3.8", + "source-map-loader": "4.0.1", + "source-map-support": "0.5.21", + "terser": "5.16.3", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.5.0", + "webpack": "5.76.1", + "webpack-dev-middleware": "6.0.1", + "webpack-dev-server": "4.11.1", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.17.8" + }, + "peerDependencies": { + "@angular/compiler-cli": "^15.0.0", + "@angular/localize": "^15.0.0", + "@angular/platform-server": "^15.0.0", + "@angular/service-worker": "^15.0.0", + "karma": "^6.3.0", + "ng-packagr": "^15.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=4.8.2 <5.0" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1502.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1502.8.tgz", + "integrity": "sha512-jWtNv+S03FFLDe/C8SPCcRvkz3bSb2R+919IT086Q9axIPQ1VowOEwzt2k3qXPSSrC7GSYuASM+X92dB47NTQQ==", + "dependencies": { + "@angular-devkit/architect": "0.1502.8", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.8.tgz", + "integrity": "sha512-Lo4XrbDMtXarKnMrFgWLmQdSX+3QPNAg4otG8cmp/U4jJyjV4dAYKEAsb1sCNGUSM4h4v09EQU/5ugVjDU29lQ==", + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.2.8.tgz", + "integrity": "sha512-w6EUGC96kVsH9f8sEzajzbONMawezyVBiSo+JYp5r25rQArAz/a+KZntbuETWHQ0rQOEsKmUNKxwmr11BaptSQ==", + "dependencies": { + "@angular-devkit/core": "15.2.8", + "jsonc-parser": "3.2.0", + "magic-string": "0.29.0", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/animations": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-15.2.9.tgz", + "integrity": "sha512-GQujLhI0cQFcl4Q8y0oSYKSRnW23GIeSL+Arl4eFufziJ9hGAAQNuesaNs/7i+9UlTHDMkPH3kd5ScXuYYz6wg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.2.9" + } + }, + "node_modules/@angular/cli": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-15.2.8.tgz", + "integrity": "sha512-3VlTfm6DUZfFHBY43vQSAaqmFTxy3VtRd/iDBCHcEPhHwYLWBvNwReJuJfNja8O105QQ6DBiYVBExEBtPmjQ4w==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1502.8", + "@angular-devkit/core": "15.2.8", + "@angular-devkit/schematics": "15.2.8", + "@schematics/angular": "15.2.8", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "3.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "npm-package-arg": "10.1.0", + "npm-pick-manifest": "8.0.1", + "open": "8.4.1", + "ora": "5.4.1", + "pacote": "15.1.0", + "resolve": "1.22.1", + "semver": "7.3.8", + "symbol-observable": "4.0.0", + "yargs": "17.6.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-15.2.9.tgz", + "integrity": "sha512-LM9/UHG2dRrOzlu2KovrFwWIziFMjRxHzSP3Igw6Symw/wIl0kXGq8Fn6RpFP78zmLqnv+IQOoRiby9MCXsI4g==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.2.9", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-15.2.9.tgz", + "integrity": "sha512-MoKugbjk+E0wRBj12uvIyDLELlVLonnqjA2+XiF+7FxALIeyds3/qQeEoMmYIqAbN3NnTT5pV92RxWwG4tHFwA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.2.9" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.9.tgz", + "integrity": "sha512-zsbI8G2xHOeYWI0hjFzrI//ZhZV9il/uQW5dAimfwJp06KZDeXZ3PdwY9JQslf6F+saLwOObxy6QMrIVvfjy9w==", + "dependencies": { + "@babel/core": "7.19.3", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.27.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/main-ngcc.js" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler": "15.2.9", + "typescript": ">=4.8.2 <5.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", + "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/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/@angular/compiler-cli/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/core": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.2.9.tgz", + "integrity": "sha512-w46Z1yUXCQfKV7XfnamOoLA2VD0MVUUYVrUjO73mHSskDXSXxfZAEHO9kfUS71Cj35PvhP3mbkqWscpea2WeYg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.11.4 || ~0.12.0 || ~0.13.0" + } + }, + "node_modules/@angular/forms": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-15.2.9.tgz", + "integrity": "sha512-sk0pC2EFi2Ohg5J0q0NYptbT+2WOkoiERSMYA39ncDvlSZBWsNlxpkbGUSck7NIxjK2QfcVN1ldGbHlZTFvtqg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/language-service": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-15.2.9.tgz", + "integrity": "sha512-B7lP4q/eHge2lZezOXS96EYzVf4stMCWfOnz7+pUUi0HbF+A5QCV65SWQddS/M+NM2jj8N2L/j+6UCH8lJjTQA==", + "dev": true, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + } + }, + "node_modules/@angular/localize": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-15.2.9.tgz", + "integrity": "sha512-7ZGK3BWwIukSK5ORWjM3y/FYj7/ZJFl1RO1GCeL/tHD4nq0kd3q3pYvcpnoi9HGl+q8AkL24xdsfzgCFo8SB0g==", + "peer": true, + "dependencies": { + "@babel/core": "7.19.3", + "glob": "8.1.0", + "yargs": "^17.2.1" + }, + "bin": { + "localize-extract": "tools/bundles/src/extract/cli.js", + "localize-migrate": "tools/bundles/src/migrate/cli.js", + "localize-translate": "tools/bundles/src/translate/cli.js" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler": "15.2.9", + "@angular/compiler-cli": "15.2.9" + } + }, + "node_modules/@angular/localize/node_modules/@babel/core": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", + "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/localize/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/platform-browser": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.9.tgz", + "integrity": "sha512-ufCHeSX+U6d43YOMkn3igwfqtlozoCXADcbyfUEG8m2y9XASobqmCKvdSk/zfl62oyiA8msntWBJVBE2l4xKXg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/animations": "15.2.9", + "@angular/common": "15.2.9", + "@angular/core": "15.2.9" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.9.tgz", + "integrity": "sha512-ZIYDM6MShblb8OyV1m4+18lJJ2LCeICmeg2uSbpFYptYBSOClrTiYOOFVDJvn7HLvNzljLs16XPrgyaYVqNpcw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.2.9", + "@angular/compiler": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9" + } + }, + "node_modules/@angular/router": { + "version": "15.2.9", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-15.2.9.tgz", + "integrity": "sha512-UCbh5DLSDhybv0xKYT7kGQMfOVdyhHIHOZz5EYVebbhste6S+W1LE57vTHq7QtxJsyKBa/WSkaUkCLXD6ntCAg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.2.9", + "@angular/core": "15.2.9", + "@angular/platform-browser": "15.2.9", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==" + }, + "node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "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.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", + "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", + "dependencies": { + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "dependencies": { + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "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.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", + "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.5", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.21.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-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/@babel/helper-create-regexp-features-plugin": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", + "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.3.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-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/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@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-environment-visitor": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", + "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", + "dependencies": { + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", + "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-member-expression-to-functions": "^7.21.5", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "dependencies": { + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", + "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", + "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.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@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-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@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-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@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-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@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-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.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-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", + "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@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-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", + "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "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.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", + "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/template": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", + "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", + "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", + "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/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-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", + "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@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-import-assertions": "^7.20.0", + "@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.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "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/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "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/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "dependencies": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", + "dependencies": { + "@babel/types": "^7.21.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "devOptional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.8.tgz", + "integrity": "sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.8.tgz", + "integrity": "sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.8.tgz", + "integrity": "sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.8.tgz", + "integrity": "sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.8.tgz", + "integrity": "sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.8.tgz", + "integrity": "sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.8.tgz", + "integrity": "sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.8.tgz", + "integrity": "sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.8.tgz", + "integrity": "sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.8.tgz", + "integrity": "sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.8.tgz", + "integrity": "sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.8.tgz", + "integrity": "sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.8.tgz", + "integrity": "sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.8.tgz", + "integrity": "sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.8.tgz", + "integrity": "sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.8.tgz", + "integrity": "sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.8.tgz", + "integrity": "sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.8.tgz", + "integrity": "sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.8.tgz", + "integrity": "sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.8.tgz", + "integrity": "sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.8.tgz", + "integrity": "sha512-Fqy63515xl20OHGFykjJsMnoIWS+38fqfg88ClvPXyDbLtgXal2DTlhb1TfTX34qWi3u4I7Cq563QcHpqgLx8w==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.8.tgz", + "integrity": "sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/@eslint/eslintrc/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/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==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@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==", + "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/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@mattlewis92/dom-autoscroller": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@mattlewis92/dom-autoscroller/-/dom-autoscroller-2.4.2.tgz", + "integrity": "sha512-YbrUWREPGEjE/FU6foXcAT1YbVwqD/jkYnY1dFb0o4AxtP3s4xKBthlELjndZih8uwsDWgQZx1eNskRNe2BgZQ==" + }, + "node_modules/@ng-bootstrap/ng-bootstrap": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-14.1.1.tgz", + "integrity": "sha512-3EIc+lCmqUlr7sghzx0r28sjk771zvyqe3SXkrT7grYFzQCVbjtms6Wr9OPbdbmpqDNXG6a8llUoyVgtp1B2Tg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^15.0.0", + "@angular/core": "^15.0.0", + "@angular/forms": "^15.0.0", + "@angular/localize": "^15.0.0", + "@popperjs/core": "^2.11.6", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@ngtools/webpack": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.8.tgz", + "integrity": "sha512-BJexeT4FxMtToVBGa3wdl6rrkYXgilP0kkSH4Qzu4MPlLPbeBSr4XQalQriewlpC2uzG0r2SJfrAe2eDhtSykA==", + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^15.0.0", + "typescript": ">=4.8.2 <5.0", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz", + "integrity": "sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.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==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", + "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@scarf/scarf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.1.1.tgz", + "integrity": "sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ==", + "hasInstallScript": true + }, + "node_modules/@schematics/angular": { + "version": "15.2.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.8.tgz", + "integrity": "sha512-F49IEzCFxQlpaMIgTO/wF1l/CLQKif7VaiDdyiTKOeT22IMmyd61FUmWDyZYfCBqMlvBmvDGx64HaHWes1HYCg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "15.2.8", + "@angular-devkit/schematics": "15.2.8", + "jsonc-parser": "3.2.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", + "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "devOptional": true + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "devOptional": true + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "devOptional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", + "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.16.tgz", + "integrity": "sha512-Nveep4zKGby8uIvG2AEUyYOwZS8uVeHK9TgbuWYSawUDDdIgfhCKz28QzamTo//Jk7Ztt9PO3f+vzlB6a4GV1Q==", + "dev": true + }, + "node_modules/@types/jasminewd2": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.10.tgz", + "integrity": "sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g==", + "dev": true, + "dependencies": { + "@types/jasmine": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/node": { + "version": "20.1.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.5.tgz", + "integrity": "sha512-IvGD1CD/nego63ySR7vrAKEX3AJTcmrAN2kn+/sDNLi1Ff5kBzDeEdqWDplK+0HAEoLYej137Sk0cUU8OLOlMg==" + }, + "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==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "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==" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, + "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==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/ag-grid-angular": { + "version": "29.3.5", + "resolved": "https://registry.npmjs.org/ag-grid-angular/-/ag-grid-angular-29.3.5.tgz", + "integrity": "sha512-UWDZvDSrS9Z+LFZ1G0HFOeamITD8kEHgO9eooJV4DxSmYoBGMGruLZV1QIPhjQwBVe8ib5TWw3Q1erSf/bcVSw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">= 12.0.0", + "@angular/core": ">= 12.0.0", + "ag-grid-community": "~29.3.5" + } + }, + "node_modules/ag-grid-community": { + "version": "29.3.5", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-29.3.5.tgz", + "integrity": "sha512-LxUo21f2/CH31ACEs1C7Q/ggGGI1fQPSTB4aY5OThmM+lBkygZ7QszBE8jpfgWOIjvjdtcdIeQbmbjkHeMsA7A==" + }, + "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==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^2.0.0", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "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==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/angular-calendar": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/angular-calendar/-/angular-calendar-0.31.0.tgz", + "integrity": "sha512-QGPObUmOYLr4IeSaj1pzZjcycN6otYx+SbeezJuujstXR9f2wo4CtMlBQ+SU+ZF5VFfrdYge8qkxMGCLBLBRrw==", + "dependencies": { + "@scarf/scarf": "^1.1.1", + "angular-draggable-droppable": "^8.0.0", + "angular-resizable-element": "^7.0.0", + "calendar-utils": "^0.10.4", + "positioning": "^2.0.1", + "tslib": "^2.4.1" + }, + "funding": { + "url": "https://github.com/sponsors/mattlewis92" + }, + "peerDependencies": { + "@angular/core": ">=15.0.0" + } + }, + "node_modules/angular-draggable-droppable": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/angular-draggable-droppable/-/angular-draggable-droppable-8.0.0.tgz", + "integrity": "sha512-+gpSNBbygjV1pxTxsM3UPJKcXHXJabYoTtKcgQe74rGnb1umKc07XCBD1qDzvlG/kocthvhQ12qfYOYzHnE3ZA==", + "dependencies": { + "@mattlewis92/dom-autoscroller": "^2.4.2", + "tslib": "^2.4.1" + }, + "peerDependencies": { + "@angular/core": ">=15.0.0" + } + }, + "node_modules/angular-resizable-element": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/angular-resizable-element/-/angular-resizable-element-7.0.2.tgz", + "integrity": "sha512-/BGuNiA38n9klexHO1xgnsA3VYigj9v+jUGjKtBRgfB26bCxZKsNWParSu2k3EqbATrfAJC4Nl8f7cORpJFf4w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/core": ">=15.0.0" + } + }, + "node_modules/angularx-flatpickr": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/angularx-flatpickr/-/angularx-flatpickr-6.6.0.tgz", + "integrity": "sha512-n/csZmAwfL32P7pUv52FXihSbPjVAjiKglbY8WO9hsBKvAk7mw8PKNjiovln4+fuscJwKo0wSsw+s7A+JpetQg==", + "dependencies": { + "tslib": "^1.9.0" + }, + "peerDependencies": { + "@angular/core": ">=5.0.0", + "@angular/forms": ">=5.0.0", + "flatpickr": "^4.5.0" + } + }, + "node_modules/angularx-flatpickr/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "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==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/argparse/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha512-majUxHgLehQTeSA+hClx+DY09OVUqG3GtezWkF1krgLGNdlDu9l9V8DaqNMWbq4Eddc8wsyDA0hpDUtnYxQEXw==", + "dependencies": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.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==" + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "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": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + }, + "node_modules/autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dependencies": { + "ast-types-flow": "0.0.7" + } + }, + "node_modules/babel-loader": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "dependencies": { + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "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.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/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", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "devOptional": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "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==", + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "devOptional": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "devOptional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "devOptional": true + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz", + "integrity": "sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA==", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^8.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/calendar-utils": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/calendar-utils/-/calendar-utils-0.10.4.tgz", + "integrity": "sha512-gBK4xCJ42yjaUKwuUha6cZOfxAmGzvSgbdAaX3xLRioeKbYoOK1x1qeD6dch72rsMZlTgATPbBBx42bnkStqgQ==" + }, + "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==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "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/caniuse-lite": { + "version": "1.0.30001487", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", + "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/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/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==", + "engines": { + "node": ">=6.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==", + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/codelyzer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.2.tgz", + "integrity": "sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g==", + "dependencies": { + "@angular/compiler": "9.0.0", + "@angular/core": "9.0.0", + "app-root-path": "^3.0.0", + "aria-query": "^3.0.0", + "axobject-query": "2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "rxjs": "^6.5.3", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2", + "tslib": "^1.10.0", + "zone.js": "~0.10.3" + }, + "peerDependencies": { + "@angular/compiler": ">=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next", + "@angular/core": ">=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next", + "tslint": "^5.0.0 || ^6.0.0" + } + }, + "node_modules/codelyzer/node_modules/@angular/compiler": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz", + "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==", + "peerDependencies": { + "tslib": "^1.10.0" + } + }, + "node_modules/codelyzer/node_modules/@angular/core": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz", + "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==", + "peerDependencies": { + "rxjs": "^6.5.3", + "tslib": "^1.10.0", + "zone.js": "~0.10.2" + } + }, + "node_modules/codelyzer/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/codelyzer/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/codelyzer/node_modules/zone.js": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==" + }, + "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==", + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "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==" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "devOptional": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "devOptional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "devOptional": true + }, + "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": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "devOptional": true, + "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": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", + "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "dependencies": { + "browserslist": "^4.21.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "devOptional": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "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/critters": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^4.2.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + } + }, + "node_modules/critters/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/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/critters/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/critters/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/critters/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/critters/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/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha512-Ht70DcFBh+/ekjVrYS2PlDMdSQEl3OFNmjK6lcn49HptBgilXf/Zwg4uFh9Xn0pX3Q8YOkSjIFOfK2osvdqpBw==", + "dependencies": { + "through": "X.X.X" + } + }, + "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==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "devOptional": true + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "node_modules/date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "devOptional": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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==" + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "devOptional": true + }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "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==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "node_modules/dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "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/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "devOptional": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "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/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.394", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.394.tgz", + "integrity": "sha512-0IbC2cfr8w5LxTz+nmn2cJTGafsK9iauV2r5A5scfzyovqLrxuLoxOHE5OBobP3oVIggJT+0JfKnw9sm87c8Hw==" + }, + "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/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/engine.io": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "devOptional": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "devOptional": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "devOptional": true + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "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==", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "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==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + }, + "node_modules/esbuild": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.8.tgz", + "integrity": "sha512-g24ybC3fWhZddZK6R3uD2iF/RIPnRpwJAqLov6ouX3hMbY4+tKolP0VMF3zuIYCaXun+yHwS5IPQ91N2BT191g==", + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.8", + "@esbuild/android-arm64": "0.17.8", + "@esbuild/android-x64": "0.17.8", + "@esbuild/darwin-arm64": "0.17.8", + "@esbuild/darwin-x64": "0.17.8", + "@esbuild/freebsd-arm64": "0.17.8", + "@esbuild/freebsd-x64": "0.17.8", + "@esbuild/linux-arm": "0.17.8", + "@esbuild/linux-arm64": "0.17.8", + "@esbuild/linux-ia32": "0.17.8", + "@esbuild/linux-loong64": "0.17.8", + "@esbuild/linux-mips64el": "0.17.8", + "@esbuild/linux-ppc64": "0.17.8", + "@esbuild/linux-riscv64": "0.17.8", + "@esbuild/linux-s390x": "0.17.8", + "@esbuild/linux-x64": "0.17.8", + "@esbuild/netbsd-x64": "0.17.8", + "@esbuild/openbsd-x64": "0.17.8", + "@esbuild/sunos-x64": "0.17.8", + "@esbuild/win32-arm64": "0.17.8", + "@esbuild/win32-ia32": "0.17.8", + "@esbuild/win32-x64": "0.17.8" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.8.tgz", + "integrity": "sha512-zCmpxv95E0FuCmvdw1K836UHnj4EdiQnFfjTby35y3LAjRPtXMj3sbHDRHjbD8Mqg5lTwq3knacr/1qIFU51CQ==", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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/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/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "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/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "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==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "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/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "devOptional": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "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==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "devOptional": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "devOptional": true, + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "devOptional": true + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "devOptional": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "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==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/flatpickr": { + "version": "4.6.13", + "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", + "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==" + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", + "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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==", + "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, + "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==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dependencies": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==" + }, + "node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "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==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + }, + "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/import-fresh/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/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "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==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/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/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/inquirer/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/inquirer/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/inquirer/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/inquirer/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/inquirer/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/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "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==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==" + }, + "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==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "devOptional": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "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==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/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==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz", + "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jasmine-core": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.8.0.tgz", + "integrity": "sha512-zl0nZWDrmbCiKns0NcjkFGYkVTGCPUgoHypTaj+G2AzaWus7QGoXARSlYsSle2VRpSdfJmM+hzmFKzQNhF2kHg==", + "dev": true + }, + "node_modules/jasmine-spec-reporter": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz", + "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==", + "dev": true, + "dependencies": { + "colors": "1.4.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "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==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "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/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "devOptional": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/karma": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.2.tgz", + "integrity": "sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ==", + "devOptional": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-coverage-istanbul-reporter": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", + "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^3.0.2", + "minimatch": "^3.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/mattlewis92" + } + }, + "node_modules/karma-jasmine": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.2.tgz", + "integrity": "sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g==", + "dev": true, + "dependencies": { + "jasmine-core": "^3.6.0" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "karma": "*" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", + "dev": true, + "peerDependencies": { + "jasmine-core": ">=3.8", + "karma": ">=0.9", + "karma-jasmine": ">=1.1" + } + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "devOptional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "devOptional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "devOptional": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "devOptional": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "devOptional": true, + "engines": { + "node": ">=10" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/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==", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "engines": { + "node": ">= 12.13.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==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "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.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "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==" + }, + "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==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==" + }, + "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==", + "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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "devOptional": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "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==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", + "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "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/make-dir/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/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/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==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", + "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "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==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "devOptional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", + "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "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==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "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==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "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-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/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==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "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-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/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==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "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/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/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/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/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/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.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==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "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==" + }, + "node_modules/ng6-breadcrumbs": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ng6-breadcrumbs/-/ng6-breadcrumbs-1.0.7.tgz", + "integrity": "sha512-U/WRZ/iFMFq1zxwnY9VnvhT556+5XythO5g3EXidR5wIctUWwb6WCIevLExmFyU/ATaplruGtVZR8zQyyABA3g==" + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "optional": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", + "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "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": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", + "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "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==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "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==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", + "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/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/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/ora/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/ora/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/ora/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/ora/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/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pacote": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.0.tgz", + "integrity": "sha512-FFcjtIl+BQNfeliSm7MZz5cpdohvUV1yjGnqgVM4UnVF7JslRY0ImXAygdaCDV0jjUADEWu4y5xsDV8brtrTLg==", + "dev": true, + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^4.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-sax-parser/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.1.tgz", + "integrity": "sha512-UgmoiySyjFxP6tscZDgWGEAgsW5ok8W3F5CJDnnH2pozwSTGE6eH7vwTotMwATWA2r5xqdkKdxYPkwlJjAI/3g==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1", + "minipass": "^5.0.0 || ^6.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", + "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.0.tgz", + "integrity": "sha512-mvD5U4pUen1aWcjTxUgdoMg6PB98dcV0obc/OiPzls79++IpgNoO+MCbOHRlKfWIOvjIjmjUygjZmSStP7B0Og==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "devOptional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "dependencies": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "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==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/positioning": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/positioning/-/positioning-2.0.1.tgz", + "integrity": "sha512-DsAgM42kV/ObuwlRpAzDTjH9E8fGKkMDJHWFX+kfNXSxh7UCCQxEmdjv/Ws5Ft1XDnt3JT8fIDYeKNSE2TbttA==" + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-loader": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz", + "integrity": "sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", + "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "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/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==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "optional": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "devOptional": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "devOptional": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-package-json": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.3.tgz", + "integrity": "sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ==", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.4.tgz", + "integrity": "sha512-fDboBse/sl1oXSLhIp0FcCJgzW9KmhC/q8ULTKC82zc+DL3TL7FNb8qlt5qqXN53MsKEUSIcb+7DLmEygOE5Yw==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.0", + "minipass": "^5.0.0 || ^6.0.0", + "path-scurry": "^1.7.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/minipass": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.0.tgz", + "integrity": "sha512-mvD5U4pUen1aWcjTxUgdoMg6PB98dcV0obc/OiPzls79++IpgNoO+MCbOHRlKfWIOvjIjmjUygjZmSStP7B0Og==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "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==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "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==" + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "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==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "devOptional": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "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", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.58.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.1.tgz", + "integrity": "sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", + "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true + }, + "node_modules/schema-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha512-e8BOaTo007E3dMuQQTnPdalbKTABKNS7UxoBIDnwOqRa+QwMrCPjynB8zAlPF6xlqUfdLPPLIJ13hJNmhtq8Ng==", + "dependencies": { + "semver": "^5.3.0" + } + }, + "node_modules/semver-dsl/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/semver/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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/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/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "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": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sigstore": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.5.0.tgz", + "integrity": "sha512-i3nhvdobiPj8XrXNIggjeur6+A5iAQ4f+r1bR5SGitFJBbthy/6c7Fz0h+kY70Wua1FSMdDr/UEhXSVRXNpynw==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.1.0", + "make-fetch-happen": "^11.0.1", + "tuf-js": "^1.1.3" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/sigstore/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sigstore/node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "devOptional": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "devOptional": true, + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "devOptional": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", + "dependencies": { + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "node_modules/ssri": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", + "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "devOptional": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.14", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", + "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/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/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/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/terser": { + "version": "5.16.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", + "integrity": "sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz", + "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/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==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.17.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz", + "integrity": "sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "dependencies": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + } + }, + "node_modules/tslint/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tslint/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tslint/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tslint/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true + }, + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "peer": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "peer": true + }, + "node_modules/tuf-js": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.6.tgz", + "integrity": "sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tuf-js/node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "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==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==" + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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==", + "devOptional": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "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==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "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==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "5.76.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", + "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.0.1.tgz", + "integrity": "sha512-PZPZ6jFinmqVPJZbisfggDiC+2EeGZ1ZByyMP5sOFJcPPWSexalISz+cvm+j+oYPT7FIJyxT76esjnw9DhE5sw==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/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==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "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==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zone.js": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.0.tgz", + "integrity": "sha512-7m3hNNyswsdoDobCkYNAy5WiUulkMd3+fWaGT9ij6iq3Zr/IwJo4RMCYPSDjT+r7tnPErmY9sZpKhWQ8S5k6XQ==", + "dependencies": { + "tslib": "^2.3.0" + } + } + } +} diff --git a/plp-angular/package.json b/plp-angular/package.json new file mode 100644 index 0000000..2d45f1b --- /dev/null +++ b/plp-angular/package.json @@ -0,0 +1,58 @@ +{ + "name": "plp-angular", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular-devkit/build-angular": "^15.2.8", + "@angular-devkit/schematics": "^15.2.8", + "@angular/animations": "^15.2.8", + "@angular/common": "^15.2.8", + "@angular/compiler": "^15.2.8", + "@angular/core": "^15.2.8", + "@angular/forms": "^15.2.8", + "@angular/platform-browser": "^15.2.8", + "@angular/platform-browser-dynamic": "^15.2.8", + "@angular/router": "^15.2.8", + "@ng-bootstrap/ng-bootstrap": "^14.1.1", + "@npmcli/fs": "^3.1.0", + "ag-grid-angular": "^29.3.5", + "ag-grid-community": "^29.3.5", + "angular-calendar": "^0.31.0", + "angularx-flatpickr": "^6.2.0", + "codelyzer": "^6.0.2", + "date-fns": "^1.30.1", + "eslint": "^8.40.0", + "file-saver": "^2.0.2", + "flatpickr": "^4.6.13", + "ng6-breadcrumbs": "^1.0.7", + "rxjs": "~6.6.7", + "tslib": "^2.0.0", + "zone.js": "~0.13.0" + }, + "devDependencies": { + "@angular/cli": "^15.2.8", + "@angular/compiler-cli": "^15.2.8", + "@angular/language-service": "^15.2.8", + "@types/file-saver": "^2.0.1", + "@types/jasmine": "~3.3.8", + "@types/jasminewd2": "^2.0.8", + "@types/node": "^20.1.5", + "jasmine-core": "~3.8.0", + "jasmine-spec-reporter": "~5.0.0", + "karma": "^6.4.2", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~4.0.0", + "karma-jasmine-html-reporter": "^1.5.0", + "ts-node": "~7.0.0", + "typescript": "~4.9.5" + } +} diff --git a/plp-angular/src/app/app-routing.module.ts b/plp-angular/src/app/app-routing.module.ts new file mode 100644 index 0000000..1264143 --- /dev/null +++ b/plp-angular/src/app/app-routing.module.ts @@ -0,0 +1,39 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { StartComponent } from './views/start/start.component'; +import {CustomerManagementComponent} from './views/customer-management/customer-management.component'; +import {LoginComponent} from './views/login/login.component'; +import {RouteInterceptor} from './interceptor/route-interceptor'; +import {AccountingComponent} from './views/accounting/accounting.component'; +import {TechniqueComponent} from './views/technique/technique.component'; +import {SalesComponent} from './views/sales/sales.component'; + + +const routes: Routes = [ + {path: '', redirectTo: '/start', pathMatch: 'full'}, + {path: 'login', component: LoginComponent, data: {breadcrumb: 'Login'}}, + {path: 'start', component: StartComponent, data: {breadcrumb: 'Home'}, canActivate: [RouteInterceptor]}, + {path: 'customer-management', component: CustomerManagementComponent, data: {breadcrumb: 'Kunden'}, canActivate: [RouteInterceptor]}, + // {path: 'accounting', component: AccountingComponent, data: {breadcrumb: 'Buchhaltung'}, canActivate: [RouteInterceptor]}, + // {path: 'technique', component: TechniqueComponent, data: {breadcrumb: 'Technik'}, canActivate: [RouteInterceptor]}, + // {path: 'sales', component: SalesComponent, data: {breadcrumb: 'Vertrieb'}, canActivate: [RouteInterceptor]}, + {path: '**', redirectTo: '/start', pathMatch: 'full'}, +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes, {useHash: true})], + exports: [RouterModule] +}) + +export class AppRoutingModule { + +} + +export const routingComponents = [ + LoginComponent, + StartComponent, + CustomerManagementComponent, + AccountingComponent, + TechniqueComponent, + SalesComponent, +]; diff --git a/plp-angular/src/app/app.component.html b/plp-angular/src/app/app.component.html new file mode 100644 index 0000000..0141938 --- /dev/null +++ b/plp-angular/src/app/app.component.html @@ -0,0 +1,16 @@ +
+ +
+ +
+ +
+
+
+ \ No newline at end of file diff --git a/plp-angular/src/app/app.component.scss b/plp-angular/src/app/app.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/app.component.ts b/plp-angular/src/app/app.component.ts new file mode 100644 index 0000000..78499ca --- /dev/null +++ b/plp-angular/src/app/app.component.ts @@ -0,0 +1,53 @@ +import {Component, OnDestroy, OnInit} from '@angular/core'; +import {AppService} from './services/app.service'; +import {Subscription} from 'rxjs'; +import {IUser} from './model/entities/user'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'] +}) + +export class AppComponent implements OnInit, OnDestroy { + + private loginSub: Subscription; + private userSub: Subscription; + public isLoggedIn: boolean; + public activeUser: IUser; + + constructor(public appService: AppService) { + + } + + ngOnInit() { + this.isLoggedIn = false; + // Observe login state + this.loginSub = this.appService.getLoginState$().subscribe( + data => { + if (data !== null) { + this.isLoggedIn = true; + } else { + this.isLoggedIn = false; + } + } + ); + + this.userSub = this.appService.getUser$().subscribe( + data => { + this.activeUser = data as IUser; + } + ); + + } + + /** + * Destroy + */ + ngOnDestroy(): void { + if (this.loginSub !== null && this.loginSub !== undefined) { + this.loginSub.unsubscribe(); + } + } + +} diff --git a/plp-angular/src/app/app.module.ts b/plp-angular/src/app/app.module.ts new file mode 100644 index 0000000..8e86486 --- /dev/null +++ b/plp-angular/src/app/app.module.ts @@ -0,0 +1,151 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FlatpickrModule } from 'angularx-flatpickr'; +import { NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; +import {AppRoutingModule, routingComponents} from './app-routing.module'; +import { AppComponent } from './app.component'; +import { StartComponent } from './views/start/start.component'; +import { BrowserAnimationsModule} from '@angular/platform-browser/animations'; +import {CalendarModule, DateAdapter} from 'angular-calendar'; +import { adapterFactory} from 'angular-calendar/date-adapters/date-fns'; +import {registerLocaleData} from '@angular/common'; +import localeDe from '@angular/common/locales/de'; +import { CustomerManagementComponent } from './views/customer-management/customer-management.component'; +import { AgGridModule } from 'ag-grid-angular'; +import { LoginComponent } from './views/login/login.component'; +import {FormsModule, ReactiveFormsModule} from '@angular/forms'; +import { AsideComponent } from './components/aside/aside.component'; +import {AppService} from './services/app.service'; +import {CacheService} from './services/cache.service'; +import {MessageService} from './services/message.service'; +import {HttpService} from './services/http.service'; +import {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http'; +import {HttpClientInterceptor} from './services/http.interceptor'; +import {RouteInterceptor} from './interceptor/route-interceptor'; +import { TechniqueComponent } from './views/technique/technique.component'; +import { SalesComponent } from './views/sales/sales.component'; +import { AccountingComponent } from './views/accounting/accounting.component'; +import { ModalComponent } from './components/modal/modal.component'; +import { CustomerViewComponent } from './views/customer-management/customer-view/customer-view.component'; +import { TabsComponent } from './components/tabs/tabs.component'; +import { TabComponent } from './components/tab/tab.component'; +import { CustomerDataViewComponent } from './views/customer-management/customer-view/customer-data-view/customer-data-view.component'; +import { CustomerDataEditComponent } from './views/customer-management/customer-view/customer-data-edit/customer-data-edit.component'; +import { CustomerContactPersonViewComponent } from './views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component'; +import { CustomerContactPersonEditComponent } from './views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component'; +import { CustomerNoteViewComponent } from './views/customer-management/customer-view/customer-note-view/customer-note-view.component'; +import { CustomerNoteEditComponent } from './views/customer-management/customer-view/customer-note-edit/customer-note-edit.component'; +import {CustomerService} from './services/customer.service'; +import { CustomerNoteDetailComponent } from './views/customer-management/customer-view/customer-note-detail/customer-note-detail.component'; +import {GridCheckboxRendererComponent} from './grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component'; +import {GridCheckboxEditorComponent} from './grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component'; +import {GridSelectEditorComponent} from './grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component'; +import {GridSelectRendererComponent} from './grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component'; +import {GridDateEditorComponent} from './grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component'; +import {GridDateRendererComponent} from './grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component'; +import {GridTextRendererComponent} from './grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component'; +import {GridTextEditorComponent} from './grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component'; +import {GridInputRendererComponent} from './grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component'; +import {GridInputEditorComponent} from './grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component'; +import {GridBlockedRendererComponent} from './grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component'; +import {GridBlockedEditorComponent} from './grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component'; +import { CustomerMeetingViewComponent } from './views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component'; +import { CustomerMeetingEditComponent } from './views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component'; +import { CustomerMeetingDetailComponent } from './views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component'; +import { MessageComponent } from './components/message/message.component'; +import { CustomerListComponent } from './views/customer-management/customer-list/customer-list.component'; +import { CustomerContactListComponent } from './views/customer-management/customer-contact-list/customer-contact-list.component'; +import { MeetingListComponent } from './views/start/meeting-list/meeting-list.component'; +import { MeetingCalendarComponent } from './views/start/meeting-calendar/meeting-calendar.component'; +import { CustomerContactPersonDetailComponent } from './views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component'; +import { InternalMeetingEditComponent } from './views/start/internal-meeting-edit/internal-meeting-edit.component'; +import { InternalMeetingDetailComponent } from './views/start/internal-meeting-detail/internal-meeting-detail.component'; +import { CalendarLegendComponent } from './components/calendar-legend/calendar-legend.component'; +import { CommonService } from './services/common.service'; +import {GridRendererComponent} from './grid-cellrenderer/grid-renderer-component'; +import {GridEditorComponent} from './grid-cellrenderer/grid-editor-component'; + + +registerLocaleData(localeDe); + +@NgModule({ + declarations: [ + AppComponent, + routingComponents, + StartComponent, + CustomerManagementComponent, + LoginComponent, + AsideComponent, + TechniqueComponent, + SalesComponent, + AccountingComponent, + ModalComponent, + CustomerViewComponent, + TabsComponent, + TabComponent, + CustomerDataViewComponent, + CustomerDataEditComponent, + CustomerContactPersonViewComponent, + CustomerContactPersonEditComponent, + CustomerNoteViewComponent, + CustomerNoteEditComponent, + CustomerNoteDetailComponent, + GridRendererComponent, + GridEditorComponent, + GridCheckboxRendererComponent, + GridCheckboxEditorComponent, + GridSelectEditorComponent, + GridSelectRendererComponent, + GridDateEditorComponent, + GridDateRendererComponent, + GridBlockedRendererComponent, + GridTextRendererComponent, + GridTextEditorComponent, + GridInputRendererComponent, + GridInputEditorComponent, + GridBlockedEditorComponent, + CustomerMeetingViewComponent, + CustomerMeetingEditComponent, + CustomerMeetingDetailComponent, + MessageComponent, + CustomerListComponent, + CustomerContactListComponent, + MeetingListComponent, + MeetingCalendarComponent, + CustomerContactPersonDetailComponent, + InternalMeetingEditComponent, + InternalMeetingDetailComponent, + CalendarLegendComponent, + ], + imports: [ + BrowserModule, + CommonModule, + NgbModalModule, + FlatpickrModule.forRoot(), + AppRoutingModule, + HttpClientModule, + ReactiveFormsModule, + FormsModule, + BrowserAnimationsModule, + // ScrollToModule.forRoot(), + CalendarModule.forRoot({ + provide: DateAdapter, + useFactory: adapterFactory + }), + AgGridModule, + ], + providers: [ + AppService, + RouteInterceptor, + CacheService, + MessageService, + HttpService, + CustomerService, + CommonService, + {provide: HTTP_INTERCEPTORS, useClass: HttpClientInterceptor, multi: true}, + ], + bootstrap: [AppComponent] +}) + +export class AppModule { } diff --git a/plp-angular/src/app/components/ag-grid-component-const.ts b/plp-angular/src/app/components/ag-grid-component-const.ts new file mode 100644 index 0000000..6c0ceb7 --- /dev/null +++ b/plp-angular/src/app/components/ag-grid-component-const.ts @@ -0,0 +1,158 @@ +import {GridFactory} from '../grid-cellrenderer/grid-factory'; +import {IGridCellParams} from '../grid-cellrenderer/grid-cell-params'; +import {Const} from '../utils/const'; + +export class AgGridComponentConst { + + // Key for cell type (must be used in data of grid item) + public static CELL_KEY_TYPE = 'cellKeyType'; + // Cell renderers + public static CELL_RENDERER_CHECKBOX = 'gridCheckboxRenderer'; + public static CELL_RENDERER_TEXT = 'gridTextRenderer'; + public static CELL_RENDERER_DATE = 'gridDateRenderer'; + public static CELL_RENDERER_INPUT = 'gridInputRenderer'; + public static CELL_RENDERER_SELECT = 'gridSelectRenderer'; + public static CELL_RENDERER_BLOCKED = 'gridBlockedRenderer'; + public static CELL_RENDERER_DEFAULT = ''; + // Cell editors + public static CELL_EDITOR_CHECKBOX = 'gridCheckboxEditor'; + public static CELL_EDITOR_TEXT = 'gridTextEditor'; + public static CELL_EDITOR_DATE = 'gridDateEditor'; + public static CELL_EDITOR_INPUT = 'gridInputEditor'; + public static CELL_EDITOR_SELECT = 'gridSelectEditor'; + public static CELL_EDITOR_BLOCKED = 'gridBlockedEditor'; + public static CELL_EDITOR_DEFAULT = ''; + // Cell types + public static CELL_TYPE_DEFAULT = 'default'; + public static CELL_TYPE_CHECKBOX = 'checkbox'; + public static CELL_TYPE_TEXT = 'text'; + public static CELL_TYPE_DATE = 'date'; + public static CELL_TYPE_INPUT = 'input'; + public static CELL_TYPE_SELECT = 'select'; + public static CELL_TYPE_BLOCKED = 'blocked'; + + // Cell units + public static CELL_UNIT_PERCENT = '%'; + public static CELL_UNIT_EURO = '€'; + public static CELL_UNIT_DAYS = ' Tage'; + public static CELL_UNIT_SQUARE_METER: string = ' ' + Const.UNIT_SQUARE_METER; + + // Cell value types + public static CELL_VALUE_TYPE_BOOL = 'bool'; + public static CELL_VALUE_TYPE_INT = 'int'; + public static CELL_VALUE_TYPE_FLOAT = 'float'; + public static CELL_VALUE_TYPE_STRING = 'string'; + + public static validCellUnits: string[] = [ + AgGridComponentConst.CELL_UNIT_PERCENT, + AgGridComponentConst.CELL_UNIT_EURO, + AgGridComponentConst.CELL_UNIT_DAYS, + AgGridComponentConst.CELL_UNIT_SQUARE_METER, + ]; + + public static validCellValueTypes: string[] = [ + AgGridComponentConst.CELL_VALUE_TYPE_BOOL, + AgGridComponentConst.CELL_VALUE_TYPE_INT, + AgGridComponentConst.CELL_VALUE_TYPE_FLOAT, + AgGridComponentConst.CELL_VALUE_TYPE_STRING, + ]; + + public static gridInputError: string; + + /** + * Sets input error + */ + public static setGridInputError(errorMessage: string = null): void { + AgGridComponentConst.gridInputError = errorMessage; + if (null !== errorMessage) { + setTimeout(() => { + AgGridComponentConst.setGridInputError(); + }, 10); + } + } + + /** + * Returns a cell renderer for given type with given parameters + */ + public static cellRendererSelector(params: any, gridCellParams: IGridCellParams = null): {} { + if (null === gridCellParams) { + gridCellParams = GridFactory.getGridCellParams(); + } + + AgGridComponentConst.checkCellValueType(gridCellParams.type); + AgGridComponentConst.checkCellUnit(gridCellParams.unit); + switch (params.data[AgGridComponentConst.CELL_KEY_TYPE]) { + case AgGridComponentConst.CELL_TYPE_CHECKBOX: + return {component: AgGridComponentConst.CELL_RENDERER_CHECKBOX, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_TEXT: + return {component: AgGridComponentConst.CELL_RENDERER_TEXT, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_INPUT: + return {component: AgGridComponentConst.CELL_RENDERER_INPUT, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_DATE: + return {component: AgGridComponentConst.CELL_RENDERER_DATE, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_SELECT: + return {component: AgGridComponentConst.CELL_RENDERER_SELECT, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_BLOCKED: + return {component: AgGridComponentConst.CELL_RENDERER_BLOCKED, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_DEFAULT: + // Nothing specific, so ag grid will take it's own default cell renderer + return; + default: + throw new Error('Unknown cell type'); + } + } + + /** + * Returns a cell editor for given type with given parameters + */ + public static cellEditorSelector(params: any, gridCellParams: IGridCellParams = null) { + if (null === gridCellParams) { + gridCellParams = GridFactory.getGridCellParams(); + } + + AgGridComponentConst.checkCellValueType(gridCellParams.type); + AgGridComponentConst.checkCellUnit(gridCellParams.unit); + switch (params.data[AgGridComponentConst.CELL_KEY_TYPE]) { + case AgGridComponentConst.CELL_TYPE_CHECKBOX: + // NOTE: Overwrite any given type for checkbox with boolean, since checkbox can only hold boolean values + gridCellParams.type = AgGridComponentConst.CELL_VALUE_TYPE_BOOL; + return {component: AgGridComponentConst.CELL_EDITOR_CHECKBOX, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_TEXT: + return {component: AgGridComponentConst.CELL_EDITOR_TEXT, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_INPUT: + return {component: AgGridComponentConst.CELL_EDITOR_INPUT, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_DATE: + return {component: AgGridComponentConst.CELL_EDITOR_DATE, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_SELECT: + return {component: AgGridComponentConst.CELL_EDITOR_SELECT, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_BLOCKED: + return {component: AgGridComponentConst.CELL_EDITOR_BLOCKED, params: gridCellParams}; + case AgGridComponentConst.CELL_TYPE_DEFAULT: + // Nothing specific, so ag grid will take it's own default cell editor + return; + default: + throw new Error('Unknown cell type'); + } + } + + /** + * Checks if cell value type is valid + * @param {string} type + */ + private static checkCellValueType(type: string = null): void { + if (null !== type && AgGridComponentConst.validCellValueTypes.indexOf(type) < 0) { + throw new Error('Unknown cell value type'); + } + } + + /** + * Checks if cell unit is valid + * @param {string} type + */ + private static checkCellUnit(type: string = null): void { + if (null !== type && AgGridComponentConst.validCellUnits.indexOf(type) < 0) { + throw new Error('Unknown cell value type'); + } + } + +} diff --git a/plp-angular/src/app/components/ag-grid-component.ts b/plp-angular/src/app/components/ag-grid-component.ts new file mode 100644 index 0000000..83bc7a8 --- /dev/null +++ b/plp-angular/src/app/components/ag-grid-component.ts @@ -0,0 +1,466 @@ +import {path} from '../../environments/path'; +import {AgGridLocale} from '../lang/ag-gridlocale'; +import {IGridValidationErrors} from '../model/virtual/grid-validation-errors'; +import {GridSelectEditorComponent} from '../grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component'; +import {GridSelectRendererComponent} from '../grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component'; +import {GridCheckboxRendererComponent} from '../grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component'; +import {GridCheckboxEditorComponent} from '../grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component'; +import {GridDateRendererComponent} from '../grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component'; +import {GridDateEditorComponent} from '../grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component'; +import {GridTextRendererComponent} from '../grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component'; +import {GridTextEditorComponent} from '../grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component'; +import {AgGridComponentConst} from './ag-grid-component-const'; +import {GridInputRendererComponent} from '../grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component'; +import {GridInputEditorComponent} from '../grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component'; +import {GridBlockedRendererComponent} from '../grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component'; +import {GridBlockedEditorComponent} from '../grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component'; +import {Utils} from '../utils/utils'; + +export class AgGridComponent { + static readonly MIN_HEIGHT: number = 16; + public params: any; + public columnDefs: any[] = []; + public defaultColDef: {} = {}; + public rowData: any[] = []; + public rowSelection: string; + public gridParamsColumnApi; + public gridParamsApi; + public apiAssetsPath: string; + public resetSearchBtn: boolean; + public localeText: {}; + public frameworkComponents: {}; + public bSizeColumnsToFit: boolean; + public gridErrors: IGridValidationErrors[]; + public errorIndex: number; + public resetValueByError: boolean; + public errorMessage: string; + public nextAddedItemId: number; + + /** + * Constructor + */ + constructor(bSizeColumnsToFit: boolean = true) { + AgGridComponentConst.setGridInputError(); + this.rowData = []; + this.columnDefs = []; + this.rowSelection = 'multiple'; + this.defaultColDef = { + editable: true + }; + this.apiAssetsPath = path.path_assets; + this.frameworkComponents = {}; + this.localeText = AgGridLocale.getLocale(); + this.bSizeColumnsToFit = bSizeColumnsToFit; + this.gridErrors = []; + this.errorIndex = -1; + this.resetValueByError = false; + this.errorMessage = null; + this.nextAddedItemId = null; + + this.frameworkComponents = { + gridSelectEditor: GridSelectEditorComponent, + gridSelectRenderer: GridSelectRendererComponent, + gridCheckboxRenderer: GridCheckboxRendererComponent, + gridCheckboxEditor: GridCheckboxEditorComponent, + gridDateRenderer: GridDateRendererComponent, + gridDateEditor: GridDateEditorComponent, + gridInputRenderer: GridInputRendererComponent, + gridInputEditor: GridInputEditorComponent, + gridTextRenderer: GridTextRendererComponent, + gridTextEditor: GridTextEditorComponent, + gridBlockedRenderer: GridBlockedRendererComponent, + gridBlockedEditor: GridBlockedEditorComponent + }; + } + + /** + * Callback on grid ready + */ + public onGridReady(params): void { + this.params = params; + this.gridParamsColumnApi = params.columnApi; + this.gridParamsApi = params.api; + + // Set for cadasters + if (!this.bSizeColumnsToFit) { + const allColumnIds = []; + this.gridParamsColumnApi.getAllColumns().forEach((column) => { + allColumnIds.push(column.colId); + }); + this.gridParamsColumnApi.autoSizeColumns(allColumnIds); + } + } + + /** + * On row clicked + */ + public onRowClicked(e): void { + // Reset error message + AgGridComponentConst.setGridInputError(); + this.errorMessage = null; + } + + /** + * On cell editing stopped + */ + public onCellEditingStopped(e): void { + if (null !== AgGridComponentConst.gridInputError) { + this.errorMessage = AgGridComponentConst.gridInputError; + e.api.ensureIndexVisible(e.rowIndex, 'middle'); + e.api.ensureColumnVisible(e.colDef.field.toString()); + } else { + this.errorMessage = null; + } + } + + /** + * Sizes columns to fit + */ + public onFirstDataRendered(params: any): void { + // Set for info components + if (this.bSizeColumnsToFit) { + params.api.sizeColumnsToFit(); + } + } + + /** + * Resizes grid + */ + public gridSizeChanged(params: any): void { + if (undefined !== this.gridParamsApi) { + this.gridParamsApi.sizeColumnsToFit(); + } + } + + /** + * Search Form + */ + public searchFormSubmit(params: any): void { + if (params.target.value !== '') { + this.resetSearchBtn = true; + this.gridParamsApi.setQuickFilter(params.target.value); + } else { + this.resetSearchBtn = false; + this.gridParamsApi.setQuickFilter(null); + } + } + + /** + * Reset search input + */ + public resetSearch(e: any): void { + e.originalTarget[0].value = ''; + this.resetSearchBtn = false; + this.gridParamsApi.setQuickFilter(null); + } + + /** + * Stop editing state + */ + public stopEditing(): void { + this.params.api.stopEditing(); + } + + /** + * Configures scrollToService - https://www.npmjs.com/package/@nicky-lenaers/ngx-scroll-to + */ + public scrollTo(targetFieldName: string = null, lastFieldName: string = null): void { + if (null !== targetFieldName) { + if (null !== lastFieldName) { + // Scroll to last field first to ensure our target field name is on left-hand side + this.params.api.ensureColumnVisible(lastFieldName); + } + this.params.api.ensureColumnVisible(targetFieldName); + } + } + + /** + * Cell renderer selector for individual cells with optional default parameters + */ + public cellRendererSelector(params: any): {} { + return AgGridComponentConst.cellRendererSelector(params); + } + + /** + * Cell editor selector for individual cells + */ + public cellEditorSelector(params: any): {} { + return AgGridComponentConst.cellEditorSelector(params); + } + + /** + * Validates grid + */ + public validateGrid(): boolean { + const oldErrors: IGridValidationErrors[] = this.gridErrors; + this.gridErrors = []; + this.errorIndex = -1; + + const primaryColumns = this.params.api.columnController.primaryColumns; + const errorColumn: any[] = []; + const errors: IGridValidationErrors[] = []; + + primaryColumns.forEach((value) => { + if (undefined !== value.colDef.cellEditorParams) { + if (undefined !== value.colDef.cellEditorParams.mandatory && true === value.colDef.cellEditorParams.mandatory) { + errorColumn.push(value.colDef.field); + } + } + }); + + errorColumn.forEach((value, i) => { + this.params.api.forEachNode((rowNode, index) => { + if (null === rowNode.data[value] || undefined === rowNode.data[value]) { + errors.push({ + column: value, + row: index + }); + } + }); + }); + this.gridErrors = errors; + + if (this.gridErrors.length !== 0) { + if (oldErrors.length !== this.gridErrors.length) { + this.params.api.ensureIndexVisible(this.gridErrors[0].row, 'middle'); + this.params.api.ensureColumnVisible(this.gridErrors[0].column); + } + } + + return this.gridErrors.length === 0; + } + + /** + * Jumps to error + */ + public jumpToError(direction: string): void { + const errorLength: number = this.gridErrors.length - 1; + // If any errors + if (errorLength >= 0) { + // if errorIndex is smaller or same as list of all errors + if (errorLength === 0) { + this.errorIndex = 0; + } else { + if (direction === 'next') { + this.errorIndex = this.errorIndex < errorLength ? this.errorIndex + 1 : 0; + } else { + this.errorIndex = this.errorIndex <= 0 ? errorLength : this.errorIndex - 1; + } + } + this.params.api.ensureIndexVisible(this.gridErrors[this.errorIndex].row, 'middle'); + this.params.api.ensureColumnVisible(this.gridErrors[this.errorIndex].column); + } else { + // reset errorIndex if no errors + this.errorIndex = -1; + } + } + + /** + * Shows input error + */ + public showInputError(positionIndex: number, field: string, oldValue: string, type: string): void { + this.resetValueByError = true; + this.params.api.clearFocusedCell(); + this.params.api.ensureIndexVisible(positionIndex, 'middle'); + this.params.api.ensureColumnVisible(field); + // Lifecycle hack + setTimeout(() => { + // Reset to old value + this.params.api.getRowNode(positionIndex).setDataValue(field, oldValue); + this.params.api.startEditingCell({ + rowIndex: positionIndex, + colKey: field, + }); + switch (type) { + case 'int': + this.errorMessage = 'Bitte geben Sie einen ganzzahligen Wert ein.'; + break; + case 'float': + this.errorMessage = 'Bitte geben Sie einen dezimalen oder ganzzahligen Wert ein.'; + break; + } + }, 10); + } + + /** + * Add row to grid and returns position index + */ + public addRow(item: {}): number { + this.initNextAddedItemId(); + const rowModel = this.gridParamsApi.rowModel; + // Note: default is last row + let addIndex: number = rowModel.rowsToDisplay.length + 1; + rowModel.rowsToDisplay.forEach((row, i) => { + if (row.selected === true) { + // Note: Add index is the row after selected row + addIndex = i + 1; + return; + } + }); + this.gridParamsApi.updateRowData({ + add: [item], + addIndex + }); + return addIndex; + } + + /** + * Removes selected rows + */ + public removeRows(): void { + this.initNextAddedItemId(); + const selectedRows: {}[] = this.gridParamsApi.getSelectedRows(); + this.gridParamsApi.updateRowData({remove: selectedRows}); + } + + /** + * Gets next row position + */ + public getNextRowPosition(): number { + return this.gridParamsApi.rowModel.length + 1; + } + + /** + * inits next dummy id for next added entry, if necessary + */ + private initNextAddedItemId(): void { + if (this.nextAddedItemId === null) { + this.nextAddedItemId = (this.rowData.length + 1) * -1; + } + } + + /** + * Returns dummy id for added entry + */ + public getNextAddedItemId(): number { + this.initNextAddedItemId(); + const res: number = this.nextAddedItemId; + this.nextAddedItemId--; + return res; + } + + /** + * column resize event + */ + public onColumnResized(event): void { + if (event.finished !== false) { + event.api.setHeaderHeight(AgGridComponent.MIN_HEIGHT); + const headerCells = Array.from(document.querySelectorAll('.content .ag-header-cell-label')); + let minHeight: number = AgGridComponent.MIN_HEIGHT; + headerCells.forEach(cell => { + minHeight = Math.max(minHeight, cell.scrollHeight); + }); + + // set header height to calculated height + padding (top: 8px, bottom: 8px) + event.api.setHeaderHeight(minHeight + 16); + } + if (event.finished) { + this.gridParamsApi.resetRowHeights(); + } + } + + /** + * Renders colored dot + */ + public dotRenderer(params): string { + return ''; + } + + /** + * Renders email address + */ + public emailRenderer(params): string { + return null !== params.value ? '' + params.value + '' : ''; + } + + /** + * Renders phone number + */ + public phoneRenderer(params): string { + return null !== params.value ? '' + params.value + '' : ''; + } + + /** + * Renders phone number + */ + public urlRenderer(params): string { + return null !== params.value ? '' + params.value + '' : ''; + } + + /** + * option renderer + */ + public optionRenderer(params): string { + return params.data.is_option_meeting ? 'Ja' : ''; + } + + /** + * address renderer + */ + public addressRenderer(params): string { + let address = ''; + if (params.data.typeType === 'visit') { + const street = params.data.street !== null ? params.data.street : ''; + const streetNo = params.data.street_no !== null ? params.data.street_no : ''; + const zip = params.data.zip !== null ? params.data.zip : ''; + const city = params.data.city !== null ? params.data.city : ''; + let br = ''; + if (zip !== null || city !== null) { + br = '
'; + } + address = street + ' ' + streetNo + ' ' + br + zip + ' ' + city; + } + return address; + } + + /** + * participants renderer + */ + public participantsRenderer(params): string { + let participantNames = ''; + params.data.participants.forEach((value) => { + participantNames += params.data.that.appService.getConfig().vc_user_by_id[value.participant_user_id].firstname + + ' ' + params.data.that.appService.getConfig().vc_user_by_id[value.participant_user_id].lastname + '
'; + }); + return participantNames; + } + + /** + * Time renderer + */ + public timeRenderer(params): string { + return Utils.getDateTimeToDisplay(params.value, false, true); + } + + /** + * Date renderer + */ + public dateRenderer(params): string { + return Utils.getDateTimeToDisplay(params.value); + } + + /** + * Datetime renderer + */ + public dateTimeRenderer(params): string { + return Utils.getDateTimeToDisplay(params.value, true, true); + } + + /** + * Date comparator + */ + public dateComparator(date1, date2, callbackCheck: boolean = true) { + if (date1 === null && date2 === null) { + return 0; + } + if (date1 === null) { + return -1; + } + if (date2 === null) { + return 1; + } + const stamp1: number = Utils.getParsedDate(date1); + const stamp2: number = Utils.getParsedDate(date2); + return stamp1 < stamp2 ? 1 : stamp1 === stamp2 ? 0 : -1; + } +} diff --git a/plp-angular/src/app/components/aside/aside.component.html b/plp-angular/src/app/components/aside/aside.component.html new file mode 100644 index 0000000..c967d23 --- /dev/null +++ b/plp-angular/src/app/components/aside/aside.component.html @@ -0,0 +1,9 @@ +
+ Startseite +
+ +
Logout
\ No newline at end of file diff --git a/plp-angular/src/app/components/aside/aside.component.scss b/plp-angular/src/app/components/aside/aside.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/components/aside/aside.component.ts b/plp-angular/src/app/components/aside/aside.component.ts new file mode 100644 index 0000000..9756e76 --- /dev/null +++ b/plp-angular/src/app/components/aside/aside.component.ts @@ -0,0 +1,37 @@ +import { Component, OnInit } from '@angular/core'; +import {AppService} from '../../services/app.service'; + +@Component({ + selector: 'app-aside', + templateUrl: './aside.component.html', + styleUrls: ['./aside.component.scss'] +}) + +export class AsideComponent implements OnInit { + + /* Navigation items */ + public navItems: Array; + + constructor(public appService: AppService) { } + + ngOnInit() { + this.navItems = []; + this.navItems.push({name: 'Kunden', route: '/customer-management', className: 'customer-management'}); + this.navItems.push({name: 'Betreiber', route: '/operators', className: 'operators'}); + this.navItems.push({name: 'Produzenten', route: '/productions', className: 'productions'}); + this.navItems.push({name: 'Service', route: '/service', className: 'service'}); + // this.navItems.push({name: 'Buchhaltung', route: '/accounting', className: 'accounting'}); + // this.navItems.push({name: 'Produktion', route: '/production', className: 'production'}); + // this.navItems.push({name: 'Service', route: '/service', className: 'service'}); + // this.navItems.push({name: 'Technik', route: '/technique', className: 'technique'}); + // this.navItems.push({name: 'Vertrieb', route: '/sales', className: 'sales'}); + } + + /** + * Logout + */ + public logout(): void { + this.appService.logout(); + } + +} diff --git a/plp-angular/src/app/components/calendar-legend/calendar-legend.component.html b/plp-angular/src/app/components/calendar-legend/calendar-legend.component.html new file mode 100644 index 0000000..bc9edcc --- /dev/null +++ b/plp-angular/src/app/components/calendar-legend/calendar-legend.component.html @@ -0,0 +1,3 @@ +
    +
  • {{l.name}}
  • +
\ No newline at end of file diff --git a/plp-angular/src/app/components/calendar-legend/calendar-legend.component.scss b/plp-angular/src/app/components/calendar-legend/calendar-legend.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/components/calendar-legend/calendar-legend.component.ts b/plp-angular/src/app/components/calendar-legend/calendar-legend.component.ts new file mode 100644 index 0000000..e039a39 --- /dev/null +++ b/plp-angular/src/app/components/calendar-legend/calendar-legend.component.ts @@ -0,0 +1,34 @@ +import { Component, OnInit } from '@angular/core'; +import {ICalendarLegend} from '../../model/entities/calendar-legend'; + +@Component({ + selector: 'app-calendar-legend', + templateUrl: './calendar-legend.component.html', + styleUrls: ['./calendar-legend.component.scss'] +}) +export class CalendarLegendComponent implements OnInit { + + public legendEntries: ICalendarLegend[]; + + constructor() { } + + ngOnInit() { + // this.legendEntries = []; + this.legendEntries = [ + {id: 1, type: 'customer', name: 'Kunden'}, + {id: 2, type: 'operator', name: 'Betreiber'}, + {id: 3, type: 'internal', name: 'Intern'}, + {id: 4, type: 'production', name: 'Produzenten'}, + {id: 5, type: 'service', name: 'Service'}, + ]; + } + + /** + * + * @param legendEntries + */ + public setData(legendEntries: []): void { + // this.legendEntries = legendEntries; + } + +} diff --git a/plp-angular/src/app/components/form-component.ts b/plp-angular/src/app/components/form-component.ts new file mode 100644 index 0000000..a76d8c2 --- /dev/null +++ b/plp-angular/src/app/components/form-component.ts @@ -0,0 +1,37 @@ +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; + +export class FormComponent { + public errorMsg: string; + public isCreationMode: boolean; + // protected scrollToService: ScrollToService; + + + // constructor(scrollToService: ScrollToService) { + // this.scrollToService = scrollToService; + // this.errorMsg = ''; + // this.isCreationMode = false; + // } + + constructor() { + this.errorMsg = ''; + this.isCreationMode = false; + } + + public checkDate(e: any): void { + const checkedDate: Date = new Date(e.target.value.replace(/\s/, 'T')); + const today: Date = new Date(); + today.setHours(0); + today.setMinutes(0); + today.setSeconds(1); + if (checkedDate < today) { + alert('Hinweis: Das Datum liegt in der Vergangenheit.\nVergangene Termine können nicht bearbeitet oder gelöscht werden.'); + } + } + + /** + * Configures scrollToService - https://www.npmjs.com/package/@nicky-lenaers/ngx-scroll-to + */ + // public scrollUp(identifier: string): void { + // this.scrollToService.scrollTo({target: identifier}); + // } +} diff --git a/plp-angular/src/app/components/message/message.component.html b/plp-angular/src/app/components/message/message.component.html new file mode 100644 index 0000000..10967d7 --- /dev/null +++ b/plp-angular/src/app/components/message/message.component.html @@ -0,0 +1,18 @@ +
+
+

{{message}}

+

+ +
+
+
+
+

{{message}}

+
+
+
+
+

{{message}}

+ +
+
\ No newline at end of file diff --git a/plp-angular/src/app/components/message/message.component.scss b/plp-angular/src/app/components/message/message.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/components/message/message.component.ts b/plp-angular/src/app/components/message/message.component.ts new file mode 100644 index 0000000..9803b22 --- /dev/null +++ b/plp-angular/src/app/components/message/message.component.ts @@ -0,0 +1,141 @@ +import {Component, OnDestroy, OnInit} from '@angular/core'; +import {MessageService} from '../../services/message.service'; +import {Subscription} from 'rxjs'; + +@Component({ + selector: 'app-message', + templateUrl: './message.component.html', + styleUrls: ['./message.component.scss'] +}) + +export class MessageComponent implements OnInit, OnDestroy { + + // Message display time in milliseconds + static MESSAGE_DISPLAY_TIME = 2000; + + // Client Error codes + static CLIENT_ERROR_DATA = 1; + static CLIENT_ERROR_VALIDATION_FAILED = 2; + + + private messageSub: Subscription; + public showError: boolean; + public showSuccess: boolean; + public showInfo: boolean; + public showClientError: boolean; + public message: string; + public optionalInfo: string; + + public errorMessages: string[]; + public successMessages: string[]; + public infoMessages: string[]; + public clientErrorMessages: string[]; + + constructor(private messageService: MessageService) { + // Init client error messages + this.clientErrorMessages = []; + this.clientErrorMessages[MessageComponent.CLIENT_ERROR_DATA] = 'Die Daten sind unvollständig oder fehlerhaft.'; + this.clientErrorMessages[MessageComponent.CLIENT_ERROR_VALIDATION_FAILED] = 'Die Daten sind nicht valide, kein Speichern möglich. Bitte überprüfen Sie Ihre Eingaben.'; + } + + ngOnInit() { + this.messageSub = this.messageService.getMessage$().subscribe( + data => { + if (data !== null) { + if (data.error_code != 0) { + this.showErrorMessage(data.error_code, data.error_msg, data.optional_info); + } else if (data.success_code != 0) { + this.showSuccessMessage(data.success_code, data.success_msg); + } else if (data.info_code != 0) { + this.showInfoMessage(data.info_code, data.info_msg); + } else if (data.client_error_code != 0) { + this.showClientErrorMessage(data.client_error_code); + } + } + }); + + this.showError = false; + this.showSuccess = false; + this.showInfo = false; + this.showClientError = false; + this.message = ''; + this.optionalInfo = null; + } + + /** + * Shows error message + * @param {number} errorCode + * @param {string} errorMsg + * @param {string} optionalInfo + */ + public showErrorMessage(errorCode: number, errorMsg: string, optionalInfo: string = null): void { + this.showError = true; + this.showSuccess = false; + this.showInfo = false; + this.showClientError = false; + this.message = errorMsg; + // Set optional info (if exists) + this.optionalInfo = null !== optionalInfo ? optionalInfo : null; + } + + /** + * Shows success message + * @param {number} successCode + * @param {string} successMsg + */ + public showSuccessMessage(successCode: number, successMsg: string): void { + this.showSuccess = true; + this.showError = false; + this.showInfo = false; + this.showClientError = false; + const me: MessageComponent = this; + this.message = successMsg; + setTimeout(function() { + me.closeComponent(); + }, MessageComponent.MESSAGE_DISPLAY_TIME); + } + + /** + * Shows info message + * @param {number} infoCode + * @param {string} infoMsg + */ + public showInfoMessage(infoCode: number, infoMsg: string): void { + this.showInfo = true; + this.showSuccess = false; + this.showError = false; + this.showClientError = false; + this.message = infoMsg; + } + + /** + * Shows client error message + * @param {number} clientErrorCode + */ + public showClientErrorMessage(clientErrorCode: number): void { + this.showInfo = false; + this.showSuccess = false; + this.showError = false; + this.showClientError = true; + if (this.clientErrorMessages[clientErrorCode]) { + this.message = this.clientErrorMessages[clientErrorCode]; + } + } + + /** + * Hides error- / success-message + */ + public closeComponent(): void { + this.showError = false; + this.showSuccess = false; + this.showInfo = false; + this.showClientError = false; + this.message = ''; + } + + ngOnDestroy(): void { + if (this.messageSub !== null) { + this.messageSub.unsubscribe(); + } + } +} diff --git a/plp-angular/src/app/components/modal/modal.component.html b/plp-angular/src/app/components/modal/modal.component.html new file mode 100644 index 0000000..2ec0a7e --- /dev/null +++ b/plp-angular/src/app/components/modal/modal.component.html @@ -0,0 +1,8 @@ + + + diff --git a/plp-angular/src/app/components/modal/modal.component.scss b/plp-angular/src/app/components/modal/modal.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/components/modal/modal.component.ts b/plp-angular/src/app/components/modal/modal.component.ts new file mode 100644 index 0000000..5b8bcab --- /dev/null +++ b/plp-angular/src/app/components/modal/modal.component.ts @@ -0,0 +1,79 @@ +import {AfterContentInit, Component, EventEmitter, OnInit, Input, Output, Renderer2} from '@angular/core'; + +@Component({ + selector: 'app-spt-modal', + templateUrl: './modal.component.html', + styleUrls: ['./modal.component.scss'] +}) + +export class ModalComponent implements OnInit, AfterContentInit { + + @Input() autoclose = true; + @Input() overlay = false; + @Output() state: EventEmitter = new EventEmitter(); + @Output() onClose: EventEmitter = new EventEmitter(); + + public showModal: boolean; + public isVisible: boolean; + + constructor(private renderer: Renderer2) { } + + ngOnInit() { + this.showModal = false; + this.isVisible = false; + } + + /** + * After content children are set + */ + ngAfterContentInit() { + this.isVisible = true; + } + + /** + * Opens modal dialog + */ + public openModal(): void { + this.showModal = true; + this.renderer.addClass(document.body, 'body--modal-open'); + this.state.emit(this.showModal); + } + + /** + * Closes modal dialog if no parameter showDialog == false + */ + public closeModal(): void { + if (!this.autoclose) { + this.onClose.emit(true); + } else { + this.exitModal(); + } + } + + /** + * Closes modal dialog with confirm message + */ + public closeWithConfirm(message: string): boolean { + if (confirm(message)) { + this.exitModal(); + return true; + } + return false; + } + + /** + * Closes modal dialog + */ + public exitModal(): void { + this.showModal = false; + this.renderer.removeClass(document.body, 'body--modal-open'); + this.state.emit(this.showModal); + } + + /** + * Returns if modal is open + */ + public isOpen(): boolean { + return this.showModal; + } +} diff --git a/plp-angular/src/app/components/tab/tab.component.html b/plp-angular/src/app/components/tab/tab.component.html new file mode 100644 index 0000000..66cb94a --- /dev/null +++ b/plp-angular/src/app/components/tab/tab.component.html @@ -0,0 +1,3 @@ +
+ +
diff --git a/plp-angular/src/app/components/tab/tab.component.scss b/plp-angular/src/app/components/tab/tab.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/components/tab/tab.component.ts b/plp-angular/src/app/components/tab/tab.component.ts new file mode 100644 index 0000000..dd0ef26 --- /dev/null +++ b/plp-angular/src/app/components/tab/tab.component.ts @@ -0,0 +1,21 @@ +import {Component, Input, OnInit} from '@angular/core'; + +@Component({ + selector: 'app-tab', + templateUrl: './tab.component.html', + styleUrls: ['./tab.component.scss'] +}) + +export class TabComponent implements OnInit { + + @Input('tabTitle') title: string; + @Input('tabIndex') index: number; + @Input() active = false; + @Input() disabled = false; + + constructor() { } + + ngOnInit() { + } + +} diff --git a/plp-angular/src/app/components/tabs/tabs.component.html b/plp-angular/src/app/components/tabs/tabs.component.html new file mode 100644 index 0000000..dc8a927 --- /dev/null +++ b/plp-angular/src/app/components/tabs/tabs.component.html @@ -0,0 +1,10 @@ +
+
    +
  • + {{tab.title}} +
  • +
+
+ +
+
diff --git a/plp-angular/src/app/components/tabs/tabs.component.scss b/plp-angular/src/app/components/tabs/tabs.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/components/tabs/tabs.component.ts b/plp-angular/src/app/components/tabs/tabs.component.ts new file mode 100644 index 0000000..cd7e58c --- /dev/null +++ b/plp-angular/src/app/components/tabs/tabs.component.ts @@ -0,0 +1,99 @@ +import { + AfterContentInit, + Component, + ContentChildren, + EventEmitter, + Input, + Output, + QueryList +} from '@angular/core'; +import {TabComponent} from '../tab/tab.component'; + +@Component({ + selector: 'app-tabs', + templateUrl: './tabs.component.html', + styleUrls: ['./tabs.component.scss'] +}) + +export class TabsComponent implements AfterContentInit { + + @ContentChildren(TabComponent) tabs: QueryList; + @Input() notifyOnChange = false; + @Output() onChange: EventEmitter = new EventEmitter(); + + constructor() { } + + /** + * After content children are set + */ + public ngAfterContentInit(): void { + // get all active tabs + const activeTabs = this.tabs.filter((tab) => tab.active); + + // if there is no active tab set, activate the first + if (activeTabs.length === 0) { + this.setSelectedTabIndex(0); + } + } + + /** + * Eventlistener for tab change + * @param {TabComponent} tab + */ + public selectTab(tab: TabComponent): void { + if (!tab.disabled) { + if (this.notifyOnChange) { + this.onChange.emit(tab.index); + } else { + this.setSelectedTabIndex(tab.index); + } + } + } + + /** + * Sets selected tab by given + * @param {number} i + */ + public setSelectedTabIndex(i: number): void { + if (this.tabs != null) { + const tabsArray: TabComponent[] = this.tabs.toArray(); + if (i < tabsArray.length) { + // Deactivate all tabs + tabsArray.forEach(tab => tab.active = false); + // Activate the tab the user has clicked on. + tabsArray[i].active = true; + } + } + } + + /** + * Disable tab at given index + * @param {number} i + */ + public disableTabIndex(i: number): void { + this.toggleTabIndex(i, false); + } + + /** + * Enable tab at given index + * @param {number} i + */ + public enableTabIndex(i: number): void { + this.toggleTabIndex(i, true); + } + + /** + * Sets selected tab disabled/enabled + * @param {number} i + * @param {boolean} enable + */ + private toggleTabIndex(i: number, enable: boolean): void { + if (this.tabs != null) { + const tabsArray: TabComponent[] = this.tabs.toArray(); + if (i < tabsArray.length) { + tabsArray[i].disabled = !enable; + } + } + } + +} diff --git a/plp-angular/src/app/factory/factory.ts b/plp-angular/src/app/factory/factory.ts new file mode 100644 index 0000000..54f3469 --- /dev/null +++ b/plp-angular/src/app/factory/factory.ts @@ -0,0 +1,186 @@ +import {IMessage} from '../model/virtual/message'; +import {ICustomer} from '../model/entities/customer'; +import {ICustomerContact} from '../model/entities/customer-contact'; +import {ICustomerNote} from '../model/entities/customer-note'; +import {ICustomerMeeting} from '../model/entities/customer-meeting'; +import {IUser} from '../model/entities/user'; +import {IMeetingType} from '../model/entities/meeting-type'; +import {IInternalMeeting} from '../model/entities/internal-meeting'; +import {Utils} from '../utils/utils'; +export class Factory { + + static getEmptyUser(): IUser { + const emptyUser: {} = { + id: null, + email: null, + firstname: null, + lastname: null, + active: false + }; + return emptyUser as IUser; + } + + /** + * Returns empty message + */ + static getEmptyMessage(errorCode: number, errorMsg: string, successCode: number, successMsg: string, + infoCode: number, infoMsg: string, clientErrorCode: number, optionalInfo: string = null): IMessage { + const emptyMessage: {} = { + error_code: errorCode, + error_msg: errorMsg, + success_code: successCode, + success_msg: successMsg, + info_code: infoCode, + info_msg: infoMsg, + client_error_code: clientErrorCode, + optional_info: optionalInfo + }; + return emptyMessage as IMessage; + } + + /** + * Returns empty customer + */ + static getEmptyCustomer(): ICustomer { + const emptyCustomer: {} = { + id: null, + old_plp_id: null, + name: null, + name_additional: null, + consultant_user_id: null, + street: null, + street_no: null, + zip: null, + city: null, + country_id: null, + url: null, + email: null, + phone_no: null, + mobile_no: null, + fax_no: null, + comment: null, + active: true, + }; + return emptyCustomer as ICustomer; + } + + /** + * Returns empty customer contact person + */ + static getEmptyCustomerContact(customerId: number = null): ICustomerContact { + const emptyCustomerContact: {} = { + id: null, + customer_id: customerId, + gender: null, + firstname: null, + lastname: null, + email: null, + phone_no: null, + mobile_no: null, + fax_no: null, + department: null, + date_of_birth: null, + comment: null, + street: null, + street_no: null, + zip: null, + city: null, + country_id: null, + is_xmas_mail_recipient: false, + }; + return emptyCustomerContact as ICustomerContact; + } + + static getEmptyCustomerNote(customerId: number = null, noteDate: string = null): ICustomerNote { + const emptyCustomerNote: {} = { + id: customerId, + customer_id: null, + customer_contact_id: null, + user_id: null, + gender: null, + firstname: null, + lastname: null, + email: null, + phone_no: null, + mobile_no: null, + fax_no: null, + department: null, + title: null, + comment: null, + note_date: noteDate, + creation_date: null, + creation_user_id: null, + creation_user_firstname: null, + creation_user_lastname: null + }; + return emptyCustomerNote as ICustomerNote; + } + + static getEmptyCustomerMeeting(customerId: number = null): ICustomerMeeting { + const emptyCustomerMeeting: {} = { + id: null, + customer_id: customerId, + creation_user_id: null, + owner_user_id: null, + meeting_type_id: null, + is_option_meeting: false, + title: null, + description: null, + start_date: Utils.getCurrentDate() + ' 09:00:00', + end_date: Utils.getCurrentDate() + ' 18:00:00', + customer_contact_id: null, + gender: null, + firstname: null, + lastname: null, + email: null, + phone_no: null, + mobile_no: null, + department: null, + street: null, + street_no: null, + zip: null, + city: null, + country_id: null, + report: null, + first_reminder_sent: false, + second_reminder_sent: false, + report_done: false, + report_reminder_sent: false, + creation_date: null, + v_participants: [], + v_is_editable: true + }; + return emptyCustomerMeeting as ICustomerMeeting; + } + + static getEmptyInternalMeeting(): IInternalMeeting { + const emptyInternalMeeting: {} = { + id: null, + creation_user_id: null, + owner_user_id: null, + title: null, + description: null, + start_date: Utils.getCurrentDate() + ' 09:00:00', + end_date: Utils.getCurrentDate() + ' 18:00:00', + report: null, + first_reminder_sent: false, + second_reminder_sent: false, + report_done: false, + report_reminder_sent: false, + creation_date: null, + v_participants: [], + v_is_editable: true + }; + return emptyInternalMeeting as IInternalMeeting; + } + + static getEmptyMeetingType(): IMeetingType { + const emptyMeetingType: {} = { + id: null, + type: null, + name: null, + }; + return emptyMeetingType as IMeetingType; + } + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.html b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.html new file mode 100644 index 0000000..5a2e602 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.scss new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.scss @@ -0,0 +1 @@ + diff --git a/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.ts new file mode 100644 index 0000000..83cc74e --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-editor/grid-blocked-editor.component.ts @@ -0,0 +1,19 @@ +import {Component} from '@angular/core'; +import {GridEditorComponent} from '../../grid-editor-component'; + +@Component({ + selector: 'app-grid-blocked-editor', + templateUrl: './grid-blocked-editor.component.html', + styleUrls: ['./grid-blocked-editor.component.scss'] +}) + +export class GridBlockedEditorComponent extends GridEditorComponent { + + /** + * Sets focus + */ + public afterGuiAttached(): void { + + } + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.html b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.html new file mode 100644 index 0000000..5a2e602 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.ts new file mode 100644 index 0000000..a6eaa3d --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-blocked/grid-blocked-renderer/grid-blocked-renderer.component.ts @@ -0,0 +1,21 @@ +import {Component} from '@angular/core'; +import {GridRendererComponent} from '../../grid-renderer-component'; + +@Component({ + selector: 'app-grid-blocked-renderer', + templateUrl: './grid-blocked-renderer.component.html', + styleUrls: ['./grid-blocked-renderer.component.scss'] +}) + +export class GridBlockedRendererComponent extends GridRendererComponent { + + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + * @param params + */ + agInit(params: any): void { + params.eGridCell.classList.remove('error'); + + } + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-cell-editor-params.ts b/plp-angular/src/app/grid-cellrenderer/grid-cell-editor-params.ts new file mode 100644 index 0000000..c751526 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-cell-editor-params.ts @@ -0,0 +1,9 @@ +export interface IGridCellEditorParams { + itemKey: string; + itemValueKeys: string[]; + relatesOnDgField: string; + values: any[]; + exclusive: boolean; + exclusiveCompareDataKey: string; + exclusiveCompareData: any[]; +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-cell-params.ts b/plp-angular/src/app/grid-cellrenderer/grid-cell-params.ts new file mode 100644 index 0000000..b758593 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-cell-params.ts @@ -0,0 +1,8 @@ +export interface IGridCellParams { + type: string; + min: number; + max: number; + unit: string; + mandatory: boolean; + altVal: number; +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.html b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.html new file mode 100644 index 0000000..270f14d --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.html @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.ts new file mode 100644 index 0000000..d90839b --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-editor/grid-checkbox-editor.component.ts @@ -0,0 +1,41 @@ +import {Component} from '@angular/core'; +import {GridEditorComponent} from '../../grid-editor-component'; +import {Utils} from '../../../utils/utils'; + +@Component({ + selector: 'app-grid-checkbox-editor', + templateUrl: './grid-checkbox-editor.component.html', + styleUrls: ['./grid-checkbox-editor.component.scss'] +}) + +export class GridCheckboxEditorComponent extends GridEditorComponent { + + /** + * Initialize checkbox editor (called after double-click) + * @param params + */ + agInit(params: any): void { + super.agInit(params); + + // Set true to false, because of single click + this.value = null === this.value ? true : !this.value; + if (!Utils.isBoolean(this.value)) { + throw new Error('checkbox requires boolean value'); + } + } + + /** + * Changes value on checkbox click + * @param e + */ + public valueIsChanged = (e) => { + this.value = !this.value; + } + + /** + * Overwrite + */ + public afterGuiAttached(): void { + // do nothing + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.html b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.html new file mode 100644 index 0000000..48f0a45 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.html @@ -0,0 +1,8 @@ + + + + + + diff --git a/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.ts new file mode 100644 index 0000000..14973ca --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-checkbox/grid-checkbox-renderer/grid-checkbox-renderer.component.ts @@ -0,0 +1,34 @@ +import {Component} from '@angular/core'; +import {GridRendererComponent} from '../../grid-renderer-component'; +import {Utils} from '../../../utils/utils'; + +@Component({ + selector: 'app-grid-checkbox-renderer', + templateUrl: './grid-checkbox-renderer.component.html', + styleUrls: ['./grid-checkbox-renderer.component.scss'] +}) + +export class GridCheckboxRendererComponent extends GridRendererComponent { + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + * @param params + */ + agInit(params: any): void { + super.agInit(params); + this.value = null === this.value ? false : this.value; + if (!Utils.isBoolean(this.value)) { + throw new Error('checkbox requires boolean value'); + } + } + + /** + * Triggers cell editing start without using "singleClickEdit" + */ + public startEditing(): void { + const startEditingParams: {} = { + rowIndex: this.params.rowIndex, + colKey: this.params.column.getId() + }; + this.params.api.startEditingCell(startEditingParams); + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.html b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.html new file mode 100644 index 0000000..c88fc5f --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.ts new file mode 100644 index 0000000..bd48b97 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-editor/grid-date-editor.component.ts @@ -0,0 +1,12 @@ +import {Component} from '@angular/core'; +import {GridEditorComponent} from '../../grid-editor-component'; + +@Component({ + selector: 'app-grid-checkbox-editor', + templateUrl: './grid-date-editor.component.html', + styleUrls: ['./grid-date-editor.component.scss'] +}) + +export class GridDateEditorComponent extends GridEditorComponent { + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.html b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.html new file mode 100644 index 0000000..6e27280 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.html @@ -0,0 +1 @@ +{{displayedValue}} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.ts new file mode 100644 index 0000000..8c80f31 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-date/grid-date-renderer/grid-date-renderer.component.ts @@ -0,0 +1,27 @@ +import {Component} from '@angular/core'; +import {GridRendererComponent} from '../../grid-renderer-component'; + +@Component({ + selector: 'app-grid-date-renderer', + templateUrl: './grid-date-renderer.component.html', + styleUrls: ['./grid-date-renderer.component.scss'] +}) + +export class GridDateRendererComponent extends GridRendererComponent { + + public displayedValue: string; + + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + super.agInit(params); + let tempValue: string[] = []; + if (null === this.value || undefined === this.value) { + this.displayedValue = ''; + } else { + tempValue = this.value.split('-'); + this.displayedValue = tempValue[2] + '.' + tempValue[1] + '.' + tempValue[0]; + } + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-editor-component.ts b/plp-angular/src/app/grid-cellrenderer/grid-editor-component.ts new file mode 100644 index 0000000..b01cd73 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-editor-component.ts @@ -0,0 +1,82 @@ +import {Component, ElementRef, OnInit, ViewChild} from '@angular/core'; +import {ICellEditorAngularComp} from 'ag-grid-angular'; +import {IGridCellParams} from './grid-cell-params'; + +@Component({ + template: '', +}) + +export class GridEditorComponent implements OnInit, ICellEditorAngularComp { + + @ViewChild('editorInput', { static: true }) inputField: ElementRef; + + readonly GRID_ERROR_EMPTY: string = 'Bitte geben Sie einen Wert ein.'; + readonly GRID_ERROR_INT: string = 'Bitte geben Sie einen ganzahligen Wert ein.'; + readonly GRID_ERROR_FLOAT: string = 'Bitte geben Sie einen dezimalen oder ganzzahligen Wert ein.'; + readonly GRID_ERROR_RANGE_MIN: string = 'Minimaler Wert: '; + readonly GRID_ERROR_RANGE_MAX: string = 'Maximaler Wert: '; + readonly GRID_ERROR_RANGE_ALTERNATIVE: string = 'Alternativer Wert: '; + + public value: any; + public params: any; + public cellParams: IGridCellParams; + + constructor() { + this.cellParams = {} as IGridCellParams; + } + + ngOnInit() { + } + + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + this.params = params; + this.cellParams.type = params.type; + this.cellParams.min = params.min; + this.cellParams.max = params.max; + this.cellParams.unit = params.unit; + this.cellParams.mandatory = params.mandatory; + this.cellParams.altVal = params.altVal; + this.value = params.value; + } + + /** + * Returns value to cell renderer + */ + getValue(): any { + return this.value; + } + + /** + * Cancels before value input (this editor is never editable) + */ + public isCancelBeforeStart(): boolean { + return false; + } + + /** + * Cancels input of inserted value under certain conditions + */ + isCancelAfterEnd(): boolean { + return false; + } + + /** + * Changes value on click + */ + public valueIsChanged = (e) => { + this.value = e.srcElement.value; + } + + + /** + * Sets focus + */ + public afterGuiAttached(): void { + this.inputField.nativeElement.focus(); + this.inputField.nativeElement.select(); + } + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-factory.ts b/plp-angular/src/app/grid-cellrenderer/grid-factory.ts new file mode 100644 index 0000000..5ea5210 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-factory.ts @@ -0,0 +1,20 @@ +import {IGridCellParams} from './grid-cell-params'; + +export class GridFactory { + /** + * Returns param object for cell renderer and -editors + */ + static getGridCellParams(type: string = null, min: number = null, + max: number = null, unit: string = null, + mandatory: boolean = false, altValue: number = null): IGridCellParams { + const gridCellParams: IGridCellParams = {} as IGridCellParams; + gridCellParams.type = type; + gridCellParams.min = min; + gridCellParams.max = max; + gridCellParams.unit = unit; + gridCellParams.mandatory = mandatory; + gridCellParams.altVal = altValue; + + return gridCellParams; + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.html b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.html new file mode 100644 index 0000000..f5046dd --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.ts new file mode 100644 index 0000000..69fa365 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-editor/grid-input-editor.component.ts @@ -0,0 +1,107 @@ +import {Component} from '@angular/core'; +import {GridEditorComponent} from '../../grid-editor-component'; +import {AgGridComponentConst} from '../../../components/ag-grid-component-const'; +import {Utils} from '../../../utils/utils'; + +@Component({ + selector: 'app-grid-input-editor', + templateUrl: './grid-input-editor.component.html', + styleUrls: ['./grid-input-editor.component.scss'] +}) + +export class GridInputEditorComponent extends GridEditorComponent { + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + super.agInit(params); + + if (this.cellParams !== undefined && this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_FLOAT) { + // Replace "." with "," for display purpose + this.value = isNaN(this.value) || null === this.value ? '' : parseFloat(this.value).toFixed(2).replace('.', ','); + } + } + + /** + * Returns value to cell renderer + */ + getValue(): any { + if (this.cellParams !== undefined && this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_FLOAT) { + // Replace "." with "," for display purpose and cast back to number + this.value = this.value.replace(',', '.'); + this.value = isNaN(this.value) || null === this.value ? '' : Number(parseFloat(this.value).toFixed(2)); + } + return this.value; + } + + /** + * Cancels input of inserted value under certain conditions + */ + isCancelAfterEnd(): boolean { + if (this.cellParams.mandatory && (null === this.value || this.value.toString().trim() === '')) { + // Null value or empty string + AgGridComponentConst.setGridInputError(this.GRID_ERROR_EMPTY); + return true; + } + + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_INT && !Utils.isInteger(this.value)) { + // No int value given + AgGridComponentConst.setGridInputError(this.GRID_ERROR_INT); + return true; + } + + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_FLOAT && !Utils.isFloat(this.value)) { + // No float value given + AgGridComponentConst.setGridInputError(this.GRID_ERROR_FLOAT); + return true; + } + + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_INT || + this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_FLOAT) { + const numericVal: number = Number(String(this.value).replace(',', '.')); + if (null !== this.cellParams.min && numericVal < Number(this.cellParams.min)) { + // Check on alternative value + if (null !== this.cellParams.altVal) { + if (numericVal === this.cellParams.altVal) { + // Alternative value (to min and max) -> no error + return false; + } else { + // Value is not in range and not alternative value - cancel value input + AgGridComponentConst.setGridInputError(this.GRID_ERROR_RANGE_MIN + this.cellParams.min + ' (' + this.GRID_ERROR_RANGE_ALTERNATIVE + this.cellParams.altVal + ')'); + return true; + } + } else { + // Value is not in range - cancel value input + AgGridComponentConst.setGridInputError(this.GRID_ERROR_RANGE_MIN + this.cellParams.min); + return true; + } + } + if (null !== this.cellParams.max && numericVal > Number(this.cellParams.max)) { + // Check on alternative value + if (null !== this.cellParams.altVal) { + if (numericVal === this.cellParams.altVal) { + // Alternative value (to min and max) -> no error + return false; + } else { + // Value is not in range and not alternative value - cancel value input + AgGridComponentConst.setGridInputError(this.GRID_ERROR_RANGE_MAX + this.cellParams.max + ' (' + this.GRID_ERROR_RANGE_ALTERNATIVE + this.cellParams.altVal + ')'); + return true; + } + } else { + // Value is not in range - cancel value input + AgGridComponentConst.setGridInputError(this.GRID_ERROR_RANGE_MAX + this.cellParams.max); + return true; + } + } + } + return false; + } + + /** + * Changes value on click + * todo maybe this should get refacotred properly? + */ + public valueIsChanged = (e) => { + this.value = e.srcElement.value; + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.html b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.html new file mode 100644 index 0000000..27fa371 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.html @@ -0,0 +1 @@ +{{value}}{{cellParams.unit}} \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.ts new file mode 100644 index 0000000..7b3d2e1 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-input/grid-input-renderer/grid-input-renderer.component.ts @@ -0,0 +1,27 @@ +import {Component} from '@angular/core'; +import {GridRendererComponent} from '../../grid-renderer-component'; +import {AgGridComponentConst} from '../../../components/ag-grid-component-const'; + +@Component({ + selector: 'app-grid-input-renderer', + templateUrl: './grid-input-renderer.component.html', + styleUrls: ['./grid-input-renderer.component.scss'] +}) + +export class GridInputRendererComponent extends GridRendererComponent { + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + super.agInit(params); + if (this.cellParams !== undefined) { + // Replace "." with "," for display purpose + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_FLOAT) { + this.value = isNaN(this.value) || null === this.value ? '' : parseFloat(parseFloat(this.value).toFixed(2)).toLocaleString('de-DE'); + } + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_INT) { + this.value = isNaN(this.value) || null === this.value ? '' : parseInt(parseInt(this.value).toFixed(2)).toLocaleString('de-DE'); + } + } + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-renderer-component.ts b/plp-angular/src/app/grid-cellrenderer/grid-renderer-component.ts new file mode 100644 index 0000000..074fe18 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-renderer-component.ts @@ -0,0 +1,49 @@ +import {Component, OnInit} from '@angular/core'; +import {ICellRendererAngularComp} from 'ag-grid-angular'; +import {IGridCellParams} from './grid-cell-params'; + +@Component({ + template: '', +}) + +export class GridRendererComponent implements OnInit, ICellRendererAngularComp { + + public value: any; + public params: any; + public cellParams: IGridCellParams; + + constructor() { + this.cellParams = {} as IGridCellParams; + } + + ngOnInit() { + } + + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + this.params = params; + this.cellParams.type = params.type; + this.cellParams.min = params.min; + this.cellParams.max = params.max; + this.cellParams.unit = params.unit; + this.cellParams.mandatory = params.mandatory; + this.value = params.value; + } + + /** + * Sets value + */ + setValue(value: any): void { + this.value = value; + } + + /** + * Refreshes cell - Gets called after editing + */ + refresh(params: any): boolean { + return false; + } + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.html b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.html new file mode 100644 index 0000000..2e1b444 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.html @@ -0,0 +1,4 @@ + +Keine Werte vorhanden \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.scss new file mode 100644 index 0000000..8febdc6 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.scss @@ -0,0 +1,8 @@ + + +/* NOTE: column width 100% (app-grid-select-editor) in basic.scss */ + +select { + width: 100%; + max-width: 250px; +} \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.ts new file mode 100644 index 0000000..89a43ad --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-editor/grid-select-editor.component.ts @@ -0,0 +1,104 @@ +import {Component} from '@angular/core'; +import {IGridSelectItem} from '../grid-select-item'; +import {GridEditorComponent} from '../../grid-editor-component'; +import {GridSelectFactory} from '../grid-select-factory'; +import {IGridCellEditorParams} from '../../grid-cell-editor-params'; + +@Component({ + selector: 'app-grid-select-editor', + templateUrl: './grid-select-editor.component.html', + styleUrls: ['./grid-select-editor.component.scss'] +}) + +export class GridSelectEditorComponent extends GridEditorComponent { + + public values: IGridSelectItem[]; + public selectedItem: IGridSelectItem; + public newValue: IGridSelectItem; + public itemKey: string; + public itemValueKeys: string[]; + public noValueAvailable: boolean; + + /** + * Initialize select editor (called after double-click) + */ + agInit(params: any): void { + super.agInit(params); + this.noValueAvailable = false; + const cellEditorParams: IGridCellEditorParams = params.column.colDef.cellEditorParams as IGridCellEditorParams; + this.values = []; + + this.itemKey = cellEditorParams.itemKey; + this.itemValueKeys = cellEditorParams.itemValueKeys; + const relatedValue: string | null = cellEditorParams.relatesOnDgField; + + if (null !== relatedValue) { + const itemRange: any[] = (params.node.data.hasOwnProperty(relatedValue) && null !== params.node.data[relatedValue]) ? + cellEditorParams.values[params.node.data[relatedValue]] : null; + + if (null !== itemRange && undefined !== itemRange) { + itemRange.forEach(item => { + this.values.push(GridSelectFactory.getGridSelectItem(item, this.itemKey, this.itemValueKeys)); + }); + } + + } else if (cellEditorParams.exclusive === true) { + // Filter all items used by other selects (compareData) + const compareExcludeKey: string = cellEditorParams.exclusiveCompareDataKey; + const excludedItemKeys: {} = {}; + cellEditorParams.exclusiveCompareData.forEach(item => { + if (item[compareExcludeKey] !== this.value) { + excludedItemKeys[item[compareExcludeKey]] = 1; + } + }); + // This select contains only values that are not selected by other selects and it's own current item + cellEditorParams.values.forEach(item => { + if (!excludedItemKeys.hasOwnProperty(item[this.itemKey])) { + this.values.push(GridSelectFactory.getGridSelectItem(item, this.itemKey, this.itemValueKeys)); + } + }); + } else { + // Static values (default behaviour) + this.values = params.values; + } + this.selectedItem = this.getSelectedItem(params.value); + } + + /** + * Returns value to cell renderer + */ + getValue(): any { + return null === this.newValue ?? this.newValue.key; + } + + /** + * Makes selectItem out of ID + */ + public getSelectedItem(e: any): IGridSelectItem { + if (null !== e && e !== '') { + for (const item of this.values) { + if (item.key === e) { + this.newValue = item; + break; + } + } + } else { + if (this.values.length > 0) { + this.newValue = this.values[0]; + } else { + // No value in select available + this.noValueAvailable = true; + this.newValue = null; + return; + } + } + return this.newValue; + } + + /** + * Overwrite + */ + public afterGuiAttached(): void { + // do nothing + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-factory.ts b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-factory.ts new file mode 100644 index 0000000..5b4e3f7 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-factory.ts @@ -0,0 +1,123 @@ +import {Const} from '../../utils/const'; +import {IGridSelectItem} from './grid-select-item'; + + +export class GridSelectFactory { + /** + * Returns select item for grid + */ + static getGridSelect(headerName: string, field: string, editable: boolean, values: any[], itemKey: string, + itemValueKeys: string[], mandatory: boolean = true, relatesOnDgField: string = null, + headerClass: string = null, pinned: boolean = false, cellClass: any = null, + exclusive: boolean = false, exclusiveCompareData: any = null, exclusiveCompareDataKey: string = null): {} { + + if (null !== relatesOnDgField && exclusive) { + // NOTE: This is not allowed for now, maybe needed in future + throw new Error('Select can be either relative or exclusive'); + } + + const res = { + headerName, + field, + headerClass, + pinned, + editable, + cellClass: null === cellClass ?? (editable ? '' : Const.CSS_NO_EDIT), + cellRenderer: 'gridSelectRenderer', + cellEditor: 'gridSelectEditor', + cellEditorParams: { + values: null === relatesOnDgField && !exclusive ? GridSelectFactory.getGridSelectItems(values, itemKey, itemValueKeys, mandatory) : values, + itemKey, + itemValueKeys, + mandatory, + relatesOnDgField, + exclusive, + exclusiveCompareData, + exclusiveCompareDataKey + } + }; + if (mandatory) { + res['cellClassRules'] = { + error(params) { + return params.value == null; + } + }; + } + return res; + } + + /** + * Returns select item for grid without renderer and editor + */ + static getGridSelectForSelectors(headerName: string, field: string, editable: boolean, values: any[], itemKey: string, + itemValueKeys: string[], mandatory: boolean = true, relatesOnDgField: string = null, + headerClass: string = null, pinned: boolean = false, cellClass: any = null, + exclusive: boolean = false, exclusiveCompareData: any = null, exclusiveCompareDataKey: string = null): {} { + + const res: {} = GridSelectFactory.getGridSelect( + headerName, field, editable, values, itemKey, itemValueKeys, mandatory, relatesOnDgField, + headerClass, pinned, cellClass, exclusive, exclusiveCompareData, exclusiveCompareDataKey + ); + delete res['cellRenderer']; + delete res['cellEditor']; + return res; + } + + /** + * Returns array of grid select items + */ + static getGridSelectItems(objArray: any[], key: string, valueKeys: string[], mandatory: boolean = true): IGridSelectItem[] { + const res: IGridSelectItem[] = []; + + if (!mandatory) { + // Add empty item (null value) + res.push(GridSelectFactory.getGridSelectItem({key: null, value: '-'}, 'key', valueKeys, true)); + } + + objArray.forEach(item => { + res.push(GridSelectFactory.getGridSelectItem(item, key, valueKeys)); + }); + return res; + } + + /** + * Returns single grid select item + */ + static getGridSelectItem(obj: any, key: string, valueKeys: string[], isNullItem: boolean = false): IGridSelectItem { + if (!obj.hasOwnProperty(key)) { + throw new Error('GridFactory: Key not found: ' + key); + } + + let gridItem: {} = {}; + if (!isNullItem) { + for (const item of valueKeys) { + if (!obj.hasOwnProperty(key) || !obj.hasOwnProperty(item)) { + throw new Error('GridFactory: Value not found: ' + item); + } + } + gridItem = { + key: obj[key], + value: GridSelectFactory.getGridSelectItemValue(obj, valueKeys) + }; + } else { + // Empty placeholder item + gridItem = { + key: obj.key, + value: obj.value + }; + } + return gridItem as IGridSelectItem; + } + + /** + * Returns displayed value of grid item + */ + static getGridSelectItemValue(obj: any, valueKeys: string[]): string { + let value = ''; + for (let i = 0; i < valueKeys.length; i++) { + value += obj[valueKeys[i]]; + value += i < (valueKeys.length - 1) ? ' - ' : ''; + } + return value; + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-item.ts b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-item.ts new file mode 100644 index 0000000..e700617 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-item.ts @@ -0,0 +1,4 @@ +export interface IGridSelectItem { + key: string; + value: string; +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.html b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.html new file mode 100644 index 0000000..b26a235 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.html @@ -0,0 +1 @@ +{{value}} \ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.ts new file mode 100644 index 0000000..bd66b53 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-select/grid-select-renderer/grid-select-renderer.component.ts @@ -0,0 +1,83 @@ +import {Component} from '@angular/core'; +import {IGridSelectItem} from '../grid-select-item'; +import {GridRendererComponent} from '../../grid-renderer-component'; +import {GridSelectFactory} from '../grid-select-factory'; + +@Component({ + selector: 'app-grid-select-renderer', + templateUrl: './grid-select-renderer.component.html', + styleUrls: ['./grid-select-renderer.component.scss'] +}) + +export class GridSelectRendererComponent extends GridRendererComponent { + + public itemRange: IGridSelectItem[]; + public currentIndex: number; + + constructor() { + super(); + this.itemRange = null; + this.currentIndex = null; + } + + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + super.agInit(params); + if (null === params.colDef.cellEditorParams.relatesOnDgField) { + // Static item range (default behaviour) + this.setStaticValue(params); + } else { + // Item range relates on other dg field + this.setRelatedValue(params); + } + } + + /** + * Case for static item range (all items in column have the same select items - default) + */ + private setStaticValue(params: any): void { + if (this.itemRange === null || undefined === this.itemRange) { + // Item range is the same for all rows + this.itemRange = params.colDef.cellEditorParams.values as IGridSelectItem[]; + if (null !== params.value) { + for (const item of this.itemRange) { + if (item.key === params.value) { + this.value = item.value; + break; + } + } + } else { + this.value = params.colDef.cellEditorParams.mandatory ? 'Bitte wählen' : ''; + } + } + } + + /** + * Case for item range related on other dg grid field (Select has always to be updated within init) + */ + private setRelatedValue(params: any): void { + // @TODO: Might be checked + const relatedValue: any = params.colDef.cellEditorParams.relatesOnDgField; + const itemKey: any = params.colDef.cellEditorParams.itemKey; + const itemValueKeys: string[] = params.colDef.cellEditorParams.itemValueKeys; + + // Get item range by related value + this.itemRange = params.data.hasOwnProperty(relatedValue) && null !== params.data[relatedValue] ? + params.colDef.cellEditorParams.values[params.data[relatedValue]] : null; + + if (null !== params.value && null !== this.itemRange) { + // let value: string = GridFactory.getGridSelectItemValue() + for (const item of this.itemRange) { + if (item[itemKey] === params.value) { + this.value = GridSelectFactory.getGridSelectItemValue(item, itemValueKeys); + break; + } + } + } else { + this.value = 'Bitte wählen'; + } + } + +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.html b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.html new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.ts new file mode 100644 index 0000000..9989c55 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-editor/grid-text-editor.component.ts @@ -0,0 +1,24 @@ +import {Component} from '@angular/core'; +import {GridEditorComponent} from '../../grid-editor-component'; + +@Component({ + selector: 'app-grid-text-editor', + templateUrl: './grid-text-editor.component.html', + styleUrls: ['./grid-text-editor.component.scss'] +}) + +export class GridTextEditorComponent extends GridEditorComponent { + /** + * Cancels before value input (this editor is never editable) + */ + public isCancelBeforeStart(): boolean { + return true; + } + + /** + * Overwrite + */ + public afterGuiAttached(): void { + // do nothing + } +} diff --git a/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.html b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.html new file mode 100644 index 0000000..9296c73 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.html @@ -0,0 +1 @@ +
{{value}}
\ No newline at end of file diff --git a/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.scss b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.ts b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.ts new file mode 100644 index 0000000..db4f660 --- /dev/null +++ b/plp-angular/src/app/grid-cellrenderer/grid-text/grid-text-renderer/grid-text-renderer.component.ts @@ -0,0 +1,27 @@ +import {Component} from '@angular/core'; +import {GridRendererComponent} from '../../grid-renderer-component'; +import {AgGridComponentConst} from '../../../components/ag-grid-component-const'; + +@Component({ + selector: 'app-grid-text-renderer', + templateUrl: './grid-text-renderer.component.html', + styleUrls: ['./grid-text-renderer.component.scss'] +}) + +export class GridTextRendererComponent extends GridRendererComponent { + /** + * Initialize cell renderer (gets called on cell rendering and after editing / refresh) + */ + agInit(params: any): void { + super.agInit(params); + if (undefined !== this.cellParams) { + // Replace "." with "," for display purpose + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_FLOAT) { + this.value = isNaN(this.value) || null === this.value ? '' : parseFloat(parseFloat(this.value).toFixed(2)).toLocaleString('de-DE'); + } + if (this.cellParams.type === AgGridComponentConst.CELL_VALUE_TYPE_INT) { + this.value = isNaN(this.value) || null === this.value? '' : this.value = parseInt(parseInt(this.value).toFixed(2)).toLocaleString('de-DE'); + } + } + } +} diff --git a/plp-angular/src/app/interceptor/route-interceptor.ts b/plp-angular/src/app/interceptor/route-interceptor.ts new file mode 100644 index 0000000..66e0dbc --- /dev/null +++ b/plp-angular/src/app/interceptor/route-interceptor.ts @@ -0,0 +1,34 @@ +import {Injectable} from '@angular/core'; +import { Router } from '@angular/router'; +import {AppService} from '../services/app.service'; +import {Subscription} from 'rxjs/index'; +import {ILoginState} from '../model/virtual/login-state'; + +@Injectable({ + providedIn: 'root' +}) +export class RouteInterceptor { + private loginSub: Subscription; + private loginState: ILoginState; + + /** + * Constructor of router service + */ + constructor(private router: Router, private appService: AppService) { + // Observe login state + this.loginSub = this.appService.getLoginState$().subscribe( + data => this.loginState = data); + } + + /** + * Checks if user is logged in and redirects to login page if not + * @returns {boolean} + */ + canActivate(): boolean { + if (this.loginState == null || !this.loginState.isLoggedIn) { + this.router.navigate(['./login']); + return false; + } + return true; + } +} diff --git a/plp-angular/src/app/lang/ag-gridlocale.ts b/plp-angular/src/app/lang/ag-gridlocale.ts new file mode 100644 index 0000000..dac4c38 --- /dev/null +++ b/plp-angular/src/app/lang/ag-gridlocale.ts @@ -0,0 +1,96 @@ +export class AgGridLocale { + static getLocale(): {} { + return { + // for filter panel + page: 'Seite', + more: 'mehr', + to: 'bis', + of: 'von', + next: 'nächstes', + last: 'letztes', + first: 'erstes', + previous: 'vorheriges', + loadingOoo: 'lade...', + + // for set filter + selectAll: 'Alle auswählen', + searchOoo: 'Suche...', + blanks: 'leer', + + // for number filter and text filter + filterOoo: 'Filter...', + applyFilter: 'Filter anwenden...', + equals: 'gleich', + notEquals: 'nicht gleich', + notEqual: 'nicht gleich', + + // for number filter + lessThan: 'weniger als', + greaterThan: 'größer als', + lessThanOrEqual: 'weniger oder gleich', + greaterThanOrEqual: 'größer oder gleich', + inRange: 'in Spanne', + + // for text filter + contains: 'beinhaltet', + notContains: 'beinhaltet nicht', + startsWith: 'beginnt mit', + endsWith: 'endet mit', + + // the header of the default group column + group: 'Gruppe', + + // tool panel + columns: 'Spalten', + filters: 'Filter', + rowGroupColumns: 'Pivot Spalten', + rowGroupColumnsEmptyMessage: 'Ziehe Spalten in Gruppe', + valueColumns: 'Spalten Werte', + pivotMode: 'Pivot-Mode', + groups: 'Gruppen', + values: 'Werte', + pivots: 'Pivots', + valueColumnsEmptyMessage: 'Ziehe Spalten zum zusammen', + pivotColumnsEmptyMessage: 'Für Pivot hierher ziehen', + toolPanelButton: 'Tool Feld', + + // other + noRowsToShow: 'Keine Zeilen', + + // enterprise menu + pinColumn: 'Spalte anpinnen', + valueAggregation: 'Agg Wert', + autosizeThiscolumn: 'Auto-Breite für diese Spalte', + autosizeAllColumns: 'Auto-Breite für alle Spalte', + groupBy: 'Gruppieren nach', + ungroupBy: 'Gruppierung aufheben nach', + resetColumns: 'Spalten zurücksetzen', + expandAll: 'Alle öffnen', + collapseAll: 'Alle schließen', + toolPanel: 'Tool Feld', + export: 'Export', + csvExport: 'CSV Export', + excelExport: 'Excel Export', + + // enterprise menu pinning + pinLeft: 'Anpinnen <<', + pinRight: 'Anpinnen >>', + noPin: 'Nicht anpinnen <>', + + // enterprise menu aggregation and status bar + sum: 'Summe', + min: 'Min', + max: 'Max', + none: 'Nichts', + count: 'Anzahl', + average: 'Durchschnitt', + + // standard menu + copy: 'Kopieren', + copyWithHeaders: 'Mit Köpfen kopieren', + ctrlC: 'strg und C', + paste: 'Einfügen', + ctrlV: 'strg und V' + }; + } +} diff --git a/plp-angular/src/app/model/constants/tools.ts b/plp-angular/src/app/model/constants/tools.ts new file mode 100644 index 0000000..a2d6788 --- /dev/null +++ b/plp-angular/src/app/model/constants/tools.ts @@ -0,0 +1,24 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const tools = { + ROLE_ADMIN: 'ROLE_ADMIN', + ROLE_SALES: 'ROLE_SALES', + ROLE_TECHNIQUE: 'ROLE_TECHNIQUE', + ROLE_PRODUCTION: 'ROLE_PRODUCTION', + ROLE_ACCOUNTING: 'ROLE_ACCOUNTING', + ROLE_SERVICE: 'ROLE_SERVICE', + + COLORS: [ + '#4397d4', // blue + '#b56cdc', // purple + '#dd6bbe', // pink + '#45d4a7', // green + '#fede62', // yellow + '#fdb753', // orange + '#808080', // grey + '#363636' // black + ], +}; diff --git a/plp-angular/src/app/model/entities/calendar-legend.ts b/plp-angular/src/app/model/entities/calendar-legend.ts new file mode 100644 index 0000000..73d7978 --- /dev/null +++ b/plp-angular/src/app/model/entities/calendar-legend.ts @@ -0,0 +1,5 @@ +export interface ICalendarLegend { + id: number; + type: string; + name: string; +} diff --git a/plp-angular/src/app/model/entities/country.ts b/plp-angular/src/app/model/entities/country.ts new file mode 100644 index 0000000..961d04e --- /dev/null +++ b/plp-angular/src/app/model/entities/country.ts @@ -0,0 +1,5 @@ +export interface ICountry { + id: number; + name: string; + iso_code: string; +} diff --git a/plp-angular/src/app/model/entities/customer-contact.ts b/plp-angular/src/app/model/entities/customer-contact.ts new file mode 100644 index 0000000..38750aa --- /dev/null +++ b/plp-angular/src/app/model/entities/customer-contact.ts @@ -0,0 +1,21 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface ICustomerContact extends EntityInterface { + customer_id: string; + gender: string; + firstname: string; + lastname: string; + email: string; + phone_no: string; + mobile_no: string; + fax_no: string; + department: string; + date_of_birth: string; + comment: string; + street: string; + street_no: string; + zip: string; + city: string; + country_id: number; + is_xmas_mail_recipient: boolean; +} diff --git a/plp-angular/src/app/model/entities/customer-meeting-participant.ts b/plp-angular/src/app/model/entities/customer-meeting-participant.ts new file mode 100644 index 0000000..1a363a3 --- /dev/null +++ b/plp-angular/src/app/model/entities/customer-meeting-participant.ts @@ -0,0 +1,6 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface ICustomerMeetingParticipant extends EntityInterface { + customer_meeting_id: number; + participant_user_id: number; +} diff --git a/plp-angular/src/app/model/entities/customer-meeting.ts b/plp-angular/src/app/model/entities/customer-meeting.ts new file mode 100644 index 0000000..2a8f0c3 --- /dev/null +++ b/plp-angular/src/app/model/entities/customer-meeting.ts @@ -0,0 +1,24 @@ +import {EntityInterface} from '../interface/entity-interface'; +import {ICustomerMeetingParticipant} from './customer-meeting-participant'; +import {MeetingInterface} from '../interface/meeting-interface'; + +export interface ICustomerMeeting extends EntityInterface, MeetingInterface { + customer_id: number; + meeting_type_id: number; + is_option_meeting: boolean; + customer_contact_id: number; + gender: string; + firstname: string; + lastname: string; + email: string; + phone_no: string; + mobile_no: string; + department: string; + street: string; + street_no: string; + zip: string; + city: string; + country_id: number; + v_participants: ICustomerMeetingParticipant[]; + v_is_editable: boolean; +} diff --git a/plp-angular/src/app/model/entities/customer-note.ts b/plp-angular/src/app/model/entities/customer-note.ts new file mode 100644 index 0000000..387b7e6 --- /dev/null +++ b/plp-angular/src/app/model/entities/customer-note.ts @@ -0,0 +1,22 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface ICustomerNote extends EntityInterface { + customer_id: number; + customer_contact_id: number; + user_id: number; + gender: string; + firstname: string; + lastname: string; + email: string; + phone_no: string; + mobile_no: string; + fax_no: string; + department: string; + title: string; + comment: string; + note_date: string; + creation_date: string; + creation_user_id: number; + creation_user_firstname: string; + creation_user_lastname: string; +} diff --git a/plp-angular/src/app/model/entities/customer.ts b/plp-angular/src/app/model/entities/customer.ts new file mode 100644 index 0000000..3bd401f --- /dev/null +++ b/plp-angular/src/app/model/entities/customer.ts @@ -0,0 +1,26 @@ +import {ICustomerContact} from './customer-contact'; +import {EntityInterface} from '../interface/entity-interface'; +import {ICustomerMeeting} from './customer-meeting'; +import {ICustomerNote} from './customer-note'; + +export interface ICustomer extends EntityInterface { + old_plp_id: string; + name: string; + name_additional: string; + consultant_user_id: number; + street: string; + street_no: string; + zip: string; + city: string; + country_id: number; + url: string; + email: string; + phone_no: string; + mobile_no: string; + fax_no: string; + comment: string; + active: boolean; + v_customer_contacts: ICustomerContact[]; + v_customer_notes: ICustomerNote[]; + v_customer_meetings: ICustomerMeeting[]; +} diff --git a/plp-angular/src/app/model/entities/internal-meeting-participant.ts b/plp-angular/src/app/model/entities/internal-meeting-participant.ts new file mode 100644 index 0000000..8197996 --- /dev/null +++ b/plp-angular/src/app/model/entities/internal-meeting-participant.ts @@ -0,0 +1,6 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface IInternalMeetingParticipant extends EntityInterface { + internal_meeting_id: number; + participant_user_id: number; +} diff --git a/plp-angular/src/app/model/entities/internal-meeting.ts b/plp-angular/src/app/model/entities/internal-meeting.ts new file mode 100644 index 0000000..4286a90 --- /dev/null +++ b/plp-angular/src/app/model/entities/internal-meeting.ts @@ -0,0 +1,9 @@ +import {EntityInterface} from '../interface/entity-interface'; +import {IInternalMeetingParticipant} from './internal-meeting-participant'; +import {MeetingInterface} from '../interface/meeting-interface'; + +export interface IInternalMeeting extends EntityInterface, MeetingInterface { + creation_user_id: number; + v_participants: IInternalMeetingParticipant[]; + v_is_editable: boolean; +} diff --git a/plp-angular/src/app/model/entities/meeting-type.ts b/plp-angular/src/app/model/entities/meeting-type.ts new file mode 100644 index 0000000..a88d2ff --- /dev/null +++ b/plp-angular/src/app/model/entities/meeting-type.ts @@ -0,0 +1,6 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface IMeetingType extends EntityInterface { + type: string; + name: string; +} diff --git a/plp-angular/src/app/model/entities/user-type.ts b/plp-angular/src/app/model/entities/user-type.ts new file mode 100644 index 0000000..2b1c075 --- /dev/null +++ b/plp-angular/src/app/model/entities/user-type.ts @@ -0,0 +1,7 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface IUserType extends EntityInterface { + user_type_id: number; + type: string; + v_roles: string[]; +} diff --git a/plp-angular/src/app/model/entities/user.ts b/plp-angular/src/app/model/entities/user.ts new file mode 100644 index 0000000..3731ac8 --- /dev/null +++ b/plp-angular/src/app/model/entities/user.ts @@ -0,0 +1,12 @@ +import {IUserType} from './user-type'; +import {EntityInterface} from '../interface/entity-interface'; + +export interface IUser extends EntityInterface { + email: string; + firstname: string; + lastname: string; + active: boolean; + visible: boolean; + v_translated_role: string; + v_user_type: IUserType; +} diff --git a/plp-angular/src/app/model/interface/entity-interface.ts b/plp-angular/src/app/model/interface/entity-interface.ts new file mode 100644 index 0000000..396fa22 --- /dev/null +++ b/plp-angular/src/app/model/interface/entity-interface.ts @@ -0,0 +1,3 @@ +export interface EntityInterface { + id: number; +} diff --git a/plp-angular/src/app/model/interface/meeting-interface.ts b/plp-angular/src/app/model/interface/meeting-interface.ts new file mode 100644 index 0000000..ba6cfb9 --- /dev/null +++ b/plp-angular/src/app/model/interface/meeting-interface.ts @@ -0,0 +1,13 @@ +export interface MeetingInterface { + creation_user_id: number; + owner_user_id: number; + title: string; + description: string; + start_date: string; + end_date: string; + report: string; + first_reminder_sent: boolean; + second_reminder_sent: boolean; + report_reminder_sent: boolean; + creation_date: string; +} \ No newline at end of file diff --git a/plp-angular/src/app/model/virtual/api-response.ts b/plp-angular/src/app/model/virtual/api-response.ts new file mode 100644 index 0000000..6eb8362 --- /dev/null +++ b/plp-angular/src/app/model/virtual/api-response.ts @@ -0,0 +1,13 @@ +import {IAppServiceData} from './app-service-data'; + +export interface IApiResponse { + result_data: any; + success_code: number; + success_msg: string; + info_code: number; + info_msg: string; + error_code: number; + error_msg: string; + optional_info: string; + service_data: IAppServiceData; +} diff --git a/plp-angular/src/app/model/virtual/app-service-data-item.ts b/plp-angular/src/app/model/virtual/app-service-data-item.ts new file mode 100644 index 0000000..e4a7a08 --- /dev/null +++ b/plp-angular/src/app/model/virtual/app-service-data-item.ts @@ -0,0 +1,7 @@ +import {EntityInterface} from '../interface/entity-interface'; + +export interface IAppServiceDataItem { + add: EntityInterface[]; + edit: EntityInterface[]; + delete: number[]; +} diff --git a/plp-angular/src/app/model/virtual/app-service-data.ts b/plp-angular/src/app/model/virtual/app-service-data.ts new file mode 100644 index 0000000..af257a6 --- /dev/null +++ b/plp-angular/src/app/model/virtual/app-service-data.ts @@ -0,0 +1,17 @@ +import {IAppServiceDataItem} from './app-service-data-item'; + +export interface IAppServiceData { + customers: IAppServiceDataItem; + operators: IAppServiceDataItem; + productions: IAppServiceDataItem; + services: IAppServiceDataItem; + customerContacts: IAppServiceDataItem; + operatorContacts: IAppServiceDataItem; + serviceContacts: IAppServiceDataItem; + productionContacts: IAppServiceDataItem; + customerMeetings: IAppServiceDataItem; + operatorMeetings: IAppServiceDataItem; + productionMeetings: IAppServiceDataItem; + serviceMeetings: IAppServiceDataItem; + internalMeetings: IAppServiceDataItem; +} diff --git a/plp-angular/src/app/model/virtual/config.ts b/plp-angular/src/app/model/virtual/config.ts new file mode 100644 index 0000000..1c80507 --- /dev/null +++ b/plp-angular/src/app/model/virtual/config.ts @@ -0,0 +1,12 @@ +import {IUser} from '../entities/user'; +import {IMeetingType} from '../entities/meeting-type'; +import {ICountry} from '../entities/country'; + +export interface IConfig { + users: IUser[]; + meeting_types: IMeetingType[]; + countries: ICountry[]; + vc_user_by_id: {}; + vc_meeting_types_by_id: {}; + vc_countries_by_id: {}; +} diff --git a/plp-angular/src/app/model/virtual/customer-data.ts b/plp-angular/src/app/model/virtual/customer-data.ts new file mode 100644 index 0000000..7c8fd25 --- /dev/null +++ b/plp-angular/src/app/model/virtual/customer-data.ts @@ -0,0 +1,9 @@ +import {ICustomer} from '../entities/customer'; +import {ICustomerContact} from '../entities/customer-contact'; +import {ICustomerMeeting} from '../entities/customer-meeting'; + +export interface ICustomerData { + customers: ICustomer[]; + customerContacts: ICustomerContact[]; + customerMeetings: ICustomerMeeting[]; +} diff --git a/plp-angular/src/app/model/virtual/grid-validation-errors.ts b/plp-angular/src/app/model/virtual/grid-validation-errors.ts new file mode 100644 index 0000000..f3c63a3 --- /dev/null +++ b/plp-angular/src/app/model/virtual/grid-validation-errors.ts @@ -0,0 +1,4 @@ +export interface IGridValidationErrors { + column: number; + row: string; +} diff --git a/plp-angular/src/app/model/virtual/login-state.ts b/plp-angular/src/app/model/virtual/login-state.ts new file mode 100644 index 0000000..c91235f --- /dev/null +++ b/plp-angular/src/app/model/virtual/login-state.ts @@ -0,0 +1,10 @@ +import {IUser} from '../entities/user'; +import {IConfig} from './config'; + +export interface ILoginState { + message: string; + resultCode: number; + isLoggedIn: boolean; + user: IUser; + config: IConfig; +} diff --git a/plp-angular/src/app/model/virtual/meeting-data.ts b/plp-angular/src/app/model/virtual/meeting-data.ts new file mode 100644 index 0000000..035749b --- /dev/null +++ b/plp-angular/src/app/model/virtual/meeting-data.ts @@ -0,0 +1,7 @@ +import {ICustomerMeeting} from '../entities/customer-meeting'; +import {IInternalMeeting} from '../entities/internal-meeting'; + +export interface IMeetingData { + customerMeetings: ICustomerMeeting[]; + internalMeetings: IInternalMeeting[]; +} diff --git a/plp-angular/src/app/model/virtual/message.ts b/plp-angular/src/app/model/virtual/message.ts new file mode 100644 index 0000000..38c1d84 --- /dev/null +++ b/plp-angular/src/app/model/virtual/message.ts @@ -0,0 +1,10 @@ +export interface IMessage { + success_code: number; + success_msg: string; + info_code: number; + info_msg: string; + error_code: number; + error_msg: string; + client_error_code: number; + optional_info: string; +} diff --git a/plp-angular/src/app/model/virtual/role.ts b/plp-angular/src/app/model/virtual/role.ts new file mode 100644 index 0000000..f35ce4a --- /dev/null +++ b/plp-angular/src/app/model/virtual/role.ts @@ -0,0 +1,5 @@ +export interface IRole { + user_type_id: number; + roles: string[]; + translation: string; +} diff --git a/plp-angular/src/app/services/app.service.ts b/plp-angular/src/app/services/app.service.ts new file mode 100644 index 0000000..a2f73b9 --- /dev/null +++ b/plp-angular/src/app/services/app.service.ts @@ -0,0 +1,148 @@ +import {Injectable} from '@angular/core'; +import {BehaviorSubject, Observable} from 'rxjs'; +import {IUser} from '../model/entities/user'; +import {CacheService} from './cache.service'; +import {ILoginState} from '../model/virtual/login-state'; +import {Router} from '@angular/router'; +import {IConfig} from '../model/virtual/config'; +import {HttpService} from './http.service'; +import {IApiResponse} from '../model/virtual/api-response'; +import {Utils} from '../utils/utils'; +import {CustomerService} from './customer.service'; +import {MeetingService} from './meeting.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AppService { + + private loginState: BehaviorSubject; + private user: BehaviorSubject; + private dataLoginState$: Observable; + private dataUser$: Observable; + private config: IConfig; + + constructor( + private httpService: HttpService, + private cacheService: CacheService, + private router: Router, + private customerService: CustomerService, + private meetingService: MeetingService, + ) { + this.loginState = new BehaviorSubject(cacheService.getItem('loginState') as ILoginState); + this.user = new BehaviorSubject(cacheService.getItem('user') as IUser); + this.dataLoginState$ = this.loginState.asObservable(); + this.dataUser$ = this.user.asObservable(); + this.config = this.cacheService.getItem('config') as IConfig; + } + + /** + * Returns observable of login state + * @returns {Observable} + */ + public getLoginState$(): Observable { + return this.dataLoginState$; + } + + /** + * Returns observable of user + * @returns {Observable} + */ + public getUser$(): Observable { + return this.dataUser$; + } + + /** + * Returns config object + */ + public getConfig(): IConfig { + return this.config; + } + + /** + * CHecks is current app user has given role + * @param {string} role + * @returns {boolean} + */ + public userHasRole(role: string): boolean { + return this.getAppUser().v_user_type.v_roles.indexOf(role) > -1; + } + + /** + * Returns app user without beeing an observable + * @returns {IUser} + */ + public getAppUser(): IUser { + return this.user.getValue(); + } + + /** + * Login call + * @param email + * @param password + */ + public login(email: string, password: string): void { + // Do login call + const postData: FormData = new FormData(); + postData.append('email', email); + postData.append('password', password); + this.httpService.apiPost('login', postData).subscribe( + data => { + const result: ILoginState = data as ILoginState; + this.cacheService.setItem('loginState', result); + this.cacheService.setItem('user', result.user); + this.loginState.next(data); + this.user.next(data.user); + this.setConfig(data.config); + } + ); + } + + /** + * Checks on running process + * @param {number} processId + * @returns {Observable} + */ + public apiCheckProcess(processId: number): Observable { + const formData = new FormData(); + formData.append('processId', JSON.stringify(processId)); + return this.httpService.apiPost('process-check', formData, true, false); + } + + /** + * Logout call + */ + public logout(): void { + this.httpService.apiPost('logout', null).subscribe( + data => { + localStorage.clear(); + this.loginState.next(null); + this.user.next(null); + this.customerService.resetCustomerServiceData(); + this.meetingService.resetMeetingServiceData(); + this.router.navigate(['./login']); + } + ); + } + + /** + * Returns the current user + * @returns {Observable} + */ + public getUser(): Observable { + return this.httpService.apiGet('get-user'); + } + + /** + * Sets and processes config + * @param {IConfig} config + */ + private setConfig(config: IConfig): void { + this.config = config; + this.config.vc_user_by_id = Utils.getSortedObjFromArray(this.config.users, 'id'); + this.config.vc_meeting_types_by_id = Utils.getSortedObjFromArray(this.config.meeting_types, 'id'); + this.config.vc_countries_by_id = Utils.getSortedObjFromArray(this.config.countries, 'id'); + this.cacheService.setItem('config', this.config); + } + +} diff --git a/plp-angular/src/app/services/cache.service.ts b/plp-angular/src/app/services/cache.service.ts new file mode 100644 index 0000000..915c141 --- /dev/null +++ b/plp-angular/src/app/services/cache.service.ts @@ -0,0 +1,36 @@ +import {Injectable} from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) + +export class CacheService { + + constructor() { + } + + /** + * Gets item + * @param key + */ + public getItem(key: string): any { + return localStorage.getItem(key) ? JSON.parse(localStorage.getItem(key)) : null; + } + + /** + * Sets item + * @param key + * @param item + */ + public setItem(key: string, item: any): void { + localStorage.setItem(key, JSON.stringify(item)); + } + + /** + * Removes item + * @param key + */ + public removeItem(key): void { + localStorage.removeItem(key); + } +} diff --git a/plp-angular/src/app/services/common.service.ts b/plp-angular/src/app/services/common.service.ts new file mode 100644 index 0000000..23ff428 --- /dev/null +++ b/plp-angular/src/app/services/common.service.ts @@ -0,0 +1,46 @@ +import {Injectable} from '@angular/core'; +import {HttpService} from './http.service'; +import {saveAs} from 'file-saver'; + +@Injectable({ + providedIn: 'root' +}) +export class CommonService { + + constructor(private httpService: HttpService) { + + } + + /** + * Returns xmas contact list pdf + * @param type + */ + public apiExportContactsPdf(filename: string, type: string): void { + const formData = new FormData(); + formData.append('type', type); + this.httpService.apiFilePost('export-contacts-pdf', formData).subscribe( + data => { + saveAs(new Blob([data], {type: 'pdf'}), filename + '.pdf'); + }, + error => { + } + ); + } + + /** + * Returns xmas contact list pdf + * @param filename + * @param type + */ + public apiExportXmasPdf(filename: string, type: string): void { + const formData = new FormData(); + formData.append('type', type); + this.httpService.apiFilePost('create-xmas-pdf', formData).subscribe( + data => { + saveAs(new Blob([data], {type: 'pdf'}), filename + '.pdf'); + }, + error => { + } + ); + } +} diff --git a/plp-angular/src/app/services/customer.service.ts b/plp-angular/src/app/services/customer.service.ts new file mode 100644 index 0000000..597b6d0 --- /dev/null +++ b/plp-angular/src/app/services/customer.service.ts @@ -0,0 +1,197 @@ +import {Injectable} from '@angular/core'; +import {BehaviorSubject, Observable, Subscription} from 'rxjs'; +import {CacheService} from './cache.service'; +import {Router} from '@angular/router'; +import {HttpService} from './http.service'; +import {ICustomer} from '../model/entities/customer'; +import {IApiResponse} from '../model/virtual/api-response'; +import {ICustomerContact} from '../model/entities/customer-contact'; +import {IAppServiceData} from '../model/virtual/app-service-data'; +import {ServiceHelper} from '../utils/service-helper'; +import {ICustomerNote} from '../model/entities/customer-note'; +import {ICustomerData} from '../model/virtual/customer-data'; + +@Injectable({ + providedIn: 'root' +}) +export class CustomerService { + + private customers: BehaviorSubject; + private dataCustomers$: Observable; + private customerContacts: BehaviorSubject; + private dataCustomerContacts$: Observable; + private serviceDataSub: Subscription; + + constructor(private httpService: HttpService, private cacheService: CacheService, private router: Router) { + this.customers = new BehaviorSubject(null); + this.dataCustomers$ = this.customers.asObservable(); + this.customerContacts = new BehaviorSubject(null); + this.dataCustomerContacts$ = this.customerContacts.asObservable(); + + // Subscription for service data + this.serviceDataSub = this.httpService.getServiceData$().subscribe( + data => { + this.handleServiceData(data as IAppServiceData); + }, error => { + } + ); + } + + /** + * Handles service data updates + */ + public handleServiceData(serviceData: IAppServiceData = null): void { + if (null !== serviceData) { + let bSetNewData = false; + let updatedCustomers: ICustomer[] = this.customers.getValue(); + let updatedCustomerContacts: ICustomerContact[] = this.customerContacts.getValue(); + if (null !== serviceData.customers) { + // Update service data + updatedCustomers = ServiceHelper.updateServiceEntries(serviceData.customers, this.customers.getValue()) as ICustomer[]; + bSetNewData = true; + } + if (null !== serviceData.customerContacts) { + // Update service data + updatedCustomerContacts = ServiceHelper.updateServiceEntries(serviceData.customerContacts, this.customerContacts.getValue()) as ICustomerContact[]; + bSetNewData = true; + } + if (bSetNewData) { + this.setCustomerServiceData(updatedCustomers, updatedCustomerContacts); + } + } + } + + /** + * Sets customer service and cache data + */ + private setCustomerServiceData(customers: ICustomer[], customerContacts: ICustomerContact[]) { + this.customers.next(customers); + this.customerContacts.next(customerContacts); + } + + /** + * Reset service data (on logout) + */ + public resetCustomerServiceData() { + this.customers.next(null); + this.customerContacts.next(null); + } + + /** + * Returns observable of customers + */ + public getCustomers$(): Observable { + return this.dataCustomers$; + }; + + /** + * Returns observable of customer contacts + */ + public getCustomerContacts$(): Observable { + return this.dataCustomerContacts$; + } + + /** + * Gets all customers + */ + public apiGetCustomerData(): void { + this.httpService.apiGet('get-customer-data').subscribe( + data => { + const res: ICustomerData = data.result_data as ICustomerData; + this.setCustomerServiceData(res.customers, res.customerContacts); + }, + error => {} + ); + } + + /** + * Returns full customer + */ + public apiGetCustomerFull(customerId: number): Observable { + const formData = new FormData(); + formData.append('customerId', JSON.stringify(customerId)); + return this.httpService.apiPost('get-customer-full', formData); + } + + /** + * Create customer + */ + public apiCreateCustomer(customer: ICustomer): Observable { + const formData = new FormData(); + formData.append('customer', JSON.stringify(customer)); + return this.httpService.apiPost('create-customer', formData); + } + + /** + * Edit customer + */ + public apiEditCustomer(customer: ICustomer): Observable { + const formData = new FormData(); + formData.append('customer', JSON.stringify(customer)); + return this.httpService.apiPost('edit-customer', formData); + } + + /** + * Create customer contact + */ + public apiCreateCustomerContact(customerContact: ICustomerContact): Observable { + const formData = new FormData(); + formData.append('customerContact', JSON.stringify(customerContact)); + return this.httpService.apiPost('create-customer-contact', formData); + } + + /** + * Edit customer contact + */ + public apiEditCustomerContact(customerContact: ICustomerContact): Observable { + const formData = new FormData(); + formData.append('customerContact', JSON.stringify(customerContact)); + return this.httpService.apiPost('edit-customer-contact', formData); + } + + /** + * Delete customer contact + */ + public apiDeleteCustomerContact(customerContactId: number): Observable { + const formData = new FormData(); + formData.append('customerContactId', JSON.stringify(customerContactId)); + return this.httpService.apiPost('delete-customer-contact', formData); + } + + /** + * Create customer note + */ + public apiCreateCustomerNote(customerNote: ICustomerNote): Observable { + const formData = new FormData(); + formData.append('customerNote', JSON.stringify(customerNote)); + return this.httpService.apiPost('create-customer-note', formData); + } + + /** + * Edit customer note + */ + public apiEditCustomerNote(customerNote: ICustomerNote): Observable { + const formData = new FormData(); + formData.append('customerNote', JSON.stringify(customerNote)); + return this.httpService.apiPost('edit-customer-note', formData); + } + + /** + * Delete customer note + */ + public apiDeleteCustomerNote(customerNoteId: number): Observable { + const formData = new FormData(); + formData.append('customerNoteId', JSON.stringify(customerNoteId)); + return this.httpService.apiPost('delete-customer-note', formData); + } + + /** + * Edit customer meeting report + */ + public apiEditCustomerMeetingReport(customerMeetingId: number, customerMeetingReport: string): Observable { + const formData = new FormData(); + formData.append('customerMeetingId', JSON.stringify(customerMeetingId)); + formData.append('customerMeetingReport', JSON.stringify(customerMeetingReport)); + return this.httpService.apiPost('edit-customer-meeting-report', formData); + } +} diff --git a/plp-angular/src/app/services/http.interceptor.ts b/plp-angular/src/app/services/http.interceptor.ts new file mode 100644 index 0000000..62f2082 --- /dev/null +++ b/plp-angular/src/app/services/http.interceptor.ts @@ -0,0 +1,18 @@ +import {Injectable} from '@angular/core'; +import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http'; + +import {Observable} from 'rxjs'; + +/** Pass untouched request through to the next request handler. */ +@Injectable({ + providedIn: 'root' +}) +export class HttpClientInterceptor implements HttpInterceptor { + + intercept(req: HttpRequest, next: HttpHandler): + Observable> { + // Does nothing at the moment + return next.handle(req); + } + +} diff --git a/plp-angular/src/app/services/http.service.ts b/plp-angular/src/app/services/http.service.ts new file mode 100644 index 0000000..c21bf4a --- /dev/null +++ b/plp-angular/src/app/services/http.service.ts @@ -0,0 +1,167 @@ +import {Injectable, Renderer2, RendererFactory2} from '@angular/core'; +import {HttpClient, HttpErrorResponse} from '@angular/common/http'; +import {BehaviorSubject, Observable} from 'rxjs'; +import {environment} from '../../environments/environment'; +import {finalize, tap} from 'rxjs/operators'; +import {MessageService} from './message.service'; +import {IApiResponse} from '../model/virtual/api-response'; +import {CacheService} from './cache.service'; +import {IAppServiceData} from '../model/virtual/app-service-data'; + + +@Injectable({ + providedIn: 'root' +}) +export class HttpService { + + /** + * Constructor + */ + constructor(private httpClient: HttpClient, private messageService: MessageService, private rendererFactory: RendererFactory2) { + this.renderer = this.rendererFactory.createRenderer(null, null); + this.serviceData = new BehaviorSubject(null); + this.dataServiceData$ = this.serviceData.asObservable(); + } + + private static AUTHENTICATION_ERROR_CODE = 401; + private static AUTHENTICATION_ERROR_MESSAGE = 'Sie sind nicht mehr im System eingeloggt. Bitte loggen Sie sich erneut ein.'; + private renderer: Renderer2; + + private dataServiceData$: Observable; + private serviceData: BehaviorSubject; + + /** + * Returns location observable + */ + public getServiceData$(): Observable { + return this.dataServiceData$; + } + + /** + * Processes optional cache service data delivered by call + */ + private checkMessages(data: IApiResponse): void { + // Show optional success message + if (undefined !== data.success_code && null !== data.success_code && data.success_code !== 0) { + this.messageService.setSuccess(data.success_code, data.success_msg); + } + + // Show optional info message + if (undefined !== data.info_code && null !== data.info_code && data.info_code !== 0) { + this.messageService.setInfoCode(data.info_code, data.info_msg); + } + + // Show optional error message + if (undefined !== data.error_code && null !== data.error_code && data.error_code !== 0) { + this.messageService.setError(data.error_code, data.error_msg); + } + } + + /** + * Handles http error repsonse + */ + private handleError(error: HttpErrorResponse, serviceDataCheck: boolean): void { + if (error.status === HttpService.AUTHENTICATION_ERROR_CODE) { + this.messageService.setError(HttpService.AUTHENTICATION_ERROR_CODE, HttpService.AUTHENTICATION_ERROR_MESSAGE); + } else { + const response: IApiResponse = error.error as IApiResponse; + this.messageService.setError(response.error_code, response.error_msg, response.optional_info); + if (serviceDataCheck) { + this.serviceData.next(response.service_data); + } + } + } + + /** + * Toggles loader icon + */ + public showLoader(show: boolean): void { + show ? + this.renderer.addClass(document.body, 'loading') : + this.renderer.removeClass(document.body, 'loading'); + } + + /** + * Api get call + */ + public apiGet(urlResource: string, id: number = null, serviceDataCheck: boolean = true, loaderIcon: boolean = true): Observable { + this.showLoader(true); + return this.httpClient.get( + // Always add active mandator id here + environment.apiUrl + urlResource + environment.debugParam, + {withCredentials: true} + ).pipe( + tap( + data => { + this.checkMessages(data); + if (serviceDataCheck) { + this.serviceData.next(data.service_data as IAppServiceData); + } + }, + error => { + this.handleError(error, serviceDataCheck); + } + ), + finalize(() => { + this.showLoader(false); + }) + ); + } + + /** + * Post api call + */ + public apiPost(urlResource: string, formData: FormData, serviceDataCheck: boolean = true, withLoaderIcon: boolean = true): Observable { + if (withLoaderIcon) { + this.showLoader(true); + } + + return this.httpClient.post( + environment.apiUrl + urlResource + environment.debugParam, + formData, + {withCredentials: true} + ).pipe( + tap( + data => { + this.checkMessages(data); + if (serviceDataCheck) { + this.serviceData.next(data.service_data as IAppServiceData); + } + }, + error => { + this.handleError(error, serviceDataCheck); + } + ), + finalize(() => { + if (withLoaderIcon) { + this.showLoader(false); + } + }) + ); + } + + /** + * Post call for excel files + */ + public apiFilePost(urlResource: string, formData: FormData): Observable { + this.showLoader(true); + return this.httpClient.post( + environment.apiUrl + urlResource + environment.debugParam, + formData, + {withCredentials: true, responseType: 'blob'}, + ).pipe( + tap( + data => { + // do nothing here + }, + error => { + this.handleError(error, false); + } + ), + finalize(() => { + this.showLoader(false); + }) + ); + } + +} diff --git a/plp-angular/src/app/services/meeting.service.ts b/plp-angular/src/app/services/meeting.service.ts new file mode 100644 index 0000000..14dfd6c --- /dev/null +++ b/plp-angular/src/app/services/meeting.service.ts @@ -0,0 +1,223 @@ +import {Injectable} from '@angular/core'; +import {BehaviorSubject, Observable, Subscription} from 'rxjs'; +import {CacheService} from './cache.service'; +import {Router} from '@angular/router'; +import {HttpService} from './http.service'; +import {IApiResponse} from '../model/virtual/api-response'; +import {IAppServiceData} from '../model/virtual/app-service-data'; +import {saveAs} from 'file-saver'; +import {ServiceHelper} from '../utils/service-helper'; +import {ICustomerMeeting} from '../model/entities/customer-meeting'; +import {IInternalMeeting} from '../model/entities/internal-meeting'; +import {IMeetingData} from '../model/virtual/meeting-data'; + +@Injectable({ + providedIn: 'root' +}) +export class MeetingService { + + private customerMeetings: BehaviorSubject; + private customerMeetings$: Observable; + private internalMeetings: BehaviorSubject; + private internalMeetings$: Observable; + private meetingData: BehaviorSubject; + private meetingData$: Observable; + private serviceDataSub: Subscription; + + constructor(private httpService: HttpService, private cacheService: CacheService, private router: Router) { + this.customerMeetings = new BehaviorSubject(null); + this.customerMeetings$ = this.customerMeetings.asObservable(); + this.internalMeetings = new BehaviorSubject(null); + this.internalMeetings$ = this.internalMeetings.asObservable(); + + this.meetingData = new BehaviorSubject(null); + this.meetingData$ = this.meetingData.asObservable(); + + // Subscription for service data + this.serviceDataSub = this.httpService.getServiceData$().subscribe( + data => { + this.handleServiceData(data as IAppServiceData); + }, error => { + } + ); + } + + /** + * Handles service data updates + */ + public handleServiceData(serviceData: IAppServiceData = null): void { + if (null !== serviceData) { + let bSetNewData = false; + let updatedCustomerMeetings: ICustomerMeeting[] = this.customerMeetings.getValue(); + let updatedInternalMeetings: IInternalMeeting[] = this.internalMeetings.getValue(); + if (null !== serviceData.customerMeetings) { + // Update service data + updatedCustomerMeetings = ServiceHelper.updateServiceEntries(serviceData.customerMeetings, this.customerMeetings.getValue()) as ICustomerMeeting[]; + bSetNewData = true; + } + if (null !== serviceData.internalMeetings) { + // Update service data + updatedInternalMeetings = ServiceHelper.updateServiceEntries(serviceData.internalMeetings, this.internalMeetings.getValue()) as IInternalMeeting[]; + bSetNewData = true; + } + + if (bSetNewData) { + const meetingData: {} = { + customerMeetings: updatedCustomerMeetings, + internalMeetings: updatedInternalMeetings, + }; + this.setMeetingServiceData(meetingData as IMeetingData); + } + } + } + + /** + * Sets customer service and cache data + */ + private setMeetingServiceData(meetingData: IMeetingData) { + this.meetingData.next(meetingData); + this.customerMeetings.next(meetingData.customerMeetings); + this.internalMeetings.next(meetingData.internalMeetings); + } + + /** + * Reset service data (on logout) + */ + public resetMeetingServiceData() { + this.meetingData.next(null); + this.customerMeetings.next(null); + this.internalMeetings.next(null); + } + + public getMeetingsData$(): Observable { + return this.meetingData$; + } + + public getCustomerMeetings$(): Observable { + return this.customerMeetings$; + } + + public getInternalMeetings$(): Observable { + return this.internalMeetings$; + } + + /** + * Gets meeting data + */ + public apiGetMeetingData(): void { + this.httpService.apiGet('get-meeting-data').subscribe( + data => { + const res: IMeetingData = data.result_data as IMeetingData; + this.setMeetingServiceData(res); + }, + error => {} + ); + } + + /** + * Create customer meeting + */ + public apiCreateCustomerMeeting(customerMeeting: ICustomerMeeting): Observable { + const formData = new FormData(); + formData.append('customerMeeting', JSON.stringify(customerMeeting)); + return this.httpService.apiPost('create-customer-meeting', formData); + } + + /** + * Edit customer meeting + */ + public apiEditCustomerMeeting(customerMeeting: ICustomerMeeting): Observable { + const formData = new FormData(); + formData.append('customerMeeting', JSON.stringify(customerMeeting)); + return this.httpService.apiPost('edit-customer-meeting', formData); + } + + /** + * Delete customer meeting + */ + public apiDeleteCustomerMeeting(customerMeetingId: number): Observable { + const formData = new FormData(); + formData.append('customerMeetingId', JSON.stringify(customerMeetingId)); + return this.httpService.apiPost('delete-customer-meeting', formData); + } + + /** + * Checks customer meeting report + */ + public apiCheckCustomerMeetingReport(customerMeetingId: number): Observable { + const formData = new FormData(); + formData.append('customerMeetingId', JSON.stringify(customerMeetingId)); + return this.httpService.apiPost('check-customer-meeting-report', formData, true); + } + + /** + * Edit customer meeting report + */ + public apiEditCustomerMeetingReport(customerMeetingId: number, customerMeetingReport: string): Observable { + const formData = new FormData(); + formData.append('customerMeetingId', JSON.stringify(customerMeetingId)); + formData.append('customerMeetingReport', JSON.stringify(customerMeetingReport)); + return this.httpService.apiPost('edit-customer-meeting-report', formData); + } + + /** + * Create internal meeting + */ + public apiCreateInternalMeeting(internalMeeting: IInternalMeeting): Observable { + const formData = new FormData(); + formData.append('internalMeeting', JSON.stringify(internalMeeting)); + return this.httpService.apiPost('create-internal-meeting', formData); + } + + /** + * Edit internal meeting + */ + public apiEditInternalMeeting(internalMeeting: IInternalMeeting): Observable { + const formData = new FormData(); + formData.append('internalMeeting', JSON.stringify(internalMeeting)); + return this.httpService.apiPost('edit-internal-meeting', formData); + } + + /** + * Delete internal meeting + */ + public apiDeleteInternalMeeting(internalMeetingId: number): Observable { + const formData = new FormData(); + formData.append('internalMeetingId', JSON.stringify(internalMeetingId)); + return this.httpService.apiPost('delete-internal-meeting', formData); + } + + /** + * Checks internal meeting report + */ + public apiCheckInternalMeetingReport(internalMeetingId: number): Observable { + const formData = new FormData(); + formData.append('internalMeetingId', JSON.stringify(internalMeetingId)); + return this.httpService.apiPost('check-internal-meeting-report', formData, false); + } + + /** + * Edit internal meeting report + */ + public apiEditInternalMeetingReport(internalMeetingId: number, internalMeetingReport: string): Observable { + const formData = new FormData(); + formData.append('internalMeetingId', JSON.stringify(internalMeetingId)); + formData.append('internalMeetingReport', JSON.stringify(internalMeetingReport)); + return this.httpService.apiPost('edit-internal-meeting-report', formData); + } + + /** + * Returns meeting list as excel + */ + public apiExportMeetingList(meetingList: {}[], fileName: string): void { + const formData = new FormData(); + formData.append('meetingList', JSON.stringify(meetingList)); + this.httpService.apiFilePost('export-meeting-list', formData).subscribe( + data => { + saveAs(new Blob([data], {type: 'xlsx'}), fileName + '.xlsx'); + }, + error => { + } + ); + } +} diff --git a/plp-angular/src/app/services/message.service.ts b/plp-angular/src/app/services/message.service.ts new file mode 100644 index 0000000..773f276 --- /dev/null +++ b/plp-angular/src/app/services/message.service.ts @@ -0,0 +1,69 @@ +import {Injectable} from '@angular/core'; +import {BehaviorSubject, Observable} from 'rxjs'; +import {IMessage} from '../model/virtual/message'; +import {Factory} from '../factory/factory'; + +@Injectable({ + providedIn: 'root' +}) +export class MessageService { + + private message: BehaviorSubject; + private dataMessage$: Observable; + + /** + * Constructor + */ + constructor() { + this.message = new BehaviorSubject(Factory.getEmptyMessage(0, null, 0, null, 0, null, 0)); + this.dataMessage$ = this.message.asObservable(); + } + + /** + * Returns message observable + * @returns {Observable} + */ + public getMessage$(): Observable { + return this.dataMessage$; + } + + /** + * Sets error code in message observable (listening components will be notified) + * @param {number} errorCode + * @param {string} errorMsg + * @param {string} optionalInfo + */ + public setError(errorCode: number, errorMsg: string, optionalInfo: string = null): void { + this.message.next(Factory.getEmptyMessage(errorCode, errorMsg, 0, null, 0, null, 0, optionalInfo)); + } + + /** + * Sets success code in message observable (listening components will be notified) + * @param {number} successCode + * @param {string} successMsg + * @param {string} optionalInfo + */ + public setSuccess(successCode: number, successMsg: string, optionalInfo: string = null): void { + this.message.next(Factory.getEmptyMessage(0, null, successCode, successMsg, 0, null, 0, optionalInfo)); + } + + /** + * Sets info code in message observable (listening components will be notified) + * @param {number} infoCode + * @param {string} infoMsg + * @param {string} optionalInfo + */ + public setInfoCode(infoCode: number, infoMsg: string, optionalInfo: string = null): void { + this.message.next(Factory.getEmptyMessage(0, null, 0, null, infoCode, infoMsg, 0, optionalInfo)); + } + + /** + * Sets client error code in message observable (listening components will be notified) + * @param {number} clientErrorCode + * @param {string} optionalInfo + */ + public setClientErrorCode(clientErrorCode: number, optionalInfo: string = null): void { + this.message.next(Factory.getEmptyMessage(0, null, 0, null, 0, null, clientErrorCode, optionalInfo)); + } + +} diff --git a/plp-angular/src/app/utils/const.ts b/plp-angular/src/app/utils/const.ts new file mode 100644 index 0000000..152bf57 --- /dev/null +++ b/plp-angular/src/app/utils/const.ts @@ -0,0 +1,25 @@ +export class Const { + static readonly USER_ROLE_ADMIN: string = 'ROLE_ADMIN'; + static readonly USER_ROLE_USER: string = 'ROLE_USER'; + static readonly USER_ROLE_SALES: string = 'ROLE_SALES'; + static readonly USER_ROLE_TECHNIQUE: string = 'ROLE_TECHNIQUE'; + static readonly USER_ROLE_PRODUCTION: string = 'ROLE_PRODUCTION'; + static readonly USER_ROLE_ACCOUNTING: string = 'ROLE_ACCOUNTING'; + static readonly USER_ROLE_SERVICE: string = 'ROLE_SERVICE'; + + static readonly CSS_NO_EDIT: string = 'not-editable'; + + static readonly SMALL_INT_MIN: number = -32768; + static readonly SMALL_INT_MAX: number = 32767; + + static readonly WORKING_DAYS_MIN: number = 0; + static readonly WORKING_DAYS_MAX: number = 7; + + static readonly PROCESS_STATE_SCHEDULED: string = 'scheduled'; + static readonly PROCESS_STATE_IN_PROCESS: string = 'in_process'; + static readonly PROCESS_STATE_ABORTED: string = 'aborted'; + static readonly PROCESS_STATE_FINISHED: string = 'finished'; + + static readonly UNIT_SQUARE_METER: string = 'm²'; + +} diff --git a/plp-angular/src/app/utils/service-helper.ts b/plp-angular/src/app/utils/service-helper.ts new file mode 100644 index 0000000..64a4c25 --- /dev/null +++ b/plp-angular/src/app/utils/service-helper.ts @@ -0,0 +1,42 @@ +import {EntityInterface} from '../model/interface/entity-interface'; +import {IAppServiceDataItem} from '../model/virtual/app-service-data-item'; +import {Utils} from './utils'; + +export class ServiceHelper { + /** + * Returns updated service data + * @param serviceDataItem + * @param serviceEntities + */ + public static updateServiceEntries(serviceDataItem: IAppServiceDataItem, serviceEntities: EntityInterface[]): EntityInterface[] { + let res: EntityInterface[] = []; + const editEntriesById: {} = Utils.getSortedObjFromArray(serviceDataItem.edit, 'id'); + const deleteEntryIdsById: {} = Utils.getSortedObjFromArray(serviceDataItem.delete, 'id'); + + if (serviceDataItem.edit.length > 0 || serviceDataItem.delete.length > 0) { + for (let i = 0; i < serviceEntities.length; i++) { + // Add edited entry + if (editEntriesById.hasOwnProperty(serviceEntities[i].id)) { + res.push(editEntriesById[serviceEntities[i].id]); + } else if (deleteEntryIdsById.hasOwnProperty(serviceEntities[i].id)) { + // Skip deleted entry + } else { + // Keep entry as is + res.push(serviceEntities[i]); + } + } + } else { + // Nothing to edit or delete, so take origin service entries + res = serviceEntities; + } + + // Add new entries + if (serviceDataItem.add.length > 0) { + for (let a = 0; a < serviceDataItem.add.length; a++) { + serviceEntities.push(serviceDataItem.add[a]); + } + } + return res; + } + +} diff --git a/plp-angular/src/app/utils/tools-error-handler.ts b/plp-angular/src/app/utils/tools-error-handler.ts new file mode 100644 index 0000000..d919560 --- /dev/null +++ b/plp-angular/src/app/utils/tools-error-handler.ts @@ -0,0 +1,11 @@ +import {ErrorHandler} from '@angular/core'; + +export class ToolsErrorHandler implements ErrorHandler { + + handleError(error: any) { + // console.error(Object.getOwnPropertyNames(error)) + // Object.getOwnPropertyNames(error).forEach(p => console.error(error[p])) + console.error(error.fileName, error.lineNumber, ':', error.columnNumber, '\n', error.message, error.rejection); + } + +} diff --git a/plp-angular/src/app/utils/utils.ts b/plp-angular/src/app/utils/utils.ts new file mode 100644 index 0000000..3d9d35c --- /dev/null +++ b/plp-angular/src/app/utils/utils.ts @@ -0,0 +1,185 @@ + +export class Utils { + + /** + * Sorts array of objects by given criteria + */ + static sortObjArrayByStringCriteria(paramArray: Array, criteria: string): Array { + const sortedArray: Array = paramArray.sort((obj1, obj2) => { + if (obj1[criteria].toLowerCase() > obj2[criteria].toLowerCase()) { + return 1; + } + if (obj1[criteria].toLowerCase() > obj2[criteria].toLowerCase()) { + return -1; + } + return 0; + }); + return sortedArray; + } + + /** + * Returns a sorted object by given array an criteria + */ + static getSortedObjFromArray(paramArray: Array = null, criteria: string = null) { + const res: {} = {}; + if (null !== paramArray ) { + if (null !== criteria) { + for (const item of paramArray) { + res[item[criteria]] = item; + } + } else { + for (const item of paramArray) { + res[item] = item; + } + } + } + return res; + } + + /** + * Deep clones object + */ + static deepClone(object: any) { + return JSON.parse(JSON.stringify(object)); + } + + /** + * Checks if a file is an image file + */ + static isImageFile(file: File): boolean { + return file.type.toString() === 'image/gif' || + file.type.toString() === 'image/png' || + file.type.toString() === 'image/jpeg'; + } + + /** + * Checks if a file is an Excel file + */ + static isExcelFile(file: File): boolean { + return file.type.toString() === 'application/vnd.ms-excel' || + file.type.toString() === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; + } + + /** + * Strips spaces from string and sets string to lowercase + */ + static stripString(s: string): string { + return s.replace(/[\s]/g, '').toLowerCase(); + } + + /** + * Checks if a given value is an integer + */ + static isInteger(value: any): boolean { + return Number.isInteger(Number(value)); + } + + /** + * Checks if a given value is a decimal / float + */ + static isFloat(value: any): boolean { + const val: any = value.replace(',', '.'); + return Number.isInteger(Number(val)) || !isNaN(val); + } + + /** + * Checks if a given value is a boolean + */ + static isBoolean(value: any): boolean { + return typeof value === 'boolean'; + } + + static isValidDate(d): boolean { + const today = new Date(d.replace(/\s/, 'T')); + return today instanceof Date && !isNaN(today.getTime()); + } + + /** + * Returns current date + */ + static getCurrentDate(withTime: boolean = false): string { + let res: string; + const today = new Date(); + const dd = today.getDate(); + const mm = today.getMonth() + 1; // January is 0! + const yyyy = today.getFullYear(); + + const day: string = dd < 10 ? '0' + dd : dd.toString(); + const month: string = mm < 10 ? '0' + mm : mm.toString(); + const year: string = yyyy.toString(); + + res = year + '-' + month + '-' + day; + if (withTime) { + res += ' ' + (today.getHours() < 10 ? '0' + today.getHours() : today.getHours()) + ':' + + (today.getMinutes() < 10 ? '0' + today.getMinutes() : today.getMinutes()) + ':' + + (today.getSeconds() < 10 ? '0' + today.getSeconds() : today.getSeconds()); + } + return res; + } + + /** + * Returns date and time in german format + */ + static getDateTimeToDisplay( + dateString: string = null, + withDate: boolean = true, + withTime: boolean = false, + withSeconds: boolean = false, + forDatePicker: boolean = false): string { + let res = ''; + const date: Date = null === dateString ? new Date() : new Date(dateString.replace(/\s/, 'T')); + const day: number = date.getDate(); + const month: number = date.getMonth() + 1; + const year: number = date.getFullYear(); + const hours: number = date.getHours(); + const minutes: number = date.getMinutes(); + const seconds: number = date.getSeconds(); + + if (forDatePicker) { + res += year; + res += '-' + (month < 10 ? '0' + month : month); + res += '-' + (day < 10 ? '0' + day : day); + } else { + if (withDate) { + res += day < 10 ? '0' + day : day; + res += '.' + (month < 10 ? '0' + month : month); + res += '.' + year; + } + if (withTime) { + res += withDate ? ' ' : ''; + res += (hours < 10 ? '0' + hours : hours); + res += ':' + (minutes < 10 ? '0' + minutes : minutes); + res += withSeconds ? ':' + (seconds < 10 ? '0' + seconds : seconds) : ''; + } + } + return res; + } + + /** + * Returns parsed date + * @param dateString + */ + static getParsedDate(dateString: string): number { + return Date.parse(dateString.replace(/\s/, 'T')); + } + + /** + * Checks URL + */ + static checkUrl(url: string): string { + if (null !== url) { + let newUrl = decodeURIComponent(url); + newUrl = newUrl.trim().replace(/\s/g, ''); + if (/^(:\/\/)/.test(newUrl)) { + return `http${newUrl}`; + } + if (!/^(f|ht)tps?:\/\//i.test(newUrl)) { + return `http://${newUrl}`; + } + return newUrl; + } else { + return null; + } + } + +} diff --git a/plp-angular/src/app/views/accounting/accounting.component.html b/plp-angular/src/app/views/accounting/accounting.component.html new file mode 100644 index 0000000..70dd05a --- /dev/null +++ b/plp-angular/src/app/views/accounting/accounting.component.html @@ -0,0 +1 @@ +

accounting works!

diff --git a/plp-angular/src/app/views/accounting/accounting.component.scss b/plp-angular/src/app/views/accounting/accounting.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/accounting/accounting.component.ts b/plp-angular/src/app/views/accounting/accounting.component.ts new file mode 100644 index 0000000..ef564cd --- /dev/null +++ b/plp-angular/src/app/views/accounting/accounting.component.ts @@ -0,0 +1,16 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-accounting', + templateUrl: './accounting.component.html', + styleUrls: ['./accounting.component.scss'] +}) + +export class AccountingComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.html b/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.html new file mode 100644 index 0000000..9a83c32 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.html @@ -0,0 +1,28 @@ +
Ansprechpartner exportieren
+
Weihnachtspost-Etiketten
+
+ + +
+ +
+ + +
+ + + + diff --git a/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.scss b/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.scss new file mode 100644 index 0000000..fed11bc --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.scss @@ -0,0 +1,11 @@ +#xmas-mail { + position: absolute; + right: 0; + top: 0; +} + +#export-customer-contacts { + position: absolute; + right: 225px; + top: 0; +} \ No newline at end of file diff --git a/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.ts b/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.ts new file mode 100644 index 0000000..0bade80 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-contact-list/customer-contact-list.component.ts @@ -0,0 +1,159 @@ +import {Component, EventEmitter, NgModule, OnInit, Output, ViewChild} from '@angular/core'; +import {AgGridComponent} from '../../../components/ag-grid-component'; +import {ICustomer} from '../../../model/entities/customer'; +import {ICustomerContact} from '../../../model/entities/customer-contact'; +import {ModalComponent} from '../../../components/modal/modal.component'; +import {CustomerContactPersonDetailComponent} from '../customer-view/customer-contact-person-detail/customer-contact-person-detail.component'; +import {Utils} from '../../../utils/utils'; +import {CustomerService} from '../../../services/customer.service'; +import {Const} from '../../../utils/const'; +import {AppService} from '../../../services/app.service'; +import {CommonService} from '../../../services/common.service'; +import {AgGridAngular} from 'ag-grid-angular'; + +@Component({ + selector: 'app-customer-contact-list', + templateUrl: './customer-contact-list.component.html', + styleUrls: ['./customer-contact-list.component.scss'] +}) + +export class CustomerContactListComponent extends AgGridComponent implements OnInit { + + @Output() shortcut: EventEmitter = new EventEmitter(); + @ViewChild('modalCustomerContactPersonDetailList', { static: true }) modalCustomerContactPersonDetailList: ModalComponent; + @ViewChild('customerContactPersonDetailList', { static: true }) customerContactPersonDetailList: CustomerContactPersonDetailComponent; + + public customers: ICustomer[]; + public customersById: {}; + private customerContacts: ICustomerContact[]; + public customerContactsById: {}; + public hasAdminRights: boolean; + public hasExportRights: boolean; + + constructor(private customerService: CustomerService, private appService: AppService, private commonService: CommonService) { + super(); + } + + ngOnInit() { + this.hasAdminRights = this.appService.userHasRole(Const.USER_ROLE_ADMIN); + this.hasExportRights = this.appService.userHasRole(Const.USER_ROLE_ADMIN); + this.customers = []; + this.customersById = {}; + this.customerContacts = []; + this.customerContactsById = {}; + + this.defaultColDef = { + resizable: true, + sortable: true + }; + + this.columnDefs = [ + {headerName: 'ID', field: 'id', width: 60 }, + {headerName: 'Kunden ID', field: 'customer_id', width: 100 }, + {headerName: 'Kunde', field: 'customer' }, + {headerName: 'Vorname', field: 'firstname' }, + {headerName: 'Nachname', field: 'lastname' }, + {headerName: 'Abteilung', field: 'department' }, + {headerName: 'E-Mail Adresse', field: 'email', cellRenderer: this.emailRenderer }, + {headerName: 'Telefon', field: 'phone_no', cellRenderer: this.phoneRenderer }, + {headerName: 'Mobil', field: 'mobile_no', cellRenderer: this.phoneRenderer }, + {headerName: 'Fax', field: 'fax_no' }, + {headerName: 'Bemerkungen', field: 'comment' } + ]; + + this.rowSelection = 'single'; + } + + /** + * Sets data + */ + public setData(customers: ICustomer[], customerContacts: ICustomerContact[]): void { + this.customers = customers; + this.customersById = Utils.getSortedObjFromArray(this.customers, 'id'); + this.customerContacts = customerContacts; + this.customerContactsById = Utils.getSortedObjFromArray(this.customerContacts, 'id'); + this.generateEntries(); + } + + /** + * Generates AG grid entries for customer grid + */ + public generateEntries(): void { + this.rowData = []; + if (null !== this.customerContacts){ + for (let i = 0; i < this.customerContacts.length; i++) { + this.rowData.push({ + id: this.customerContacts[i].id, + customer_id: this.customerContacts[i].customer_id, + customer: this.customersById[this.customerContacts[i].customer_id].name, + firstname: this.customerContacts[i].firstname, + lastname: this.customerContacts[i].lastname, + department: this.customerContacts[i].department, + email: this.customerContacts[i].email, + phone_no: this.customerContacts[i].phone_no, + mobile_no: this.customerContacts[i].mobile_no, + fax_no: this.customerContacts[i].fax_no, + comment: this.customerContacts[i].comment + }); + } + } + } + + /** + * Row is clicked + * @param e + */ + public rowClicked(e: any): void { + this.modalCustomerContactPersonDetailList.openModal(); + this.customerContactPersonDetailList.setData(this.customersById[e.data.customer_id], Utils.deepClone(this.customerContactsById[e.data.id]) as ICustomerContact); + } + + /** + * Edit customer contact + * @param customerContact + */ + public editCustomerContactFunction(customerContact: ICustomerContact): void { + this.customerService.apiEditCustomerContact(customerContact).subscribe( + data => { + this.customerContactPersonDetailList.updateData(data.result_data as ICustomer); + }, + error => {} + ); + }; + + /** + * Delete customer contact + * @param contactId + */ + public deleteCustomerContactFunction(contactId: number): void { + this.customerService.apiDeleteCustomerContact(contactId).subscribe( + data => { + this.modalCustomerContactPersonDetailList.closeModal(); + }, + error => {} + ); + }; + + /** + * Shortcut to customer detail + * @param customer + */ + public shortcutFunction(customer: ICustomer): void { + this.modalCustomerContactPersonDetailList.closeModal(); + this.shortcut.emit(customer); + }; + + /** + * Export customer contacts pdf + */ + public exportCustomerContactsPdf(): void { + this.commonService.apiExportContactsPdf('Kunden_Kontakte', 'customer'); + }; + + /** + * Export customer xmas pdf + */ + public exportXmasPdf(): void { + this.commonService.apiExportXmasPdf('Kunden_Weihnachten', 'customer'); + }; +} diff --git a/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.html b/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.html new file mode 100644 index 0000000..e9465c6 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.html @@ -0,0 +1,23 @@ +
Kunden anlegen
+ +
+ + +
+ +
+ + +
diff --git a/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.scss b/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.scss new file mode 100644 index 0000000..29db3a8 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.scss @@ -0,0 +1,14 @@ +#create-customer { + position: absolute; + right: 0; + top: 0; +} + +@media only screen and (max-width: 1004px) { + #create-customer { + position: relative; + right: auto; + top: auto; + display: inline-block; + } +} diff --git a/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.ts b/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.ts new file mode 100644 index 0000000..de0aa4a --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-list/customer-list.component.ts @@ -0,0 +1,112 @@ +import {Component, EventEmitter, OnInit, Output} from '@angular/core'; +import {AgGridComponent} from '../../../components/ag-grid-component'; +import {ICustomer} from '../../../model/entities/customer'; +import {AppService} from '../../../services/app.service'; +import {Const} from '../../../utils/const'; + +@Component({ + selector: 'app-customer-list', + templateUrl: './customer-list.component.html', + styleUrls: ['./customer-list.component.scss'] +}) + +export class CustomerListComponent extends AgGridComponent implements OnInit { + + @Output() rowIsClicked: EventEmitter = new EventEmitter(); + @Output() createNewCustomer: EventEmitter = new EventEmitter(); + + private customers: ICustomer[]; + public rowClassRules: {}; + public hasSalesRights: boolean; + public usersById: {}; + + constructor(public appService: AppService) { + super(); + } + + ngOnInit() { + this.usersById = this.appService.getConfig().vc_user_by_id; + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.customers = []; + + this.defaultColDef = { + resizable: true, + sortable: true + }; + + this.columnDefs = [ + {headerName: 'ID', field: 'customer_id', width: 60 }, + {headerName: 'Status', field: 'active', width: 90 }, + {headerName: 'Name', field: 'customer_name' }, + {headerName: 'Name Zusatz', field: 'customer_name_additional' }, + {headerName: 'Alte PLP Kennung', field: 'old_plp_id' }, + {headerName: 'PLP Mediaberater', field: 'v_consultant' }, + {headerName: 'Straße', field: 'street' }, + {headerName: 'Hausnummer', field: 'street_no' }, + {headerName: 'PLZ', field: 'zip' }, + {headerName: 'Ort', field: 'city' }, + {headerName: 'Internetadresse', field: 'url', cellRenderer: this.urlRenderer }, + {headerName: 'Bemerkungen (Allgemein)', field: 'comment' } + ]; + + this.rowSelection = 'single'; + + this.rowClassRules = { + inactive(params) { + return !params.data.active_state; + } + }; + } + + /** + * Sets data + */ + public setData(customers: ICustomer[]): void { + this.customers = customers; + this.usersById = this.appService.getConfig().vc_user_by_id; + this.generateEntries(); + } + + /** + * Generates AG grid entries for customer grid + */ + public generateEntries(): void { + this.rowData = []; + if (null !== this.customers) { + for (let i = 0; i < this.customers.length; i++) { + this.rowData.push({ + customer_id: this.customers[i].id, + active_state: this.customers[i].active, + active: this.customers[i].active ? 'Aktiv' : 'Inaktiv', + customer_name: this.customers[i].name, + customer_name_additional: this.customers[i].name_additional, + old_plp_id: this.customers[i].old_plp_id, + v_consultant: null !== this.customers[i].consultant_user_id ?? + this.usersById[this.customers[i].consultant_user_id].firstname + ' ' + this.usersById[this.customers[i].consultant_user_id].lastname, + street: this.customers[i].street, + street_no: this.customers[i].street_no, + zip: this.customers[i].zip, + city: this.customers[i].city, + url: this.customers[i].url, + comment: this.customers[i].comment, + }); + } + } + } + + /** + * Row is clicked + * @param e + */ + public rowClicked(e: any) { + this.rowIsClicked.emit(e); + } + + /** + * OnClick Create customer + */ + public createCustomer(): void { + this.createNewCustomer.emit(true); + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-management.component.html b/plp-angular/src/app/views/customer-management/customer-management.component.html new file mode 100644 index 0000000..d80fd4e --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-management.component.html @@ -0,0 +1,33 @@ +
+

Kunden

+ + + + + + + + + +
+ + + + + +
+ +
+
diff --git a/plp-angular/src/app/views/customer-management/customer-management.component.scss b/plp-angular/src/app/views/customer-management/customer-management.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-management.component.ts b/plp-angular/src/app/views/customer-management/customer-management.component.ts new file mode 100644 index 0000000..04b12eb --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-management.component.ts @@ -0,0 +1,265 @@ +import {AfterContentInit, Component, ElementRef, OnDestroy, OnInit, ViewChild} from '@angular/core'; +import {ModalComponent} from '../../components/modal/modal.component'; +import {AgGridComponent} from '../../components/ag-grid-component'; +import {ICustomer} from '../../model/entities/customer'; +import {Subscription} from 'rxjs/index'; +import {AppService} from '../../services/app.service'; +import {CustomerService} from '../../services/customer.service'; +import {CustomerViewComponent} from './customer-view/customer-view.component'; +import {CustomerDataEditComponent} from './customer-view/customer-data-edit/customer-data-edit.component'; +import {Factory} from '../../factory/factory'; +import {ICustomerContact} from '../../model/entities/customer-contact'; +import {ICustomerNote} from '../../model/entities/customer-note'; +import {TabsComponent} from '../../components/tabs/tabs.component'; +import {ICustomerMeeting} from '../../model/entities/customer-meeting'; +import {CustomerListComponent} from './customer-list/customer-list.component'; +import {CustomerContactListComponent} from './customer-contact-list/customer-contact-list.component'; +import {MeetingService} from '../../services/meeting.service'; + +@Component({ + selector: 'app-customer-management', + templateUrl: './customer-management.component.html', + styleUrls: ['./customer-management.component.scss'] +}) + +export class CustomerManagementComponent extends AgGridComponent implements OnInit, OnDestroy { + + @ViewChild('tabsCM', { static: true }) tabsCM: TabsComponent; + @ViewChild('modalCM', { static: true }) modalCM: ModalComponent; + @ViewChild('customerView', { static: true }) customerView: CustomerViewComponent; + @ViewChild('customerList', { static: true }) customerList: CustomerListComponent; + @ViewChild('customerContactList', { static: true }) customerContactList: CustomerContactListComponent; + @ViewChild('modalCustomerDataEdit', { static: true }) modalCustomerDataEdit: ModalComponent; + @ViewChild('customerDataEdit', { static: true }) customerDataEdit: CustomerDataEditComponent; + @ViewChild('headline', { static: true }) headline: ElementRef; + @ViewChild('content', { static: true }) content: ElementRef; + + private customers: ICustomer[]; + private customersSub: Subscription; + private customerContactsSub: Subscription; + public customerContacts: ICustomerContact[]; + + constructor(private appService: AppService, private customerService: CustomerService, private meetingService: MeetingService) { + super(); + this.customerService.apiGetCustomerData(); + } + + ngOnInit() { + this.customers = null; + this.customerContacts = null; + + this.customersSub = this.customerService.getCustomers$().subscribe( + data => { + this.customers = data; + this.setComponentData(); + } + ); + + this.customerContactsSub = this.customerService.getCustomerContacts$().subscribe( + data => { + this.customerContacts = data; + this.setComponentData(); + } + ); + } + + /** + * Set component data after all data has been received + */ + private setComponentData() { + if (null !== this.customers && null !== this.customerContacts){ + this.customerList.setData(this.customers); + this.customerContactList.setData(this.customers, this.customerContacts); + } + } + + /** + * Customer row is clicked + */ + public rowClickedCustomer(e: any): void { + this.customerService.apiGetCustomerFull(e.data.customer_id).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + this.modalCM.openModal(); + }, + error => {} + ); + } + + /** + * OnClick Create customer + */ + public createCustomer(): void { + this.modalCustomerDataEdit.openModal(); + this.customerDataEdit.setData(Factory.getEmptyCustomer()); + } + + /** + * Creates customer + */ + public createCustomerFunction(customer: ICustomer): void { + this.customerService.apiCreateCustomer(customer).subscribe( + data => { + this.modalCustomerDataEdit.closeModal(); + }, + error => {} + ); + } + + /** + * Saves customer + */ + public editCustomerFunction(customer: ICustomer): void { + this.customerService.apiEditCustomer(customer).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + } + + /** + * Creates customer contact + */ + public createCustomerContactFunction(customerContact: ICustomerContact): void { + this.customerService.apiCreateCustomerContact(customerContact).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + } + + /** + * Edit customer contact + */ + public editCustomerContactFunction(customerContact: ICustomerContact): void { + this.customerService.apiEditCustomerContact(customerContact).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer, true); + }, + error => {} + ); + } + + /** + * Deletes customer contact + */ + public deleteCustomerContactFunction(contactId: number): void { + this.customerService.apiDeleteCustomerContact(contactId).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + } + + /** + * Creates customer note entry + */ + public createCustomerNoteFunction(customerNote: ICustomerNote): void { + this.customerService.apiCreateCustomerNote(customerNote).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + } + + /** + * Edits customer note entry + */ + public editCustomerNoteFunction(customerNote: ICustomerNote): void { + this.customerService.apiEditCustomerNote(customerNote).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer, true); + }, + error => {} + ); + } + + /** + * Deletes customer note entry + */ + public deleteCustomerNoteFunction(customerNoteId: number): void { + this.customerService.apiDeleteCustomerNote(customerNoteId).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + } + + /** + * Creates customer meeting entry + */ + public createCustomerMeetingFunction(customerMeeting: ICustomerMeeting): void { + this.meetingService.apiCreateCustomerMeeting(customerMeeting).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + } + + /** + * Edits customer meeting entry + */ + public editCustomerMeetingFunction(customerMeeting: ICustomerMeeting): void { + this.meetingService.apiEditCustomerMeeting(customerMeeting).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer, true); + }, + error => {} + ); + } + + /** + * Deletes customer meeting entry + */ + public deleteCustomerMeetingFunction(customerMeetingId: number): void { + this.meetingService.apiDeleteCustomerMeeting(customerMeetingId).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + }, + error => {} + ); + }; + + /** + * Edit report after meeting has started + */ + public editCustomerMeetingReportFunction(reportValues: any): void { + const meetingId: number = reportValues.id; + const report: string = reportValues.report; + this.meetingService.apiEditCustomerMeetingReport(meetingId, report).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer, true); + }, + error => {} + ); + } + + /** + * Shortcut to customer detail + */ + public shortcutFunction(customer: ICustomer) : void { + this.customerService.apiGetCustomerFull(customer.id).subscribe( + data => { + this.customerView.setData(data.result_data as ICustomer); + this.modalCM.openModal(); + }, + error => {} + ); + } + + /** + * Destroy + */ + ngOnDestroy(): void { + if(this.customersSub !== null && this.customersSub !== undefined) { + this.customersSub.unsubscribe(); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.html new file mode 100644 index 0000000..c8032ba --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.html @@ -0,0 +1,50 @@ +
+

Ansprechpartner Detail

+
+
+
+
Gesprächspartner:
+
Herr + Frau + Divers {{customerContact.firstname}} {{customerContact.lastname}}
+
Abteilung:
+
{{customerContact.department}}
+
E-Mail:
+
{{customerContact.email}}
+
Telefon:
+
{{customerContact.phone_no}}
+
Mobil:
+
{{customerContact.mobile_no}}
+
Fax:
+
{{customerContact.fax_no}}
+
Adresse:
+
{{customerContact.street}} {{customerContact.street_no}}
+ {{customerContact.zip}} {{customerContact.city}} +
{{config.vc_countries_by_id[customerContact.country_id]['name']}}
+
Notiz:
+
{{customerContact.comment}}
+
Markiert für Weihnachtspost:
+
+ Ja + Nein +
+
+ +
+
+
+
+
+
+ Zum Kundenprofil +
Eintrag bearbeiten
+
Eintrag löschen
+
+
+
+
+
+
+ +
+
\ No newline at end of file diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.ts new file mode 100644 index 0000000..e9bf152 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-detail/customer-contact-person-detail.component.ts @@ -0,0 +1,99 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomer} from '../../../../model/entities/customer'; +import {ICustomerContact} from '../../../../model/entities/customer-contact'; +import {Factory} from '../../../../factory/factory'; +import {AppService} from '../../../../services/app.service'; +import {IConfig} from '../../../../model/virtual/config'; +import {Utils} from '../../../../utils/utils'; +import {CustomerContactPersonEditComponent} from '../customer-contact-person-edit/customer-contact-person-edit.component'; +import {Const} from '../../../../utils/const'; + +@Component({ + selector: 'app-customer-contact-person-detail', + templateUrl: './customer-contact-person-detail.component.html', + styleUrls: ['./customer-contact-person-detail.component.scss'] +}) + +export class CustomerContactPersonDetailComponent implements OnInit { + + @Output() deleteCustomerContact: EventEmitter = new EventEmitter(); + @Output() editCustomerContact: EventEmitter = new EventEmitter(); + @Output() shortcut: EventEmitter = new EventEmitter(); + @ViewChild('customerContactEdit', { static: true }) customerContactEdit: CustomerContactPersonEditComponent; + + public isEditMode: boolean; + public customer: ICustomer; + public customerContact: ICustomerContact; + public config: IConfig; + public hasSalesRights: boolean; + + constructor(public appService: AppService) { } + + ngOnInit() { + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.config = this.appService.getConfig(); + this.isEditMode = false; + this.customer = Factory.getEmptyCustomer(); + this.customerContact = Factory.getEmptyCustomerContact(); + } + + /** + * Sets data + */ + public setData(customer: ICustomer, customerContact: ICustomerContact): void { + this.setContactPersonData(customer); + this.customerContact = customerContact; + } + + /** + * Updates data + */ + public updateData(customer: ICustomer): void { + this.setContactPersonData(customer); + this.customer.v_customer_contacts.forEach((value) => { + if (value.id === this.customerContact.id) { + this.customerContact = value; + } + }); + } + + /** + * Sets contact person data + */ + public setContactPersonData(customer: ICustomer): void { + this.isEditMode = false; + this.customer = customer; + } + + /** + * Edit contact entry + */ + public editEntry(): void { + this.isEditMode = true; + this.customerContactEdit.setData(Utils.deepClone(this.customerContact) as ICustomerContact); + } + + /** + * Edits meeting entry + */ + public editCustomerContactFunction(customerContact: ICustomerContact) { + this.editCustomerContact.emit(customerContact); + } + + /** + * Delete contact entry + */ + public deleteEntry(): void { + const confirmAction = confirm('Wollen Sie diesen Ansprechpartner wirklich löschen?'); + if (confirmAction == true) { + this.deleteCustomerContact.emit(this.customerContact.id); + } + } + + /** + * Shortcut to customer detail + */ + public customerShortcut(): void { + this.shortcut.emit(this.customer); + } +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.html new file mode 100644 index 0000000..e44f8aa --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.html @@ -0,0 +1,135 @@ +

Ansprechpartner anlegen

+

Ansprechpartner bearbeiten

+
+
+
+

{{ errorMsg }}

+

+ Anrede ist ein Pflichtfeld. +

+

+ Nachname ist ein Pflichtfeld. +

+

+ Bitte gültige E-Mail Adresse eingeben. +

+
+
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ +
+
+ + +
+
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.ts new file mode 100644 index 0000000..0a32720 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-edit/customer-contact-person-edit.component.ts @@ -0,0 +1,76 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomerContact} from '../../../../model/entities/customer-contact'; +import {Factory} from '../../../../factory/factory'; +import {NgForm} from '@angular/forms'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {AppService} from '../../../../services/app.service'; +import {IConfig} from '../../../../model/virtual/config'; +import {FormComponent} from '../../../../components/form-component'; +import {Utils} from '../../../../utils/utils'; + +@Component({ + selector: 'app-customer-contact-person-edit', + templateUrl: './customer-contact-person-edit.component.html', + styleUrls: ['./customer-contact-person-edit.component.scss'] +}) + +export class CustomerContactPersonEditComponent extends FormComponent implements OnInit { + + @Output() createCustomerContact: EventEmitter = new EventEmitter(); + @Output() editCustomerContact: EventEmitter = new EventEmitter(); + @ViewChild('customerContactForm', { static: true }) customerContactForm: NgForm; + + public customerContact: ICustomerContact; + public config: IConfig; + + constructor(private appService: AppService, /*protected scrollToService: ScrollToService*/) { + super(/*scrollToService*/); + } + + ngOnInit() { + this.customerContact = Factory.getEmptyCustomerContact(); + this.config = this.appService.getConfig(); + } + + /** + * Sets data + */ + public setData(customerContact: ICustomerContact): void { + this.customerContact = customerContact; + this.isCreationMode = null === this.customerContact.id; + this.errorMsg = ''; + this.resetFormValidation(); + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + this.customerContactForm.form.markAsUntouched(); + } + + /** + * Saves customer + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + if (valid) { + // Check if date is valid + if (null === this.customerContact.date_of_birth || + (null !== this.customerContact.date_of_birth && Utils.isValidDate(this.customerContact.date_of_birth))) { + if (this.isCreationMode) { + this.createCustomerContact.emit(this.customerContact); + } else { + this.editCustomerContact.emit(this.customerContact); + } + this.errorMsg = ''; + } else { + this.errorMsg = 'Bitte korrektes Datum eingeben.'; + // todo this.scrollUp(this.isCreationMode ? 'customer-contact-person-modal' : 'customer-contact-person-edit-modal'); + } + } else { + // todo this.scrollUp(this.isCreationMode ? 'customer-contact-person-modal' : 'customer-contact-person-edit-modal'); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.html new file mode 100644 index 0000000..f694f1c --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.html @@ -0,0 +1,35 @@ +

Ansprechpartner

+

Hier sind die Ansprechpartner zu sehen:

+
Ansprechpartner anlegen
+
+ + +
+
+ + +
+ + + + + + +
+ +
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.scss new file mode 100644 index 0000000..e571d97 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.scss @@ -0,0 +1,14 @@ +#create-customer-contact { + position: absolute; + right: 0; + top: -6rem; +} + +@media only screen and (max-width: 1004px) { + #create-customer-contact { + position: relative; + right: auto; + top: auto; + display: inline-block; + } +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.ts new file mode 100644 index 0000000..2116435 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-contact-person-view/customer-contact-person-view.component.ts @@ -0,0 +1,172 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomer} from '../../../../model/entities/customer'; +import {Factory} from '../../../../factory/factory'; +import {ICustomerContact} from '../../../../model/entities/customer-contact'; +import {AgGridComponent} from '../../../../components/ag-grid-component'; +import {ModalComponent} from '../../../../components/modal/modal.component'; +import {CustomerContactPersonEditComponent} from '../customer-contact-person-edit/customer-contact-person-edit.component'; +import {Utils} from '../../../../utils/utils'; +import {IConfig} from '../../../../model/virtual/config'; +import {AppService} from '../../../../services/app.service'; +import {CustomerContactPersonDetailComponent} from '../customer-contact-person-detail/customer-contact-person-detail.component'; +import {Const} from '../../../../utils/const'; + +@Component({ + selector: 'app-customer-contact-person-view', + templateUrl: './customer-contact-person-view.component.html', + styleUrls: ['./customer-contact-person-view.component.scss'] +}) + +export class CustomerContactPersonViewComponent extends AgGridComponent implements OnInit { + + @Output() createCustomerContact: EventEmitter = new EventEmitter(); + @Output() editCustomerContact: EventEmitter = new EventEmitter(); + @Output() deleteCustomerContact: EventEmitter = new EventEmitter(); + @Output() shortcut: EventEmitter = new EventEmitter(); + @ViewChild('modalCustomerContactPersonEdit', { static: true }) modalCustomerContactPersonEdit: ModalComponent; + @ViewChild('customerContactPersonEdit', { static: true }) customerContactPersonEdit: CustomerContactPersonEditComponent; + @ViewChild('modalCustomerContactPersonDetail', { static: true }) modalCustomerContactPersonDetail: ModalComponent; + @ViewChild('customerContactPersonDetail', { static: true }) customerContactPersonDetail: CustomerContactPersonDetailComponent; + + public customer: ICustomer; + public customerContacts: ICustomerContact[]; + public customerContactsById: {}; + public config: IConfig; + public hasSalesRights: boolean; + + constructor(private appService: AppService) { + super(); + } + + ngOnInit() { + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.config = this.appService.getConfig(); + this.customer = Factory.getEmptyCustomer(); + this.customerContacts = []; + this.customerContactsById = {}; + + this.defaultColDef = { + resizable: true, + sortable: true + }; + + this.columnDefs = [ + {headerName: 'Anrede', field: 'gender', width: 90 }, + {headerName: 'Vorname', field: 'firstname' }, + {headerName: 'Nachname', field: 'lastname' }, + {headerName: 'Abteilung', field: 'department' }, + {headerName: 'E-Mail Adresse', field: 'email', cellRenderer: this.emailRenderer }, + {headerName: 'Telefon', field: 'phone_no', cellRenderer: this.phoneRenderer }, + {headerName: 'Mobil', field: 'mobile_no', cellRenderer: this.phoneRenderer }, + {headerName: 'Fax', field: 'fax_no' }, + {headerName: 'Straße', field: 'street' }, + {headerName: 'Hausnummer', field: 'street_no' }, + {headerName: 'PLZ', field: 'zip' }, + {headerName: 'Ort', field: 'city' }, + {headerName: 'Land', field: 'country' }, + {headerName: 'Bemerkungen', field: 'comment' } + ]; + } + + /** + * Sets data + * @param customer + * @param isUpdate + */ + public setData(customer: ICustomer, isUpdate: boolean): void { + this.customer = customer; + this.customerContacts = this.customer.v_customer_contacts; + this.customerContactsById = Utils.getSortedObjFromArray(this.customerContacts, 'id'); + this.modalCustomerContactPersonEdit.closeModal(); + this.generateEntries(); + if (isUpdate) { + this.customerContactPersonDetail.updateData(customer); + } else { + this.modalCustomerContactPersonDetail.closeModal(); + } + } + + /** + * Generates AG grid entries + */ + public generateEntries(): void { + this.rowData = []; + for (let i = 0; i < this.customerContacts.length; i++) { + let ccGender: string; + if (this.customerContacts[i].gender == 'male') { + ccGender = 'Herr'; + } else if (this.customerContacts[i].gender == 'female') { + ccGender = 'Frau'; + } else { + ccGender = 'Divers'; + } + this.rowData.push({ + id: this.customerContacts[i].id, + gender: ccGender, + firstname: this.customerContacts[i].firstname, + lastname: this.customerContacts[i].lastname, + department: this.customerContacts[i].department, + email: this.customerContacts[i].email, + phone_no: this.customerContacts[i].phone_no, + mobile_no: this.customerContacts[i].mobile_no, + fax_no: this.customerContacts[i].fax_no, + street: this.customerContacts[i].street, + street_no: this.customerContacts[i].street_no, + zip: this.customerContacts[i].zip, + city: this.customerContacts[i].city, + country: null !== this.customerContacts[i].country_id ? this.config.vc_countries_by_id[this.customerContacts[i].country_id].name : null, + comment: this.customerContacts[i].comment, + }); + } + } + + /** + * On row click + * @param e + */ + public rowClicked(e: any) { + this.modalCustomerContactPersonDetail.openModal(); + this.customerContactPersonDetail.setData(this.customer, Utils.deepClone(this.customerContactsById[e.data.id]) as ICustomerContact); + } + + /** + * On create click + */ + public create(): void { + this.modalCustomerContactPersonEdit.openModal(); + this.customerContactPersonEdit.setData(Factory.getEmptyCustomerContact(this.customer.id)); + } + + /** + * Creates customer contact + * @param customerContact + */ + public createCustomerContactFunction(customerContact: ICustomerContact): void { + this.createCustomerContact.emit(customerContact); + } + + /** + * Edit customer contact + * @param customerContact + */ + public editCustomerContactFunction(customerContact: ICustomerContact): void { + this.editCustomerContact.emit(customerContact); + } + + /** + * Deletes customer contact + * @param contactId + */ + public deleteCustomerContactFunction(contactId: number): void { + this.deleteCustomerContact.emit(contactId); + } + + /** + * Shortcut to customer detail + * @param customer + */ + public shortcutFunction(customer: ICustomer): void { + this.modalCustomerContactPersonDetail.closeModal(); + this.shortcut.emit(customer); + } +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.html new file mode 100644 index 0000000..e4a9052 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.html @@ -0,0 +1,127 @@ +

{{customer.name}} bearbeiten

+

Kunden anlegen

+
+
+
+

{{ errorMsg }}

+

+ Name ist ein Pflichtfeld. +

+

+ Bitte gültige E-Mail Adresse eingeben. +

+
+
+
+
+

Aktivität

+ + +
+
+ + +
+
+
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + +
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+
+ + +
+
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.ts new file mode 100644 index 0000000..a2257e6 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-data-edit/customer-data-edit.component.ts @@ -0,0 +1,75 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomer} from '../../../../model/entities/customer'; +import {Factory} from '../../../../factory/factory'; +import {NgForm} from '@angular/forms'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {AppService} from '../../../../services/app.service'; +import {IConfig} from '../../../../model/virtual/config'; +import {FormComponent} from '../../../../components/form-component'; +import {IUser} from '../../../../model/entities/user'; + +@Component({ + selector: 'app-customer-data-edit', + templateUrl: './customer-data-edit.component.html', + styleUrls: ['./customer-data-edit.component.scss'] +}) + +export class CustomerDataEditComponent extends FormComponent implements OnInit { + + @Output() editCustomer: EventEmitter = new EventEmitter(); + @Output() createCustomer: EventEmitter = new EventEmitter(); + @ViewChild('customerDataForm', { static: true }) customerDataForm: NgForm; + + public customer: ICustomer; + public config: IConfig; + public users: IUser[]; + public usersById: {}; + public consultant: IUser; + + constructor(private appService: AppService, /*protected scrollToService: ScrollToService*/) { + super(/*scrollToService*/); + } + + ngOnInit() { + this.customer = Factory.getEmptyCustomer(); + this.config = this.appService.getConfig(); + this.users = this.appService.getConfig().users; + this.usersById = this.appService.getConfig().vc_user_by_id; + this.consultant = null; + } + + /** + * Sets data + */ + public setData(customer: ICustomer): void { + this.customer = customer; + this.isCreationMode = null === this.customer.id; + this.errorMsg = ''; + this.resetFormValidation(); + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + this.customerDataForm.form.markAsUntouched(); + } + + /** + * Saves customer + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + if (valid) { + if (this.isCreationMode) { + this.createCustomer.emit(this.customer); + } else { + this.editCustomer.emit(this.customer); + } + this.errorMsg = ''; + } else { + // todo this.scrollUp(this.isCreationMode ? 'customer-data-modal' : 'customer-data-edit-modal'); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.html new file mode 100644 index 0000000..654f766 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.html @@ -0,0 +1,40 @@ +

Kundendaten

+
+
+
+
Status:
+
AktivInaktiv
+
Firma:
+
{{customer.name}} ({{customer.old_plp_id}})
+
Zusatz:
+
{{customer.name_additional}}
+
PLP Mediaberater:
+
{{usersById[customer.consultant_user_id]['firstname']}} {{usersById[customer.consultant_user_id]['lastname']}}
+
Adresse:
+
{{customer.street}} {{customer.street_no}}
+ {{customer.zip}} {{customer.city}} +
{{config.vc_countries_by_id[customer.country_id]['name']}}
+
Internetadresse:
+
{{checkedUrl}}
+
E-Mail (Zentrale):
+
{{customer.email}}
+
Telefon (Zentrale):
+
{{customer.phone_no}}
+
Mobil (Zentrale):
+
{{customer.mobile_no}}
+
Fax (Zentrale):
+
{{customer.fax_no}}
+
Bemerkung:
+
{{customer.comment}}
+
+
+
+
bearbeiten
+
+
+ + +
+ +
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.ts new file mode 100644 index 0000000..5bcb0ca --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-data-view/customer-data-view.component.ts @@ -0,0 +1,65 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomer} from '../../../../model/entities/customer'; +import {Factory} from '../../../../factory/factory'; +import {Utils} from '../../../../utils/utils'; +import {ModalComponent} from '../../../../components/modal/modal.component'; +import {CustomerDataEditComponent} from '../customer-data-edit/customer-data-edit.component'; +import {AppService} from '../../../../services/app.service'; +import {IConfig} from '../../../../model/virtual/config'; +import {Const} from '../../../../utils/const'; + +@Component({ + selector: 'app-customer-data-view', + templateUrl: './customer-data-view.component.html', + styleUrls: ['./customer-data-view.component.scss'] +}) + +export class CustomerDataViewComponent implements OnInit { + + @Output() editCustomer: EventEmitter = new EventEmitter(); + @ViewChild('modalCustomerDataEdit', { static: true }) modalCustomerDataEdit: ModalComponent; + @ViewChild('customerDataEdit', { static: true }) customerDataEdit: CustomerDataEditComponent; + + public customer: ICustomer; + public checkedUrl: string; + public config: IConfig; + public hasSalesRights: boolean; + public usersById: {}; + + constructor(private appService: AppService) { } + + ngOnInit() { + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.config = this.appService.getConfig(); + this.customer = Factory.getEmptyCustomer(); + this.checkedUrl = ''; + this.usersById = this.appService.getConfig().vc_user_by_id; + } + + /** + * Sets data + * @param customer + */ + public setData(customer: ICustomer): void { + this.customer = customer; + this.checkedUrl = Utils.checkUrl(this.customer.url); + this.modalCustomerDataEdit.closeModal(); + } + + /** + * On edit click + */ + public edit(): void { + this.modalCustomerDataEdit.openModal(); + this.customerDataEdit.setData(Utils.deepClone(this.customer) as ICustomer); + } + + /** + * Saves customer + * @param customer + */ + public editCustomerFunction(customer: ICustomer): void { + this.editCustomer.emit(customer); + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.html new file mode 100644 index 0000000..5c31c79 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.html @@ -0,0 +1,80 @@ +
+

Termin mit Kunde: {{customer.name}}

+

{{date}} {{timeStart}} Uhr bis {{timeEnd}} Uhr

+

{{customerMeeting.title}}

+
Erstellt von: {{creator.firstname}} {{creator.lastname}}
+

{{customerMeeting.description}}

+
+
+
+
+
Termin-Art:
+
{{meetingType.name}} +
Optionstermin
+
+
PLP Verantwortlicher:
+
{{owner.firstname}} {{owner.lastname}}
+
Teilnehmer:
+
+ + {{p.firstname}} {{p.lastname}}
+
+
+
Adresse:
+
{{customerMeeting.street}} {{customerMeeting.street_no}}
+ {{customerMeeting.zip}} {{customerMeeting.city}} +
{{config.vc_countries_by_id[customerMeeting.country_id]['name']}}
+
Gesprächspartner:
+
Herr + Frau + Divers {{customerMeeting.firstname}} {{customerMeeting.lastname}}
+
Abteilung:
+
{{customerMeeting.department}}
+
E-Mail:
+
{{customerMeeting.email}}
+
Telefon:
+
{{customerMeeting.phone_no}}
+
Mobil:
+
{{customerMeeting.mobile_no}}
+
Report:
+
{{reportOld}}
+
+
+
+ +
+
+
+
+
+
+
Eintrag bearbeiten
+
Eintrag löschen
+
Report bearbeiten
+
+
+
+
+
+
+

{{ errorMsg }}

+
+
+
+ + +
+
+
+
+ +
+
+
+
+
+
+
+ +
+
\ No newline at end of file diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.ts new file mode 100644 index 0000000..8207f94 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component.ts @@ -0,0 +1,199 @@ +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + EventEmitter, + OnInit, + Output, + ViewChild +} from '@angular/core'; +import {ICustomerMeeting} from '../../../../model/entities/customer-meeting'; +import {CustomerMeetingEditComponent} from '../customer-meeting-edit/customer-meeting-edit.component'; +import {Factory} from '../../../../factory/factory'; +import {ICustomer} from '../../../../model/entities/customer'; +import {Utils} from '../../../../utils/utils'; +import {IUser} from '../../../../model/entities/user'; +import {AppService} from '../../../../services/app.service'; +import {IMeetingType} from '../../../../model/entities/meeting-type'; +import {IConfig} from '../../../../model/virtual/config'; +import {NgForm} from '@angular/forms'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {CustomerService} from '../../../../services/customer.service'; +import {MeetingService} from '../../../../services/meeting.service'; +import {FormComponent} from '../../../../components/form-component'; +import {Const} from '../../../../utils/const'; + +@Component({ + selector: 'app-customer-meeting-detail', + templateUrl: './customer-meeting-detail.component.html', + styleUrls: ['./customer-meeting-detail.component.scss'], + // NOTE: We need manual change detection in this component + changeDetection: ChangeDetectionStrategy.OnPush, +}) + +export class CustomerMeetingDetailComponent extends FormComponent implements OnInit { + + @Output() editMeeting: EventEmitter = new EventEmitter(); + @Output() deleteMeeting: EventEmitter = new EventEmitter(); + @Output() editMeetingReport: EventEmitter = new EventEmitter(); + @ViewChild('customerMeetingDetailEdit', { static: true }) customerMeetingDetailEdit: CustomerMeetingEditComponent; + @ViewChild('customerMeetingReportForm', { static: true }) customerMeetingReportForm: NgForm; + + public customer: ICustomer; + public customerMeeting: ICustomerMeeting; + public isEditMode: boolean; + public creator: IUser; + public owner: IUser; + public participants: IUser[]; + public meetingType: IMeetingType; + public date: string; + public timeStart: string; + public timeEnd: string; + public config: IConfig; + public reportFormVisible: boolean; + public reportOld: string; + public hasEditRights: boolean; + public hasReportRights: boolean; + + constructor(public appService: AppService, private customerService: CustomerService, private meetingService: MeetingService, /*protected scrollToService: ScrollToService,*/ private ref: ChangeDetectorRef) { + super(/*scrollToService*/); + } + + ngOnInit() { + this.hasEditRights = this.appService.userHasRole(Const.USER_ROLE_ADMIN); + this.hasReportRights = this.appService.userHasRole(Const.USER_ROLE_ADMIN); + this.config = this.appService.getConfig(); + this.customer = Factory.getEmptyCustomer(); + this.customerMeeting = Factory.getEmptyCustomerMeeting(); + this.creator = Factory.getEmptyUser(); + this.owner = Factory.getEmptyUser(); + this.participants = []; + this.meetingType = Factory.getEmptyMeetingType(); + this.date = ''; + this.timeStart = ''; + this.timeEnd = ''; + this.reportFormVisible = false; + this.reportOld = ''; + } + + /** + * Set data + */ + public setData(customer: ICustomer, customerMeeting: ICustomerMeeting): void { + this.customer = customer; + this.customerMeeting = customerMeeting; + this.hasEditRights = + this.appService.userHasRole(Const.USER_ROLE_ADMIN) || + this.appService.getAppUser().id === customerMeeting.creation_user_id || + this.appService.getAppUser().id === customerMeeting.owner_user_id; + this.hasReportRights = + this.appService.userHasRole(Const.USER_ROLE_ADMIN) || + this.appService.getAppUser().id === customerMeeting.owner_user_id; + this.setMeetingData(); + } + + /** + * Updates data + */ + public updateData(customer: ICustomer): void { + this.customer = customer; + if (null !== this.customerMeeting.id){ + this.customer.v_customer_meetings.forEach(item => { + if (item.id === this.customerMeeting.id) { + this.customerMeeting = item; + } + }); + this.setMeetingData(); + } + } + + /** + * Sets variables for meeting + */ + public setMeetingData(): void { + this.errorMsg = ''; + this.reportFormVisible = false; + this.reportOld = this.customerMeeting.report; + this.creator = this.appService.getConfig().vc_user_by_id[this.customerMeeting.creation_user_id]; + this.owner = this.appService.getConfig().vc_user_by_id[this.customerMeeting.owner_user_id]; + this.participants = []; + this.customerMeeting.v_participants.forEach(item => { + this.participants.push(this.appService.getConfig().vc_user_by_id[item.participant_user_id]); + }); + this.meetingType = this.appService.getConfig().vc_meeting_types_by_id[this.customerMeeting.meeting_type_id]; + this.date = Utils.getDateTimeToDisplay(this.customerMeeting.start_date); + this.timeStart = Utils.getDateTimeToDisplay(this.customerMeeting.start_date, false, true); + this.timeEnd = Utils.getDateTimeToDisplay(this.customerMeeting.end_date, false, true); + this.isEditMode = false; + this.resetFormValidation(); + // NOTE: We need manual change detection in this component + this.ref.detectChanges(); + } + + /** + * Edit meeting entry + */ + public editEntry(): void { + this.isEditMode = true; + this.customerMeetingDetailEdit.setData(this.customer, Utils.deepClone(this.customerMeeting) as ICustomerMeeting); + } + + /** + * Edits meeting entry + */ + public editCustomerMeetingFunction(customerMeeting: ICustomerMeeting): void { + this.editMeeting.emit(customerMeeting); + } + + /** + * Delete meeting entry + */ + public deleteEntry(): void { + const confirmAction = confirm('Wollen Sie diesen Eintrag wirklich löschen?'); + if (confirmAction === true) { + this.deleteMeeting.emit(this.customerMeeting.id); + } + } + + /** + * Check if edit report after meeting has started + */ + public editReport(): void { + this.meetingService.apiCheckCustomerMeetingReport(this.customerMeeting.id).subscribe( + data => { + this.reportFormVisible = data.result_data as boolean; + // NOTE: We need manual change detection in this component + this.ref.detectChanges(); + // todo this.scrollUp('customer-meeting-edit-report'); + }, + error => { + } + ); + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + if (this.reportFormVisible) { + this.customerMeetingReportForm.form.markAsUntouched(); + } + } + + /** + * Saves customer meeting report + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + if (valid) { + this.editMeetingReport.emit({ + id: this.customerMeeting.id, + report: this.customerMeeting.report + }); + this.errorMsg = ''; + } else { + // todo this.scrollUp('customer-meeting-edit-report'); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.html new file mode 100644 index 0000000..ac2af5d --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.html @@ -0,0 +1,208 @@ +

Kunden-Termin anlegen

+

Kunden-Termin bearbeiten

+
+
+
+

{{ errorMsg }}

+

+ Betreff ist ein Pflichtfeld. +

+

+ Datum ist ein Pflichtfeld. +

+

+ Uhrzeit (Start) ist ein Pflichtfeld. +

+

+ Uhrzeit (Ende) ist ein Pflichtfeld. +

+

+ Termin-Art ist ein Pflichtfeld. +

+

+ PLP Verantwortlicher ist ein Pflichtfeld. +

+ + + + + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+

 

+ + +
+
+ +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+

Teilnehmer

+
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
+ +
+
+ + +
+
+
\ No newline at end of file diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.ts new file mode 100644 index 0000000..520c213 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component.ts @@ -0,0 +1,248 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {NgForm} from '@angular/forms'; +import {ICustomerMeeting} from '../../../../model/entities/customer-meeting'; +import {ICustomer} from '../../../../model/entities/customer'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {Factory} from '../../../../factory/factory'; +import {ICustomerContact} from '../../../../model/entities/customer-contact'; +import {Utils} from '../../../../utils/utils'; +import {AppService} from '../../../../services/app.service'; +import {IUser} from '../../../../model/entities/user'; +import {IMeetingType} from '../../../../model/entities/meeting-type'; +import {IConfig} from '../../../../model/virtual/config'; +import {FormComponent} from '../../../../components/form-component'; + +@Component({ + selector: 'app-customer-meeting-edit', + templateUrl: './customer-meeting-edit.component.html', + styleUrls: ['./customer-meeting-edit.component.scss'] +}) + +export class CustomerMeetingEditComponent extends FormComponent implements OnInit { + + @Output() createMeeting: EventEmitter = new EventEmitter(); + @Output() editMeeting: EventEmitter = new EventEmitter(); + @ViewChild('customerMeetingForm', { static: true }) customerMeetingForm: NgForm; + + public customer: ICustomer; + public customerMeeting: ICustomerMeeting; + public customerContacts: ICustomerContact[]; + public customerContactsById: {}; + public isExistingCustomerContact: boolean; + public users: IUser[]; + public usersById: {}; + public possibleOwners: IUser[]; + public participants: IUser[]; + public selectedParticipantsById: {}; + public selectedParticipantsByIdInitial: {}; + public owner: IUser; + public startDate: string; + public timeStart: string; + public timeEnd: string; + public meetingTypes: IMeetingType[]; + public contactPersonValue: string; + public config: IConfig; + + constructor(public appService: AppService, /*protected scrollToService: ScrollToService*/) { + super(/*scrollToService*/); + } + + ngOnInit() { + this.config = this.appService.getConfig(); + this.customer = Factory.getEmptyCustomer(); + this.customerMeeting = Factory.getEmptyCustomerMeeting(); + this.customerContacts = []; + this.customerContactsById = {}; + this.isExistingCustomerContact = false; + this.users = this.appService.getConfig().users; + this.usersById = this.appService.getConfig().vc_user_by_id; + this.possibleOwners = []; + this.participants = []; + this.selectedParticipantsById = {}; + this.selectedParticipantsByIdInitial = {}; + this.owner = Factory.getEmptyUser(); + this.startDate = ''; + this.timeStart = ''; + this.timeEnd = ''; + this.meetingTypes = []; + this.contactPersonValue = ''; + } + + /** + * Sets data + */ + public setData(customer: ICustomer, customerMeeting: ICustomerMeeting, isCreationMode: boolean = false): void { + this.customer = customer; + this.customerMeeting = customerMeeting; + this.customerContacts = this.customer.v_customer_contacts; + this.customerContactsById = Utils.getSortedObjFromArray(this.customerContacts, 'id'); + this.isCreationMode = isCreationMode; + this.startDate = Utils.getDateTimeToDisplay(this.customerMeeting.start_date, true, false, false, true); + this.timeStart = Utils.getDateTimeToDisplay(this.customerMeeting.start_date, false, true); + this.timeEnd = Utils.getDateTimeToDisplay(this.customerMeeting.end_date, false, true); + this.meetingTypes = this.appService.getConfig().meeting_types; + + this.owner = this.customerMeeting.owner_user_id !== null ? + this.appService.getConfig().vc_user_by_id[this.customerMeeting.owner_user_id] : null; + this.selectedParticipantsById = Utils.getSortedObjFromArray(this.customerMeeting.v_participants, 'participant_user_id'); + this.selectedParticipantsByIdInitial = Utils.getSortedObjFromArray(this.customerMeeting.v_participants, 'participant_user_id'); + this.participants = []; + + for (const p in this.usersById) { + if (this.isCreationMode) { + // New meeting + if (this.usersById[p].active) { + this.participants.push(this.usersById[p]); + this.possibleOwners.push(this.usersById[p]); + } + } else { + // Existing meeting + const userAttendsToMeeting: boolean = this.selectedParticipantsByIdInitial.hasOwnProperty(this.usersById[p].id); + if (this.usersById[p].id !== this.owner.id && (this.usersById[p].active || userAttendsToMeeting)) { + this.participants.push(this.usersById[p]); + this.possibleOwners.push(this.usersById[p]); + } + if (this.usersById[p].id === this.owner.id) { + this.possibleOwners.push(this.usersById[p]); + } + } + } + + if (null === this.customerMeeting.customer_contact_id) { + this.customerMeeting.customer_contact_id = -1; + } + if (this.customerMeeting.customer_contact_id > 0) { + this.isExistingCustomerContact = true; + } + this.errorMsg = ''; + this.resetFormValidation(); + } + + /** + * On select contact + */ + public selectContact(e: any) { + this.customerMeeting.customer_contact_id = e.target.value; + this.isExistingCustomerContact = false; + this.customerMeeting.gender = null; + this.customerMeeting.firstname = null; + this.customerMeeting.lastname = null; + this.customerMeeting.department = null; + this.customerMeeting.email = null; + this.customerMeeting.phone_no = null; + this.customerMeeting.mobile_no = null; + if (this.customerMeeting.customer_contact_id > 0) { + this.customerMeeting.gender = this.customerContactsById[this.customerMeeting.customer_contact_id].gender; + this.customerMeeting.firstname = this.customerContactsById[this.customerMeeting.customer_contact_id].firstname; + this.customerMeeting.lastname = this.customerContactsById[this.customerMeeting.customer_contact_id].lastname; + this.customerMeeting.department = this.customerContactsById[this.customerMeeting.customer_contact_id].department; + this.customerMeeting.email = this.customerContactsById[this.customerMeeting.customer_contact_id].email; + this.customerMeeting.phone_no = this.customerContactsById[this.customerMeeting.customer_contact_id].phone_no; + this.customerMeeting.mobile_no = this.customerContactsById[this.customerMeeting.customer_contact_id].mobile_no; + this.isExistingCustomerContact = true; + } + } + + /** + * On select owner + */ + public selectOwner(e: any) { + if (e.target.value !== '0: null') { + this.owner = this.usersById[e.target.value]; + if (this.selectedParticipantsById.hasOwnProperty(this.owner.id)) { + delete this.selectedParticipantsById[this.owner.id]; + } + } else { + this.owner = null; + } + this.participants = []; + for (const p in this.usersById) { + if ((this.owner == null || this.usersById[p].id !== this.owner.id) && this.usersById[p].active) { + this.participants.push(this.usersById[p]); + } + } + } + + /** + * On select meeting type + */ + public selectMeetingType(e: any) { + this.customerMeeting.meeting_type_id = e.target.value; + } + + /** + * On select participant + */ + public participantsChange(e: any) { + const participantUserId: number = parseInt(e.target.value); + if (this.selectedParticipantsById.hasOwnProperty(participantUserId)) { + delete this.selectedParticipantsById[participantUserId]; + } else { + let myId: number = null; + if (this.selectedParticipantsByIdInitial.hasOwnProperty(participantUserId)) { + myId = this.selectedParticipantsByIdInitial[participantUserId].id; + } + this.selectedParticipantsById[participantUserId] = { + id: myId, + customer_meeting_id: this.customerMeeting.id, + participant_user_id: participantUserId + }; + } + } + + /** + * Checks if participant is selected + */ + public checkParticipants(id: number) { + return this.selectedParticipantsById.hasOwnProperty(id); + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + this.customerMeetingForm.form.markAsUntouched(); + } + + /** + * Saves customer meeting + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + const identifier: string = this.isCreationMode ? 'customer-meeting-modal' : 'customer-meeting-edit-modal'; + if (valid) { + // Check if start time before end time + if (parseInt(this.timeStart.replace(/\:/g, '')) - parseInt(this.timeEnd.replace(/\:/g, '')) > 0) { + this.errorMsg = 'Zeit (Ende) darf nicht vor Zeit (Start) liegen.'; + // todo this.scrollUp(identifier); + } else { + this.customerMeeting.start_date = this.startDate + ' ' + this.timeStart + ':00'; + this.customerMeeting.end_date = this.startDate + ' ' + this.timeEnd + ':00'; + // Check if date is valid + if (Utils.isValidDate(this.customerMeeting.start_date)) { + this.customerMeeting.v_participants = []; + for (const spId in this.selectedParticipantsById) { + this.customerMeeting.v_participants.push(this.selectedParticipantsById[spId]); + } + + if (this.customerMeeting.customer_contact_id === -1) { + this.customerMeeting.customer_contact_id = null; + } + + if (this.isCreationMode) { + this.createMeeting.emit(this.customerMeeting); + } else { + this.editMeeting.emit(this.customerMeeting); + } + this.errorMsg = ''; + } else { + this.errorMsg = 'Bitte korrektes Datum eingeben.'; + // todo this.scrollUp(identifier); + } + } + } else { + // todo this.scrollUp(identifier); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.html new file mode 100644 index 0000000..3031631 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.html @@ -0,0 +1,33 @@ +

Termine

+
Termin hinzufügen
+
+ + +
+
+ + +
+ + + + + + +
+ +
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.scss new file mode 100644 index 0000000..26b894d --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.scss @@ -0,0 +1,14 @@ +#create-meeting { + position: absolute; + right: 0; + top: -6rem; +} + +@media only screen and (max-width: 1004px) { + #create-meeting { + position: relative; + right: auto; + top: auto; + display: inline-block; + } +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.ts new file mode 100644 index 0000000..eb7a170 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-meeting-view/customer-meeting-view.component.ts @@ -0,0 +1,192 @@ +import {Component, EventEmitter, OnDestroy, OnInit, Output, ViewChild} from '@angular/core'; +import {AgGridComponent} from '../../../../components/ag-grid-component'; +import {ICustomerMeeting} from '../../../../model/entities/customer-meeting'; +import {ICustomer} from '../../../../model/entities/customer'; +import {Factory} from '../../../../factory/factory'; +import {ModalComponent} from '../../../../components/modal/modal.component'; +import {CustomerMeetingEditComponent} from '../customer-meeting-edit/customer-meeting-edit.component'; +import {Utils} from '../../../../utils/utils'; +import {CustomerMeetingDetailComponent} from '../customer-meeting-detail/customer-meeting-detail.component'; +import {IUser} from '../../../../model/entities/user'; +import {IMeetingType} from '../../../../model/entities/meeting-type'; +import {AppService} from '../../../../services/app.service'; +import {Const} from '../../../../utils/const'; + +@Component({ + selector: 'app-customer-meeting-view', + templateUrl: './customer-meeting-view.component.html', + styleUrls: ['./customer-meeting-view.component.scss'] +}) + +export class CustomerMeetingViewComponent extends AgGridComponent implements OnInit, OnDestroy { + + @Output() createMeeting: EventEmitter = new EventEmitter(); + @Output() editMeeting: EventEmitter = new EventEmitter(); + @Output() deleteMeeting: EventEmitter = new EventEmitter(); + @Output() editMeetingReport: EventEmitter = new EventEmitter(); + @ViewChild('modalCustomerMeetingEdit', {static: true}) modalCustomerMeetingEdit: ModalComponent; + @ViewChild('customerMeetingEdit', {static: true}) customerMeetingEdit: CustomerMeetingEditComponent; + @ViewChild('modalCustomerMeetingDetail', {static: true}) modalCustomerMeetingDetail: ModalComponent; + @ViewChild('customerMeetingDetail', {static: true}) customerMeetingDetail: CustomerMeetingDetailComponent; + + public customer: ICustomer; + public customerMeeting: ICustomerMeeting[]; + public customerMeetingEntriesById: {}; + public owner: IUser; + public participants: IUser[]; + public meetingType: IMeetingType; + public date: string; + public timeStart: string; + public timeEnd: string; + public hasSalesRights: boolean; + + constructor(public appService: AppService) { + super(); + } + + ngOnInit() { + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.customer = Factory.getEmptyCustomer(); + this.customerMeeting = []; + this.customerMeetingEntriesById = {}; + this.owner = Factory.getEmptyUser(); + this.participants = []; + this.meetingType = Factory.getEmptyMeetingType(); + this.date = ''; + this.timeStart = ''; + this.timeEnd = ''; + + this.defaultColDef = { + resizable: true, + sortable: true + }; + + this.columnDefs = [ + {headerName: 'Datum', field: 'date', cellRenderer: this.dateRenderer, comparator: this.dateComparator}, + {headerName: 'Ersteller', field: 'creator' }, + {headerName: 'PLP Verantwortlicher', field: 'owner'}, + {headerName: 'Gesprächspartner', field: 'customerContactName'}, + {headerName: 'Titel', field: 'title'}, + {headerName: 'Uhrzeit (Start)', field: 'time_start', cellRenderer: this.timeRenderer}, + {headerName: 'Uhrzeit (Ende)', field: 'time_end', cellRenderer: this.timeRenderer}, + {headerName: 'Termin-Art', field: 'type'}, + {headerName: 'Optionstermin', field: 'is_option_meeting', cellRenderer: this.optionRenderer}, + {headerName: 'Adresse', field: 'address', cellRenderer: this.addressRenderer, autoHeight: true}, + { + headerName: 'Teilnehmer', + field: 'participants', + cellRenderer: this.participantsRenderer, + autoHeight: true + }, + {headerName: 'Abteilung', field: 'department'}, + {headerName: 'E-Mail', field: 'email'}, + {headerName: 'Telefon', field: 'phone'}, + {headerName: 'Mobil', field: 'mobile'}, + ]; + } + + /** + * Sets data + */ + public setData(customer: ICustomer, isUpdate: boolean): void { + this.customer = customer; + this.customerMeeting = this.customer.v_customer_meetings; + this.customerMeetingEntriesById = Utils.getSortedObjFromArray(this.customerMeeting, 'id'); + this.modalCustomerMeetingEdit.closeModal(); + this.generateEntries(); + if (isUpdate) { + this.customerMeetingDetail.updateData(customer); + } else { + this.modalCustomerMeetingDetail.closeModal(); + } + } + + /** + * Generates AG grid entries + */ + public generateEntries(): void { + this.rowData = []; + const items: {}[] = []; + this.customerMeeting.forEach((value) => { + this.owner = this.appService.getConfig().vc_user_by_id[value.owner_user_id]; + this.meetingType = this.appService.getConfig().vc_meeting_types_by_id[value.meeting_type_id]; + let customerContactName: string = null === value.firstname ? value.firstname + ' ' : ''; + customerContactName += null === value.lastname ? value.lastname : ''; + const creator: IUser = this.appService.getConfig().vc_user_by_id[value.creation_user_id]; + + items.push({ + that: this, + id: value.id, + title: value.title, + date: value.start_date, + time_start: value.start_date, + time_end: value.end_date, + type: this.meetingType.name, + typeType: this.meetingType.type, + is_option_meeting: value.is_option_meeting, + street: value.street, + street_no: value.street_no, + zip: value.zip, + city: value.city, + owner: this.owner.firstname + ' ' + this.owner.lastname, + creator: creator.firstname + ' ' + creator.lastname, + customerContactName, + participants: value.v_participants, + department: value.department, + email: value.email, + phone: value.phone_no, + mobile: value.mobile_no, + }); + this.rowData = items.sort((a: {} , b: {}) => this.dateComparator(a['date'], b['date'], false)); + }); + } + + /** + * On row click + */ + public rowClicked(e: any) { + this.modalCustomerMeetingDetail.openModal(); + this.customerMeetingDetail.setData(this.customer, this.customerMeetingEntriesById[e.data.id]); + } + + /** + * On create click + */ + public create(): void { + this.modalCustomerMeetingEdit.openModal(); + this.customerMeetingEdit.setData(this.customer, Factory.getEmptyCustomerMeeting(this.customer.id), true); + } + + /** + * Creates customer meeting + */ + public createCustomerMeetingFunction(customerMeeting: ICustomerMeeting): void { + this.createMeeting.emit(customerMeeting); + } + + /** + * Edits meeting entry + */ + public editCustomerMeetingFunction(customerMeeting: ICustomerMeeting) { + this.editMeeting.emit(customerMeeting); + } + + /** + * Deletes customer meeting + */ + public deleteCustomerMeetingFunction(meetingId: number): void { + this.deleteMeeting.emit(meetingId); + } + + /** + * Edit report after meeting has started + */ + public editCustomerMeetingReportFunction(reportValues: any): void { + this.editMeetingReport.emit(reportValues); + } + + ngOnDestroy(): void { + + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.html new file mode 100644 index 0000000..bd74618 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.html @@ -0,0 +1,44 @@ +
+

Notiz Detail

+

Erstellt am {{creationDate}} von {{customerNote.creation_user_firstname}} + {{customerNote.creation_user_lastname}}

+
+
+
+
Datum:
+
{{noteDate}}
+
Betreff:
+
{{customerNote.title}}
+
Gesprächspartner:
+
Herr + Frau + Divers {{customerNote.firstname}} {{customerNote.lastname}}
+
Abteilung:
+
{{customerNote.department}}
+
E-Mail:
+
{{customerNote.email}}
+
Telefon:
+
{{customerNote.phone_no}}
+
Mobil:
+
{{customerNote.mobile_no}}
+
Fax:
+
{{customerNote.fax_no}}
+
Notiz:
+
{{customerNote.comment}}
+
+
+
+
+
+
+
Eintrag bearbeiten
+
Eintrag löschen
+
+
+
+
+
+
+ +
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.ts new file mode 100644 index 0000000..31065c3 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-detail/customer-note-detail.component.ts @@ -0,0 +1,92 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomerNote} from '../../../../model/entities/customer-note'; +import {Factory} from '../../../../factory/factory'; +import {Utils} from '../../../../utils/utils'; +import {CustomerNoteEditComponent} from '../customer-note-edit/customer-note-edit.component'; +import {ICustomer} from '../../../../model/entities/customer'; +import {Const} from '../../../../utils/const'; +import {AppService} from '../../../../services/app.service'; + +@Component({ + selector: 'app-customer-note-detail', + templateUrl: './customer-note-detail.component.html', + styleUrls: ['./customer-note-detail.component.scss'] +}) + +export class CustomerNoteDetailComponent implements OnInit { + + @Output() editNote: EventEmitter = new EventEmitter(); + @Output() deleteNote: EventEmitter = new EventEmitter(); + @ViewChild('customerNoteEdit', { static: true }) customerNoteEdit: CustomerNoteEditComponent; + + public customer: ICustomer; + public customerNote: ICustomerNote; + public creationDate: string; + public isEditMode: boolean; + public noteDate: string; + public hasSalesRights: boolean; + + constructor(public appService: AppService) { } + + ngOnInit() { + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.customer = Factory.getEmptyCustomer(); + this.customerNote = Factory.getEmptyCustomerNote(); + this.creationDate = ''; + this.isEditMode = false; + this.noteDate = ''; + } + + /** + * Set data + */ + public setData(customer: ICustomer, customerNote: ICustomerNote): void { + this.customer = customer; + this.customerNote = customerNote; + this.creationDate = Utils.getDateTimeToDisplay(this.customerNote.creation_date); + this.isEditMode = false; + this.noteDate = Utils.getDateTimeToDisplay(this.customerNote.note_date); + } + + /** + * Updates data + * @param customer + */ + public updateData(customer: ICustomer): void { + this.customer = customer; + for (let i = 0; i < this.customer.v_customer_notes.length; i++) { + if (this.customer.v_customer_notes[i].id === this.customerNote.id) { + this.customerNote = this.customer.v_customer_notes[i]; + this.noteDate = Utils.getDateTimeToDisplay(this.customerNote.note_date); + } + } + this.isEditMode = false; + } + + /** + * Edit note entry + */ + public editEntry(): void { + this.isEditMode = true; + this.customerNoteEdit.setData(this.customer, Utils.deepClone(this.customerNote) as ICustomerNote); + } + + /** + * Edits note entry + * @param customerNote + */ + public editCustomerNoteFunction(customerNote: ICustomerNote) { + this.editNote.emit(customerNote); + } + + /** + * Delete note entry + */ + public deleteEntry(): void { + const confirmAction = confirm('Wollen Sie diesen Eintrag wirklich löschen?'); + if (confirmAction == true) { + this.deleteNote.emit(this.customerNote.id); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.html new file mode 100644 index 0000000..ffb6b16 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.html @@ -0,0 +1,127 @@ +

Notiz anlegen

+

Notiz bearbeiten

+
+
+
+

{{ errorMsg }}

+

+ Datum ist ein Pflichtfeld. +

+

+ Betreff ist ein Pflichtfeld. +

+ + + + + + + + + + + +
+
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ +
+
+ + +
+
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.ts new file mode 100644 index 0000000..45806fc --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-edit/customer-note-edit.component.ts @@ -0,0 +1,120 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ICustomerNote} from '../../../../model/entities/customer-note'; +import {NgForm} from '@angular/forms'; +import {Factory} from '../../../../factory/factory'; +import {ICustomer} from '../../../../model/entities/customer'; +import {ICustomerContact} from '../../../../model/entities/customer-contact'; +import {Utils} from '../../../../utils/utils'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {FormComponent} from '../../../../components/form-component'; + +@Component({ + selector: 'app-customer-note-edit', + templateUrl: './customer-note-edit.component.html', + styleUrls: ['./customer-note-edit.component.scss'] +}) + +export class CustomerNoteEditComponent extends FormComponent implements OnInit { + + @Output() createNote: EventEmitter = new EventEmitter(); + @Output() editNote: EventEmitter = new EventEmitter(); + @ViewChild('customerNoteForm', { static: true }) customerNoteForm: NgForm; + + public customer: ICustomer; + public customerNote: ICustomerNote; + public customerContacts: ICustomerContact[]; + public customerContactsById: {}; + public isExistingCustomerContact: boolean; + public contactId: string; + + constructor(/* protected scrollToService: ScrollToService */) { + super(/* scrollToService */); + } + + ngOnInit() { + this.customer = Factory.getEmptyCustomer(); + this.customerNote = Factory.getEmptyCustomerNote(); + this.customerContacts = []; + this.customerContactsById = {}; + this.errorMsg = ''; + this.contactId = ''; + this.isCreationMode = false; + this.isExistingCustomerContact = false; + } + + /** + * Sets data + */ + public setData(customer: ICustomer, customerNote: ICustomerNote, isCreationMode = false): void { + this.customer = customer; + this.customerNote = customerNote; + this.customerContacts = this.customer.v_customer_contacts; + this.customerContactsById = Utils.getSortedObjFromArray(this.customerContacts, 'id'); + this.customerNote.customer_id = this.customer.id; + this.contactId = ''; + this.isCreationMode = isCreationMode; + this.errorMsg = ''; + if (null === this.customerNote.customer_contact_id) { + this.customerNote.customer_contact_id = -1; + } + if (this.customerNote.customer_contact_id > 0) { + this.isExistingCustomerContact = true; + } + this.resetFormValidation(); + } + + /** + * On select contact + */ + public selectContact(e: any) { + this.customerNote.customer_contact_id = e.target.value; + this.isExistingCustomerContact = false; + this.customerNote.gender = null; + this.customerNote.firstname = null; + this.customerNote.lastname = null; + this.customerNote.department = null; + this.customerNote.email = null; + this.customerNote.phone_no = null; + this.customerNote.mobile_no = null; + this.customerNote.fax_no = null; + if (this.customerNote.customer_contact_id > 0) { + this.customerNote.gender = this.customerContactsById[this.customerNote.customer_contact_id].gender; + this.customerNote.firstname = this.customerContactsById[this.customerNote.customer_contact_id].firstname; + this.customerNote.lastname = this.customerContactsById[this.customerNote.customer_contact_id].lastname; + this.customerNote.department = this.customerContactsById[this.customerNote.customer_contact_id].department; + this.customerNote.email = this.customerContactsById[this.customerNote.customer_contact_id].email; + this.customerNote.phone_no = this.customerContactsById[this.customerNote.customer_contact_id].phone_no; + this.customerNote.mobile_no = this.customerContactsById[this.customerNote.customer_contact_id].mobile_no; + this.customerNote.fax_no = this.customerContactsById[this.customerNote.customer_contact_id].fax_no; + this.isExistingCustomerContact = true; + } + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + this.customerNoteForm.form.markAsUntouched(); + } + + /** + * Saves customer + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + if (valid) { + if (this.customerNote.customer_contact_id == -1) { + this.customerNote.customer_contact_id = null; + } + if (this.isCreationMode) { + this.createNote.emit(this.customerNote); + } else { + this.editNote.emit(this.customerNote); + } + this.errorMsg = ''; + } else { + // todo this.scrollUp(this.isCreationMode ? 'customer-note-modal' : 'customer-note-edit-modal'); + } + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.html new file mode 100644 index 0000000..61bbe45 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.html @@ -0,0 +1,32 @@ +

Notizen

+
Notiz hinzufügen
+
+ + +
+
+ + +
+ + + + + + +
+ +
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.scss new file mode 100644 index 0000000..f6cb50f --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.scss @@ -0,0 +1,14 @@ +#create-history { + position: absolute; + right: 0; + top: -6rem; +} + +@media only screen and (max-width: 1004px) { + #create-history { + position: relative; + right: auto; + top: auto; + display: inline-block; + } +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.ts new file mode 100644 index 0000000..c0b14de --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-note-view/customer-note-view.component.ts @@ -0,0 +1,154 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {ModalComponent} from '../../../../components/modal/modal.component'; +import {ICustomerNote} from '../../../../model/entities/customer-note'; +import {CustomerNoteEditComponent} from '../customer-note-edit/customer-note-edit.component'; +import {Factory} from '../../../../factory/factory'; +import {ICustomer} from '../../../../model/entities/customer'; +import {AgGridComponent} from '../../../../components/ag-grid-component'; +import {Utils} from '../../../../utils/utils'; +import {CustomerNoteDetailComponent} from '../customer-note-detail/customer-note-detail.component'; +import {Const} from '../../../../utils/const'; +import {AppService} from '../../../../services/app.service'; + +@Component({ + selector: 'app-customer-note-view', + templateUrl: './customer-note-view.component.html', + styleUrls: ['./customer-note-view.component.scss'] +}) + +export class CustomerNoteViewComponent extends AgGridComponent implements OnInit { + + @Output() createNote: EventEmitter = new EventEmitter(); + @Output() editNote: EventEmitter = new EventEmitter(); + @Output() deleteNote: EventEmitter = new EventEmitter(); + @ViewChild('modalCustomerNoteEdit', { static: true }) modalCustomerNoteEdit: ModalComponent; + @ViewChild('customerNoteEdit', { static: true }) customerNoteEdit: CustomerNoteEditComponent; + @ViewChild('modalCustomerNoteDetail', { static: true }) modalCustomerNoteDetail: ModalComponent; + @ViewChild('customerNoteDetail', { static: true }) customerNoteDetail: CustomerNoteDetailComponent; + + public customer: ICustomer; + public customerNote: ICustomerNote[]; + public customerNoteEntriesById: {}; + public hasSalesRights: boolean; + + constructor(public appService: AppService) { + super(); + } + + ngOnInit() { + this.hasSalesRights = this.appService.userHasRole(Const.USER_ROLE_SALES); + this.customer = Factory.getEmptyCustomer(); + this.customerNote = []; + this.customerNoteEntriesById = {}; + + this.defaultColDef = { + resizable: true, + sortable: true + }; + + this.columnDefs = [ + {headerName: 'Erstellungsdatum', field: 'creation_date', cellRenderer: this.dateRenderer, comparator: this.dateComparator }, + {headerName: 'Ersteller', field: 'creator' }, + {headerName: 'Datum', field: 'date', cellRenderer: this.dateRenderer, comparator: this.dateComparator }, + {headerName: 'Betreff', field: 'title' }, + {headerName: 'Notiz', field: 'comment' }, + {headerName: 'Anrede', field: 'gender', width: 90 }, + {headerName: 'Vorname', field: 'firstname' }, + {headerName: 'Nachname', field: 'lastname' }, + {headerName: 'Abteilung', field: 'department' }, + {headerName: 'E-Mail Adresse', field: 'email', cellRenderer: this.emailRenderer }, + {headerName: 'Telefon', field: 'phone_no', cellRenderer: this.phoneRenderer }, + {headerName: 'Mobil', field: 'mobile_no', cellRenderer: this.phoneRenderer }, + {headerName: 'Fax', field: 'fax_no' }, + ]; + } + + /** + * Sets data + */ + public setData(customer: ICustomer, isUpdate: boolean): void { + this.customer = customer; + this.customerNote = this.customer.v_customer_notes; + this.customerNoteEntriesById = Utils.getSortedObjFromArray(this.customerNote, 'id'); + this.modalCustomerNoteEdit.closeModal(); + this.generateEntries(); + if (isUpdate) { + this.customerNoteDetail.updateData(customer); + } else { + this.modalCustomerNoteDetail.closeModal(); + } + } + + /** + * Generates AG grid entries + */ + public generateEntries(): void { + this.rowData = []; + const items: {}[] = []; + for (const item of this.customerNote) { + let ccGender = ''; + if (item.gender === 'male') { + ccGender = 'Herr'; + } else if (item.gender === 'female') { + ccGender = 'Frau'; + } else if (item.gender === 'diverse') { + ccGender = 'Divers'; + } + items.push({ + id: item.id, + date: item.note_date, + title: item.title, + comment: item.comment, + gender: ccGender, + firstname: item.firstname, + lastname: item.lastname, + email: item.email, + phone_no: item.phone_no, + mobile_no: item.mobile_no, + fax_no: item.fax_no, + department: item.department, + creation_date: item.creation_date, + creator: item.creation_user_firstname + ' ' + item.creation_user_lastname, + }); + } + this.rowData = items.sort((a: {} , b: {}) => this.dateComparator(a['date'], b['date'], false)); + } + + /** + * On row click + */ + public rowClicked(e: any) { + this.modalCustomerNoteDetail.openModal(); + this.customerNoteDetail.setData(this.customer, this.customerNoteEntriesById[e.data.id]); + } + + /** + * On create click + */ + public create(): void { + this.modalCustomerNoteEdit.openModal(); + this.customerNoteEdit.setData(this.customer, Factory.getEmptyCustomerNote(this.customer.id, Utils.getCurrentDate()), true); + } + + /** + * Creates customer note + */ + public createCustomerNoteFunction(customerNote: ICustomerNote): void { + this.createNote.emit(customerNote); + } + + /** + * Edits note entry + */ + public editCustomerNoteFunction(customerNote: ICustomerNote) { + this.editNote.emit(customerNote); + } + + /** + * Deletes customer note + */ + public deleteCustomerNoteFunction(noteId: number): void { + this.deleteNote.emit(noteId); + } + +} diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.html b/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.html new file mode 100644 index 0000000..ad4d93e --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.html @@ -0,0 +1,32 @@ +

{{customer.name}}

+ + +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.scss b/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.ts b/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.ts new file mode 100644 index 0000000..dfa7fd3 --- /dev/null +++ b/plp-angular/src/app/views/customer-management/customer-view/customer-view.component.ts @@ -0,0 +1,155 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {TabsComponent} from '../../../components/tabs/tabs.component'; +import {ICustomer} from '../../../model/entities/customer'; +import {CustomerDataViewComponent} from './customer-data-view/customer-data-view.component'; +import {CustomerContactPersonViewComponent} from './customer-contact-person-view/customer-contact-person-view.component'; +import {CustomerNoteViewComponent} from './customer-note-view/customer-note-view.component'; +import {Factory} from '../../../factory/factory'; +import {ICustomerContact} from '../../../model/entities/customer-contact'; +import {ICustomerNote} from '../../../model/entities/customer-note'; +import {CustomerMeetingViewComponent} from './customer-meeting-view/customer-meeting-view.component'; +import {ICustomerMeeting} from '../../../model/entities/customer-meeting'; + +@Component({ + selector: 'app-customer-view', + templateUrl: './customer-view.component.html', + styleUrls: ['./customer-view.component.scss'] +}) + +export class CustomerViewComponent implements OnInit { + + @Output() editCustomer: EventEmitter = new EventEmitter(); + @Output() createCustomerContact: EventEmitter = new EventEmitter(); + @Output() editCustomerContact: EventEmitter = new EventEmitter(); + @Output() deleteCustomerContact: EventEmitter = new EventEmitter(); + @Output() createNote: EventEmitter = new EventEmitter(); + @Output() editNote: EventEmitter = new EventEmitter(); + @Output() deleteNote: EventEmitter = new EventEmitter(); + @Output() createMeeting: EventEmitter = new EventEmitter(); + @Output() editMeeting: EventEmitter = new EventEmitter(); + @Output() deleteMeeting: EventEmitter = new EventEmitter(); + @Output() editMeetingReport: EventEmitter = new EventEmitter(); + @Output() shortcut: EventEmitter = new EventEmitter(); + @ViewChild('tabsCMView', { static: true }) tabsCMView: TabsComponent; + @ViewChild('customerDataView', { static: true }) customerDataView: CustomerDataViewComponent; + @ViewChild('customerContactPersonView', { static: true }) customerContactPersonView: CustomerContactPersonViewComponent; + @ViewChild('customerNoteView', { static: true }) customerNoteView: CustomerNoteViewComponent; + @ViewChild('customerMeetingView', { static: true }) customerMeetingView: CustomerMeetingViewComponent; + + public customer: ICustomer; + + constructor() { } + + ngOnInit() { + this.customer = Factory.getEmptyCustomer(); + } + + /** + * Sets data + * @param customer + * @param isUpdate + */ + public setData(customer: ICustomer, isUpdate: boolean = false): void { + this.customer = customer; + this.customerDataView.setData(this.customer); + this.customerContactPersonView.setData(this.customer, isUpdate); + this.customerNoteView.setData(this.customer, isUpdate); + this.customerMeetingView.setData(this.customer, isUpdate); + } + + /** + * Saves customer + * @param customer + */ + public editCustomerFunction(customer: ICustomer): void { + this.editCustomer.emit(customer); + } + + /** + * Creates customer contact + * @param customerContact + */ + public createCustomerContactFunction(customerContact: ICustomerContact): void { + this.createCustomerContact.emit(customerContact); + } + + /** + * Edit customer contact + * @param customerContact + */ + public editCustomerContactFunction(customerContact: ICustomerContact): void { + this.editCustomerContact.emit(customerContact); + } + + /** + * Creates customer note + * @param customerNote + */ + public createCustomerNoteFunction(customerNote: ICustomerNote): void { + this.createNote.emit(customerNote); + } + + /** + * Edits note entry + * @param customerNote + */ + public editCustomerNoteFunction(customerNote: ICustomerNote) { + this.editNote.emit(customerNote); + } + + /** + * Deletes customer note + * @param noteId + */ + public deleteCustomerNoteFunction(noteId: number): void { + this.deleteNote.emit(noteId); + } + + /** + * Deletes customer contact + * @param contactId + */ + public deleteCustomerContactFunction(contactId: number): void { + this.deleteCustomerContact.emit(contactId); + } + + /** + * Creates customer meeting + * @param customerMeeting + */ + public createCustomerMeetingFunction(customerMeeting: ICustomerMeeting): void { + this.createMeeting.emit(customerMeeting); + } + + /** + * Edits meeting entry + * @param customerMeeting + */ + public editCustomerMeetingFunction(customerMeeting: ICustomerMeeting) { + this.editMeeting.emit(customerMeeting); + } + + /** + * Deletes customer meeting + * @param meetingId + */ + public deleteCustomerMeetingFunction(meetingId: number): void { + this.deleteMeeting.emit(meetingId); + } + + /** + * Edit report after meeting has started + * @param reportValues + */ + public editCustomerMeetingReportFunction(reportValues: any): void { + this.editMeetingReport.emit(reportValues); + } + + /** + * Shortcut to customer detail + * @param customer + */ + public shortcutFunction(customer: ICustomer): void { + this.shortcut.emit(customer); + } +} diff --git a/plp-angular/src/app/views/login/login.component.html b/plp-angular/src/app/views/login/login.component.html new file mode 100644 index 0000000..ebdeace --- /dev/null +++ b/plp-angular/src/app/views/login/login.component.html @@ -0,0 +1,34 @@ +

Login

+
+
+
+

{{ errorMsg }}

+

+ E-Mail ist ein Pflichtfeld. +

+

+ Bitte gültige E-Mail Adresse eingeben. +

+

+ Passwort ist ein Pflichtfeld. +

+

+ Passwort benötigt mindestens {{ password.getError('minlength').requiredLength }} Zeichen. +

+
+
+
+ + +
+
+ + +
+
+ +
+
+Passwort vergessen \ No newline at end of file diff --git a/plp-angular/src/app/views/login/login.component.scss b/plp-angular/src/app/views/login/login.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/login/login.component.ts b/plp-angular/src/app/views/login/login.component.ts new file mode 100644 index 0000000..ce55fe1 --- /dev/null +++ b/plp-angular/src/app/views/login/login.component.ts @@ -0,0 +1,75 @@ +import { Component, OnInit } from '@angular/core'; +import {UntypedFormBuilder, UntypedFormGroup, Validators} from '@angular/forms'; +import {environment} from '../../../environments/environment'; +import {AppService} from '../../services/app.service'; +import {Subscription} from 'rxjs'; +import {Router} from '@angular/router'; + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'] +}) + +export class LoginComponent implements OnInit { + + private loginSub: Subscription; + public isLoggedIn: boolean; + public errorMsg: string; + public loginForm: UntypedFormGroup; + + /** + * Gets email + */ + get email() { + return this.loginForm.get('email'); + } + + /** + * Gets password + */ + get password() { + return this.loginForm.get('password'); + } + + constructor(private router: Router, public appService: AppService, private fb: UntypedFormBuilder) { + this.errorMsg = ''; + } + + ngOnInit() { + this.isLoggedIn = false; + this.loginForm = this.fb.group({ + email: ['', [Validators.required, Validators.email]], + password: [environment.password, [Validators.required, Validators.minLength(4)]] + }); + + // Observe login state + this.loginSub = this.appService.getLoginState$().subscribe( + data => { + if (data !== null) { + this.isLoggedIn = true; + this.router.navigate(['./start']); + } else { + this.isLoggedIn = false; + } + } + ); + } + + /** + * On form submit + */ + public onFormSubmit(): void { + if (this.loginForm.valid) { + this.appService.login(this.email.value, this.password.value); + } + } + + /** + * Forgot password + */ + public forgotPassword(): void { + alert('Hier folgt in Zukunft die Funktionalität \'Neues Passwort vergeben\'.\nBei Problemen wenden Sie sich bitte an admin@plp-tool.de.'); + } + +} diff --git a/plp-angular/src/app/views/sales/sales.component.html b/plp-angular/src/app/views/sales/sales.component.html new file mode 100644 index 0000000..82bf3fa --- /dev/null +++ b/plp-angular/src/app/views/sales/sales.component.html @@ -0,0 +1 @@ +

sales works!

diff --git a/plp-angular/src/app/views/sales/sales.component.scss b/plp-angular/src/app/views/sales/sales.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/sales/sales.component.ts b/plp-angular/src/app/views/sales/sales.component.ts new file mode 100644 index 0000000..832209e --- /dev/null +++ b/plp-angular/src/app/views/sales/sales.component.ts @@ -0,0 +1,16 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-sales', + templateUrl: './sales.component.html', + styleUrls: ['./sales.component.scss'] +}) + +export class SalesComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.html b/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.html new file mode 100644 index 0000000..d0b35a8 --- /dev/null +++ b/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.html @@ -0,0 +1,57 @@ +
+

PLP interner Termin

+

{{dateStart}} {{timeStart}} Uhr bis {{dateEnd}} {{timeEnd}} Uhr

+

{{internalMeeting.title}}

+
Erstellt von: {{creator.firstname}} {{creator.lastname}}
+

{{internalMeeting.description}}

+
+
+
+
+
PLP Verantwortlicher:
+
{{owner.firstname}} {{owner.lastname}}
+
Teilnehmer:
+
+ + {{p.firstname}} {{p.lastname}}
+
+
+
Report:
+
{{reportOld}}
+
+
+
+
+
+
+
+
Eintrag bearbeiten
+
Eintrag löschen
+
Report bearbeiten
+
+
+
+
+
+
+

{{ errorMsg }}

+
+
+
+ + +
+
+
+
+ +
+
+
+
+
+
+
+ +
+
\ No newline at end of file diff --git a/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.scss b/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.ts b/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.ts new file mode 100644 index 0000000..d7e3c07 --- /dev/null +++ b/plp-angular/src/app/views/start/internal-meeting-detail/internal-meeting-detail.component.ts @@ -0,0 +1,182 @@ +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + EventEmitter, + OnInit, + Output, + ViewChild +} from '@angular/core'; +import {IInternalMeeting} from '../../../model/entities/internal-meeting'; +import {NgForm} from '@angular/forms'; +import {InternalMeetingEditComponent} from '../internal-meeting-edit/internal-meeting-edit.component'; +import {Utils} from '../../../utils/utils'; +import {Factory} from '../../../factory/factory'; +import {IConfig} from '../../../model/virtual/config'; +import {AppService} from '../../../services/app.service'; +import {IUser} from '../../../model/entities/user'; +import {FormComponent} from '../../../components/form-component'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {MeetingService} from '../../../services/meeting.service'; +import {Const} from '../../../utils/const'; + +@Component({ + selector: 'app-internal-meeting-detail', + templateUrl: './internal-meeting-detail.component.html', + styleUrls: ['./internal-meeting-detail.component.scss'], + // NOTE: We need manual change detection in this component + changeDetection: ChangeDetectionStrategy.OnPush, +}) + +export class InternalMeetingDetailComponent extends FormComponent implements OnInit { + + @Output() editMeeting: EventEmitter = new EventEmitter(); + @Output() deleteMeeting: EventEmitter = new EventEmitter(); + @Output() editMeetingReport: EventEmitter = new EventEmitter(); + @ViewChild('internalMeetingDetailEdit', { static: true }) internalMeetingDetailEdit: InternalMeetingEditComponent; + @ViewChild('internalMeetingReportForm', { static: true }) internalMeetingReportForm: NgForm; + + public internalMeeting: IInternalMeeting; + public creator: IUser; + public owner: IUser; + public participants: IUser[]; + public dateStart: string; + public dateEnd: string; + public timeStart: string; + public timeEnd: string; + public config: IConfig; + public isEditMode: boolean; + public errorMsg: string; + public reportFormVisible: boolean; + public reportOld: string; + public hasAdminRights: boolean; + + constructor(public appService: AppService, private meetingService: MeetingService, /*protected scrollToService: ScrollToService,*/ private ref: ChangeDetectorRef) { + super(/*scrollToService*/); + } + + ngOnInit() { + this.hasAdminRights = this.appService.userHasRole(Const.USER_ROLE_ADMIN); + this.config = this.appService.getConfig(); + this.internalMeeting = Factory.getEmptyInternalMeeting(); + this.creator = Factory.getEmptyUser(); + this.owner = Factory.getEmptyUser(); + this.participants = []; + this.dateStart = ''; + this.dateEnd = ''; + this.timeStart = ''; + this.timeEnd = ''; + this.isEditMode = false; + this.errorMsg = ''; + this.reportFormVisible = false; + this.reportOld = ''; + } + + /** + * Set data + */ + public setData(internalMeeting: IInternalMeeting): void { + this.internalMeeting = internalMeeting; + this.setMeetingData(); + } + + /** + * Updates data + */ + public updateData(internalMeeting: IInternalMeeting): void { + if (null !== this.internalMeeting.id) { + this.internalMeeting = internalMeeting; + this.setMeetingData(); + } + } + + /** + * Sets variables for meeting + */ + public setMeetingData() { + this.reportFormVisible = false; + this.reportOld = this.internalMeeting.report; + this.creator = this.config.vc_user_by_id[this.internalMeeting.creation_user_id]; + this.owner = this.config.vc_user_by_id[this.internalMeeting.owner_user_id]; + this.participants = []; + for (let i = 0; i < this.internalMeeting.v_participants.length; i++) { + this.participants.push(this.config.vc_user_by_id[this.internalMeeting.v_participants[i].participant_user_id]); + } + this.dateStart = Utils.getDateTimeToDisplay(this.internalMeeting.start_date); + this.dateEnd = Utils.getDateTimeToDisplay(this.internalMeeting.end_date); + this.timeStart = Utils.getDateTimeToDisplay(this.internalMeeting.start_date, false, true); + this.timeEnd = Utils.getDateTimeToDisplay(this.internalMeeting.end_date, false, true); + this.isEditMode = false; + this.errorMsg = ''; + this.resetFormValidation(); + // NOTE: We need manual change detection in this component + this.ref.detectChanges(); + } + + /** + * Edit meeting entry + */ + public editEntry(): void { + this.isEditMode = true; + this.internalMeetingDetailEdit.setData(Utils.deepClone(this.internalMeeting) as IInternalMeeting); + } + + /** + * Edits meeting entry + */ + public editInternalMeetingFunction(internalMeeting: IInternalMeeting) { + this.editMeeting.emit(internalMeeting); + } + + /** + * Delete meeting entry + */ + public deleteEntry(): void { + const confirmAction = confirm('Wollen Sie diesen Eintrag wirklich löschen?'); + if (confirmAction === true) { + this.deleteMeeting.emit(this.internalMeeting.id); + } + } + + /** + * Check if edit report after meeting has started + */ + public editReport(): void { + this.meetingService.apiCheckInternalMeetingReport(this.internalMeeting.id).subscribe( + data => { + this.reportFormVisible = data.result_data as boolean; + // NOTE: We need manual change detection in this component + this.ref.detectChanges(); + // todo this.scrollUp('internal-meeting-edit-report'); + }, + error => { + } + ); + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + if (this.reportFormVisible) { + this.internalMeetingReportForm.form.markAsUntouched(); + } + } + + /** + * Saves internal meeting report + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + if (valid) { + this.editMeetingReport.emit({ + id: this.internalMeeting.id, + report: this.internalMeeting.report + }); + this.errorMsg = ''; + } else { + // todo this.scrollUp('internal-meeting-edit-report'); + } + } + +} diff --git a/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.html b/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.html new file mode 100644 index 0000000..1de7bef --- /dev/null +++ b/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.html @@ -0,0 +1,98 @@ +

Internen Termin anlegen

+

Internen Termin bearbeiten

+
+
+
+

{{ errorMsg }}

+

+ Betreff ist ein Pflichtfeld. +

+

+ Datum ist ein Pflichtfeld. +

+

+ Uhrzeit (Start) ist ein Pflichtfeld. +

+

+ Uhrzeit (Ende) ist ein Pflichtfeld. +

+

+ PLP Verantwortlicher ist ein Pflichtfeld. +

+
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+

Teilnehmer

+
+
+
+
+
+ + +
+
+
+
+
+ +
+
+ + +
+
+
\ No newline at end of file diff --git a/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.scss b/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.ts b/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.ts new file mode 100644 index 0000000..e73d44a --- /dev/null +++ b/plp-angular/src/app/views/start/internal-meeting-edit/internal-meeting-edit.component.ts @@ -0,0 +1,198 @@ +import {Component, EventEmitter, OnInit, Output, ViewChild} from '@angular/core'; +import {IConfig} from '../../../model/virtual/config'; +import {AppService} from '../../../services/app.service'; +// import {ScrollToService} from '@nicky-lenaers/ngx-scroll-to'; +import {NgForm} from '@angular/forms'; +import {Factory} from '../../../factory/factory'; +import {IInternalMeeting} from '../../../model/entities/internal-meeting'; +import {Utils} from '../../../utils/utils'; +import {IUser} from '../../../model/entities/user'; +import {FormComponent} from '../../../components/form-component'; + +@Component({ + selector: 'app-internal-meeting-edit', + templateUrl: './internal-meeting-edit.component.html', + styleUrls: ['./internal-meeting-edit.component.scss'] +}) + +export class InternalMeetingEditComponent extends FormComponent implements OnInit { + + @Output() createMeeting: EventEmitter = new EventEmitter(); + @Output() editMeeting: EventEmitter = new EventEmitter(); + @ViewChild('internalMeetingForm', { static: true }) internalMeetingForm: NgForm; + + public internalMeeting: IInternalMeeting; + public users: IUser[]; + public usersById: {}; + public possibleOwners: IUser[]; + public possibleOwnersById: {}; + public participants: IUser[]; + public selectedParticipantsById: {}; + public selectedParticipantsByIdInitial: {}; + public owner: IUser; + public dateStart: string; + public dateEnd: string; + public timeStart: string; + public timeEnd: string; + public config: IConfig; + + constructor(public appService: AppService, /*protected scrollToService: ScrollToService*/) { + super(/*scrollToService*/); + } + + ngOnInit() { + this.config = this.appService.getConfig(); + this.internalMeeting = Factory.getEmptyInternalMeeting(); + this.users = []; + this.usersById = {}; + this.possibleOwners = []; + this.possibleOwnersById = {}; + this.participants = []; + this.selectedParticipantsById = {}; + this.selectedParticipantsByIdInitial = {}; + this.owner = Factory.getEmptyUser(); + this.dateStart = ''; + this.dateEnd = ''; + this.timeStart = ''; + this.timeEnd = ''; + } + + /** + * Sets data + */ + public setData(internalMeeting: IInternalMeeting, isCreationMode = false): void { + this.internalMeeting = internalMeeting; + this.users = this.appService.getConfig().users; + this.isCreationMode = isCreationMode; + this.owner = this.internalMeeting.owner_user_id !== null ? + this.appService.getConfig().vc_user_by_id[this.internalMeeting.owner_user_id] : null; + this.dateStart = Utils.getDateTimeToDisplay(this.internalMeeting.start_date, true, false, false, true); + this.dateEnd = Utils.getDateTimeToDisplay(this.internalMeeting.end_date, true, false, false, true); + this.timeStart = Utils.getDateTimeToDisplay(this.internalMeeting.start_date, false, true); + this.timeEnd = Utils.getDateTimeToDisplay(this.internalMeeting.end_date, false, true); + this.usersById = Utils.getSortedObjFromArray(this.appService.getConfig().users, 'id'); + this.selectedParticipantsById = Utils.getSortedObjFromArray(this.internalMeeting.v_participants, 'participant_user_id'); + this.selectedParticipantsByIdInitial = Utils.getSortedObjFromArray(this.internalMeeting.v_participants, 'participant_user_id'); + this.participants = []; + this.possibleOwners = []; + for (const p in this.usersById) { + if (this.isCreationMode) { + // New meeting + if (this.usersById[p].active) { + this.participants.push(this.usersById[p]); + this.possibleOwners.push(this.usersById[p]); + } + } else { + // Existing meeting + const userAttendsToMeeting: boolean = this.selectedParticipantsByIdInitial.hasOwnProperty(this.usersById[p].id); + if (this.usersById[p].id !== this.owner.id && (this.usersById[p].active || userAttendsToMeeting)) { + this.participants.push(this.usersById[p]); + this.possibleOwners.push(this.usersById[p]); + } + if (this.usersById[p].id === this.owner.id) { + this.possibleOwners.push(this.usersById[p]); + } + } + } + this.errorMsg = ''; + this.resetFormValidation(); + } + + /** + * On select owner + */ + public selectOwner(e: any) { + if (e.target.value !== '0: null') { + this.owner = this.usersById[e.target.value]; + if (this.selectedParticipantsById.hasOwnProperty(this.owner.id)) { + delete this.selectedParticipantsById[this.owner.id]; + } + } else { + this.owner = null; + } + this.participants = []; + for (const p in this.usersById) { + if ((this.owner == null || this.usersById[p].id !== this.owner.id) && this.usersById[p].active) { + this.participants.push(this.usersById[p]); + } + } + } + + /** + * On select participant + */ + public participantsChange(e: any) { + const participantUserId: number = parseInt(e.target.value); + if (this.selectedParticipantsById.hasOwnProperty(participantUserId)) { + delete this.selectedParticipantsById[participantUserId]; + } else { + let myId: number = null; + if (this.selectedParticipantsByIdInitial.hasOwnProperty(participantUserId)) { + myId = this.selectedParticipantsByIdInitial[participantUserId].id; + } + this.selectedParticipantsById[participantUserId] = { + id: myId, + customer_meeting_id: this.internalMeeting.id, + participant_user_id: participantUserId + }; + } + } + + /** + * Checks if participant is selected + */ + public checkParticipants(id: number) { + if (this.selectedParticipantsById.hasOwnProperty(id)) { + return true; + } else { + return false; + } + } + + /** + * Resets Form Validation + */ + public resetFormValidation(): void { + this.internalMeetingForm.form.markAsUntouched(); + } + + /** + * Saves internal meeting + */ + public onFormSubmit({value, valid}: { value: any, valid: boolean }): void { + this.errorMsg = 'Bitte beheben Sie alle Fehler.'; + const identifier: string = this.isCreationMode ? 'internal-meeting-modal' : 'internal-meeting-edit-modal'; + if (valid) { + // Check if start time before end time + const compareDateStart = new Date(this.dateStart + 'T' + this.timeStart + ':00'); + const compareDateEnd = new Date(this.dateEnd + 'T' + this.timeEnd + ':00'); + if (compareDateStart > compareDateEnd) { + this.errorMsg = 'Datum / Zeit (Ende) darf nicht vor Datum / Zeit (Start) liegen.'; + // todo this.scrollUp(identifier); + } else { + this.internalMeeting.start_date = this.dateStart + ' ' + this.timeStart + ':00'; + this.internalMeeting.end_date = this.dateEnd + ' ' + this.timeEnd + ':00'; + // Check if date is valid + if (Utils.isValidDate(this.internalMeeting.start_date)) { + this.internalMeeting.v_participants = []; + for (const spId in this.selectedParticipantsById) { + this.internalMeeting.v_participants.push(this.selectedParticipantsById[spId]); + } + + if (this.isCreationMode) { + this.createMeeting.emit(this.internalMeeting); + } else { + this.editMeeting.emit(this.internalMeeting); + } + this.errorMsg = ''; + } else { + this.errorMsg = 'Bitte korrektes Datum eingeben.'; + // todo this.scrollUp(identifier); + } + } + } else { + // todo this.scrollUp(identifier); + } + } + +} diff --git a/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.html b/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.html new file mode 100644 index 0000000..7d496db --- /dev/null +++ b/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.html @@ -0,0 +1,43 @@ +
+

Termin-Kalender

+
+
+ + +
+
+ +
+

{{ viewDate | calendarDate:(view + 'ViewTitle'):'de' }}

+
+
+ ← Vorheriger Monat +
+
+ Dieser Monat +
+
+ Nächster Monat → +
+
+
+
+ + +
+
diff --git a/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.scss b/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.ts b/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.ts new file mode 100644 index 0000000..5439dd7 --- /dev/null +++ b/plp-angular/src/app/views/start/meeting-calendar/meeting-calendar.component.ts @@ -0,0 +1,320 @@ +import {Component, EventEmitter, OnInit, Output, TemplateRef, ViewChild} from '@angular/core'; +import {CalendarEvent, CalendarEventAction, CalendarEventTimesChangedEvent, CalendarView} from 'angular-calendar'; +import {Subject} from 'rxjs'; +import {addHours, endOfDay, isSameDay, isSameMonth, startOfDay} from 'date-fns'; +import {ICustomer} from '../../../model/entities/customer'; +import {ICustomerMeeting} from '../../../model/entities/customer-meeting'; +import {NgbModal} from '@ng-bootstrap/ng-bootstrap'; +import {Utils} from '../../../utils/utils'; +import {IUser} from '../../../model/entities/user'; +import {AppService} from '../../../services/app.service'; +import {IInternalMeeting} from '../../../model/entities/internal-meeting'; + +const colors: any = { + colorCustomer: { + primary: '#ad2121', + secondary: '#FAE3E3' + }, + colorInternal: { + primary: '#1e90ff', + secondary: '#D1E8FF' + }, + colorOperators: { + primary: '#e3bc08', + secondary: '#FDF1BA' + }, + colorProduction: { + primary: '#13f347', + secondary: '#D1E8FF' + }, + colorService: { + primary: '#ac1eff', + secondary: '#FDF1BA' + } +}; + +@Component({ + selector: 'app-meeting-calendar', + templateUrl: './meeting-calendar.component.html', + styleUrls: ['./meeting-calendar.component.scss'] +}) + +export class MeetingCalendarComponent implements OnInit { + + + constructor(private appService: AppService, private modal: NgbModal) { } + + static MEETING_TYPE_CUSTOMER = 'customer_meeting'; + static MEETING_TYPE_INTERNAL = 'internal_meeting'; + + @Output() editCustomerMeeting: EventEmitter = new EventEmitter(); + @Output() editInternalMeeting: EventEmitter = new EventEmitter(); + + @ViewChild('modalContent', { static: true }) modalContent: TemplateRef; + + public locale = 'de'; + public weekStartsOn = 1; + public weekendDays: number[] = [6, 0]; + + public view: CalendarView = CalendarView.Month; + public CalendarView = CalendarView; + public viewDate: Date = new Date(); + private modalData: { + action: string; + event: CalendarEvent; + }; + private actions: CalendarEventAction[]; + public refresh: Subject = new Subject(); + public events: CalendarEvent[]; + public activeDayIsOpen: boolean; + private customerMeetings: ICustomerMeeting[]; + private internalMeetings: IInternalMeeting[]; + private customerMeetingsById: {}; + private internalMeetingsById: {}; + private customersById: {}; + public users: IUser[]; + public usersById: {}; + public selectableUsers: IUser[]; + public selectedUserIndex: number; + + ngOnInit() { + this.customerMeetings = []; + this.customerMeetingsById = {}; + this.internalMeetings = []; + this.internalMeetingsById = {}; + this.customersById = {}; + this.activeDayIsOpen = false; + this.actions = [ + { + label: '', + a11yLabel: 'Edit', + onClick: ({ event }: { event: CalendarEvent }): void => { + // this.handleEvent('Edited', event); + // this.rowClicked(event); + } + } + ]; + this.events = []; + this.users = this.appService.getConfig().users; + this.usersById = this.appService.getConfig().vc_user_by_id; + this.selectableUsers = []; + } + + /** + * Sets data + */ + public setData( + customersById: {}, + customerMeetings: ICustomerMeeting[], + internalMeetings: IInternalMeeting[], + ) { + this.customersById = customersById; + this.users = this.appService.getConfig().users; + this.usersById = this.appService.getConfig().vc_user_by_id; + this.activeDayIsOpen = false; + this.customerMeetings = customerMeetings; + this.customerMeetingsById = Utils.getSortedObjFromArray(this.customerMeetings, 'id'); + this.internalMeetings = internalMeetings; + this.internalMeetingsById = Utils.getSortedObjFromArray(this.internalMeetings, 'id'); + this.selectableUsers = []; + this.users.forEach(item => { + if (item.active === true) { + this.selectableUsers.push(item); + } + }); + for (let k = 0; k < this.selectableUsers.length; k++) { + if (this.selectableUsers[k].id === this.appService.getAppUser().id) { + this.selectedUserIndex = k + 1; + break; + } + } + this.generateEntries(); + } + + /** + * Generates entries for AG grid + */ + private generateEntries() { + this.events = []; + this.closeOpenMonthViewDay(); + const filterUser: IUser = null !== this.selectedUserIndex ? this.selectableUsers[this.selectedUserIndex - 1] : null; + this.customerMeetings.forEach(item => { + if (null !== filterUser) { + if (filterUser.id !== item.owner_user_id) { + let isParticipant = false; + item.v_participants.forEach(item1 => { + if (filterUser.id === item1.participant_user_id) { + isParticipant = true; + } + }); + if (!isParticipant) { + // Don't show this meeting, since it does not involve filtered user + return; + } + } + } + const customer: ICustomer = this.customersById[item.customer_id]; + const user: IUser = this.appService.getConfig().vc_user_by_id[item.owner_user_id]; + const title: string = Utils.getDateTimeToDisplay(item.start_date, true, true) + ' bis ' + + Utils.getDateTimeToDisplay(item.end_date, true, true) + ' - ' + + user.firstname + ' ' + user.lastname + ': ' + + customer.name + ' [' + item.title + ']'; + this.events.push( + { + id: MeetingCalendarComponent.MEETING_TYPE_CUSTOMER + ':' + item.id, + start: addHours(Utils.getParsedDate(item.start_date), 1), + end: addHours(Utils.getParsedDate(item.end_date), 1), + title, + color: colors.colorCustomer, + actions: this.actions, + allDay: false, + resizable: { + beforeStart: true, + afterEnd: true + }, + draggable: false + } + ); + }); + + this.internalMeetings.forEach(item => { + const user: IUser = this.appService.getConfig().vc_user_by_id[item.owner_user_id]; + const title: string = Utils.getDateTimeToDisplay(item.start_date, true, true) + ' bis ' + + Utils.getDateTimeToDisplay(item.end_date, true, true) + ' - ' + + user.firstname + ' ' + user.lastname + ': ' + 'PLP intern [' + item.title + ']'; + if (null !== filterUser) { + if (filterUser.id !== item.owner_user_id) { + let isParticipant = false; + item.v_participants.forEach(item1 => { + if (filterUser.id === item1.participant_user_id) { + isParticipant = true; + } + }); + if (!isParticipant) { + // Don't show this meeting, since it does not involve filtered user + return; + } + } + } + + this.events.push( + { + id: MeetingCalendarComponent.MEETING_TYPE_INTERNAL + ':' + item.id, + start: addHours(Utils.getParsedDate(item.start_date), 1), + end: addHours(Utils.getParsedDate(item.end_date), 1), + title, + color: colors.colorInternal, + actions: this.actions, + allDay: false, + resizable: { + beforeStart: true, + afterEnd: true + }, + draggable: false + } + ); + }); + this.refresh.next(); + } + + /** + * Day is clicked + */ + public dayClicked({ date, events }: { date: Date; events: CalendarEvent[] }): void { + if (isSameMonth(date, this.viewDate)) { + if ( + (isSameDay(this.viewDate, date) && this.activeDayIsOpen === true) || + events.length === 0 + ) { + this.activeDayIsOpen = false; + } else { + this.activeDayIsOpen = true; + } + this.viewDate = date; + } + } + + /** + * Times changed event + */ + eventTimesChanged({ + event, + newStart, + newEnd + }: CalendarEventTimesChangedEvent): void { + this.events = this.events.map(iEvent => { + if (iEvent === event) { + return { + ...event, + start: newStart, + end: newEnd + }; + } + return iEvent; + }); + this.handleEvent('Dropped or resized', event); + } + + /** + * Handles event + */ + public handleEvent(action: string, event: CalendarEvent): void { + this.modalData = { event, action }; + // this.modal.open(this.modalContent, { size: 'lg' }); + + const idComponents: string[] = (event.id).toString().split(':'); + switch (idComponents[0]) { + case MeetingCalendarComponent.MEETING_TYPE_CUSTOMER: + this.editCustomerMeeting.emit(this.customerMeetingsById[idComponents[1]] as ICustomerMeeting); + break; + case MeetingCalendarComponent.MEETING_TYPE_INTERNAL: + this.editInternalMeeting.emit(this.internalMeetingsById[idComponents[1]] as IInternalMeeting); + break; + } + } + + /** + * Add event + */ + public addEvent(): void { + this.events = [ + ...this.events, + { + title: 'New event', + start: startOfDay(new Date()), + end: endOfDay(new Date()), + color: colors.red, + draggable: true, + resizable: { + beforeStart: true, + afterEnd: true + } + } + ]; + } + + /** + * Delete event + */ + public deleteEvent(eventToDelete: CalendarEvent) { + this.events = this.events.filter(event => event !== eventToDelete); + } + + /** + * Set view + */ + public setView(view: CalendarView) { + this.view = view; + } + + /** + * Close open month view + */ + public closeOpenMonthViewDay() { + this.activeDayIsOpen = false; + } + + public changeUserFilter(e: any) { + this.generateEntries(); + } +} diff --git a/plp-angular/src/app/views/start/meeting-list/meeting-list.component.html b/plp-angular/src/app/views/start/meeting-list/meeting-list.component.html new file mode 100644 index 0000000..f3b61c6 --- /dev/null +++ b/plp-angular/src/app/views/start/meeting-list/meeting-list.component.html @@ -0,0 +1,30 @@ +
+

Termin-Liste

+
+
+
+ + +
+
+
Aktuelle Ansicht exportieren
+
+
+
+ +
+ + +
+
\ No newline at end of file diff --git a/plp-angular/src/app/views/start/meeting-list/meeting-list.component.scss b/plp-angular/src/app/views/start/meeting-list/meeting-list.component.scss new file mode 100644 index 0000000..23ac560 --- /dev/null +++ b/plp-angular/src/app/views/start/meeting-list/meeting-list.component.scss @@ -0,0 +1,18 @@ +.searchForm { + width: 100%; + .resetSearch { + right: 29px; + height: calc(100% - 3px); + } + .column { + position: relative; + } + .right { + padding: 0; + } + .button { + float: right; + margin: 0; + } +} + diff --git a/plp-angular/src/app/views/start/meeting-list/meeting-list.component.ts b/plp-angular/src/app/views/start/meeting-list/meeting-list.component.ts new file mode 100644 index 0000000..4e2c78f --- /dev/null +++ b/plp-angular/src/app/views/start/meeting-list/meeting-list.component.ts @@ -0,0 +1,199 @@ +import {Component, EventEmitter, OnDestroy, OnInit, Output} from '@angular/core'; +import {AgGridComponent} from '../../../components/ag-grid-component'; +import {ICustomer} from '../../../model/entities/customer'; +import {ICustomerMeeting} from '../../../model/entities/customer-meeting'; +import {IUser} from '../../../model/entities/user'; +import {IMeetingType} from '../../../model/entities/meeting-type'; +import {AppService} from '../../../services/app.service'; +import {IInternalMeeting} from '../../../model/entities/internal-meeting'; +import {MeetingService} from '../../../services/meeting.service'; +import {Utils} from '../../../utils/utils'; + +@Component({ + selector: 'app-meeting-list', + templateUrl: './meeting-list.component.html', + styleUrls: ['./meeting-list.component.scss'] +}) + +export class MeetingListComponent extends AgGridComponent implements OnInit, OnDestroy { + + @Output() editCustomerMeeting: EventEmitter = new EventEmitter(); + @Output() editInternalMeeting: EventEmitter = new EventEmitter(); + + private customerMeetings: ICustomerMeeting[]; + private internalMeetings: IInternalMeeting[]; + private customersById: {}; + private operatorsById: {}; + private productionsById: {}; + private servicesById: {}; + public participants: IUser[]; + + constructor(public appService: AppService, public meetingService: MeetingService) { + super(); + } + + ngOnInit() { + this.customersById = {}; + this.operatorsById = {}; + this.productionsById = {}; + this.servicesById = {}; + this.customerMeetings = []; + this.internalMeetings = []; + this.customersById = {}; + this.participants = []; + + this.defaultColDef = { + resizable: true, + sortable: true + }; + + + const that: MeetingListComponent = this; + this.columnDefs = [ + {headerName: 'Typ', field: 'itemType', cellRenderer: this.dotRenderer, width: 50}, + {headerName: 'Datum (Start)', field: 'dateStart', cellRenderer: this.dateTimeRenderer, comparator: this.dateComparator, that }, + {headerName: 'Datum (Ende)', field: 'dateEnd', cellRenderer: this.dateTimeRenderer, comparator: this.dateComparator, that }, + {headerName: 'Terminpartner (Firma)', field: 'objectName' }, + {headerName: 'PLP Verantwortlicher', field: 'owner' }, + {headerName: 'Ersteller', field: 'creator' }, + {headerName: 'Gesprächspartner', field: 'contactName' }, + {headerName: 'Titel', field: 'title' }, + {headerName: 'Termin-Art', field: 'type' }, + {headerName: 'Report vorhanden', field: 'reportExists' }, + {headerName: 'Optionstermin', field: 'is_option_meeting', cellRenderer: this.optionRenderer }, + {headerName: 'Adresse', field: 'address', cellRenderer: this.addressRenderer, autoHeight: true }, + {headerName: 'Teilnehmer', field: 'participants', cellRenderer: this.participantsRenderer, autoHeight: true }, + {headerName: 'Abteilung', field: 'department' }, + {headerName: 'E-Mail', field: 'email' }, + {headerName: 'Telefon', field: 'phone' }, + {headerName: 'Mobil', field: 'mobile' }, + ]; + } + + /** + * Sets data + */ + public setData( + customersById: {}, + customerMeetings: ICustomerMeeting[], + internalMeetings: IInternalMeeting[] + ): void { + this.customersById = customersById; + this.customerMeetings = customerMeetings; + this.internalMeetings = internalMeetings; + this.generateEntries(); + } + + /** + * Generates AG grid entries + */ + public generateEntries(): void { + this.rowData = []; + const items: {}[] = []; + let owner: IUser = null; + let meetingType: IMeetingType = null; + + this.customerMeetings.forEach(item => { + owner = this.appService.getConfig().vc_user_by_id[item.owner_user_id] as IUser; + meetingType = this.appService.getConfig().vc_meeting_types_by_id[item.meeting_type_id] as IMeetingType; + let customerContactName: string = null !== item.firstname ? item.firstname + ' ' : ''; + customerContactName += null !== item.lastname ? item.lastname : ''; + const customer: ICustomer = this.customersById[item.customer_id]; + const creator: IUser = this.appService.getConfig().vc_user_by_id[item.creation_user_id]; + + items.push({ + that: this, + itemType: 'customer', + objectId: customer.id, + id: item.id, + meeting: item, + title: item.title, + objectName: customer.name, + dateStart: item.start_date, + dateEnd: item.end_date, + type: meetingType.name, + typeType: meetingType.type, + reportExists: item.report !== null ? 'Ja' : 'Nein', + is_option_meeting: item.is_option_meeting, + street: item.street, + street_no: item.street_no, + zip: item.zip, + city: item.city, + owner: owner.firstname + ' ' + owner.lastname, + creator: creator.firstname + ' ' + creator.lastname, + contactName: customerContactName, + participants: item.v_participants, + department: item.department, + email: item.email, + phone: item.phone_no, + mobile: item.mobile_no, + }); + }); + this.internalMeetings.forEach(item => { + owner = this.appService.getConfig().vc_user_by_id[item.owner_user_id] as IUser; + const creator: IUser = this.appService.getConfig().vc_user_by_id[item.creation_user_id]; + items.push({ + that: this, + itemType: 'internal', + objectId: null, + id: item.id, + meeting: item, + title: item.title, + objectName: 'PLP Intern', + dateStart: item.start_date, + dateEnd: item.end_date, + type: 'Intern', + typeType: '', + reportExists: item.report !== null ? 'Ja' : 'Nein', + is_option_meeting: '-', + street: '', + street_no: '', + zip: '', + city: '', + owner: owner.firstname + ' ' + owner.lastname, + creator: creator.firstname + ' ' + creator.lastname, + contactName: null, + participants: item.v_participants, + department: null, + email: null, + phone: null, + mobile: null, + }); + }); + + this.rowData = items.sort((a: {} , b: {}) => this.dateComparator(a['dateStart'], b['dateStart'], false)); + } + + /** + * row is clicked + */ + public rowClicked(e: any): void { + switch (e.data.itemType) { + case 'customer': + this.editCustomerMeeting.emit(e.data.meeting); + break; + case 'internal': + this.editInternalMeeting.emit(e.data.meeting); + break; + } + } + + public exportFilteredMeetingList(e: any): void { + + const exportData: {}[] = []; + this.gridParamsApi.forEachNodeAfterFilter((rowNode, index) => { + const exportEntry: {} = rowNode.data; + delete exportEntry['that']; + delete exportEntry['participants']; + exportData.push(exportEntry); + }); + + const fileName: string = 'Termine_' + this.appService.getAppUser().firstname + '_' + this.appService.getAppUser().lastname + '_' + Utils.getCurrentDate(true); + this.meetingService.apiExportMeetingList(exportData, fileName); + } + + ngOnDestroy(): void { + + } + +} diff --git a/plp-angular/src/app/views/start/start.component.html b/plp-angular/src/app/views/start/start.component.html new file mode 100644 index 0000000..0323fa8 --- /dev/null +++ b/plp-angular/src/app/views/start/start.component.html @@ -0,0 +1,43 @@ +
+

Start

+
Internen Termin anlegen
+ + + + + + + + + + + +
+ + + + + + + + + + + + +
+ + +
+
diff --git a/plp-angular/src/app/views/start/start.component.scss b/plp-angular/src/app/views/start/start.component.scss new file mode 100644 index 0000000..f95d326 --- /dev/null +++ b/plp-angular/src/app/views/start/start.component.scss @@ -0,0 +1,18 @@ +.content { + position: relative; +} + +#create-meeting-internal { + position: absolute; + right: 0; + top: 1rem; +} + +@media only screen and (max-width: 1004px) { + #create-meeting-internal { + position: relative; + right: auto; + top: auto; + display: inline-block; + } +} diff --git a/plp-angular/src/app/views/start/start.component.ts b/plp-angular/src/app/views/start/start.component.ts new file mode 100644 index 0000000..204ea27 --- /dev/null +++ b/plp-angular/src/app/views/start/start.component.ts @@ -0,0 +1,209 @@ +import {Component, ChangeDetectionStrategy, ViewChild, OnInit, OnDestroy, NgModule} from '@angular/core'; +import {Subscription} from 'rxjs'; +import {AppService} from '../../services/app.service'; +import {CustomerService} from '../../services/customer.service'; +import {ICustomer} from '../../model/entities/customer'; +import {ICustomerMeeting} from '../../model/entities/customer-meeting'; +import {MeetingCalendarComponent} from './meeting-calendar/meeting-calendar.component'; +import {TabsComponent} from '../../components/tabs/tabs.component'; +import {MeetingListComponent} from './meeting-list/meeting-list.component'; +import {MeetingService} from '../../services/meeting.service'; +import {IInternalMeeting} from '../../model/entities/internal-meeting'; +import {ModalComponent} from '../../components/modal/modal.component'; +import {CustomerMeetingDetailComponent} from '../customer-management/customer-view/customer-meeting-detail/customer-meeting-detail.component'; +import {Utils} from '../../utils/utils'; +import {CustomerMeetingEditComponent} from '../customer-management/customer-view/customer-meeting-edit/customer-meeting-edit.component'; +import {InternalMeetingEditComponent} from './internal-meeting-edit/internal-meeting-edit.component'; +import {Factory} from '../../factory/factory'; +import {InternalMeetingDetailComponent} from './internal-meeting-detail/internal-meeting-detail.component'; +import {IMeetingData} from '../../model/virtual/meeting-data'; +import {TabComponent} from '../../components/tab/tab.component'; + +@Component({ + selector: 'app-start', + changeDetection: ChangeDetectionStrategy.OnPush, + templateUrl: './start.component.html', + styleUrls: ['./start.component.scss'] +}) + +export class StartComponent implements OnInit, OnDestroy { + + @ViewChild('tabsStart', {static: true}) tabsStart: TabsComponent; + @ViewChild('meetingCalendar', {static: true}) meetingCalendar: MeetingCalendarComponent; + @ViewChild('meetingList', {static: true}) meetingList: MeetingListComponent; + @ViewChild('modalInternalMeetingEdit', {static: true}) modalInternalMeetingEdit: ModalComponent; + @ViewChild('modalInternalMeetingDetailStart', {static: true}) modalInternalMeetingDetailStart: ModalComponent; + @ViewChild('internalMeetingEdit', {static: true}) internalMeetingEdit: InternalMeetingEditComponent; + @ViewChild('internalMeetingDetailStart', {static: true}) internalMeetingDetailStart: InternalMeetingDetailComponent; + @ViewChild('modalCustomerMeetingDetailStart', {static: true}) modalCustomerMeetingDetailStart: ModalComponent; + @ViewChild('modalCustomerMeetingEditStart', {static: true}) modalCustomerMeetingEditStart: ModalComponent; + @ViewChild('customerMeetingDetailStart', {static: true}) customerMeetingDetailStart: CustomerMeetingDetailComponent; + @ViewChild('customerMeetingEditStart', {static: true}) customerMeetingEditStart: CustomerMeetingEditComponent; + + private customers: ICustomer[]; + private customersById: {}; + private operatorsById: {}; + private customersSub: Subscription; + private meetingData: IMeetingData; + private meetingsSub: Subscription; + private customerMeetings: ICustomerMeeting[]; + private internalMeetings: IInternalMeeting[]; + + constructor( + private appService: AppService, + private customerService: CustomerService, + private meetingService: MeetingService) { + + } + + ngOnInit() { + this.customers = null; + this.customersById = {}; + this.operatorsById = {}; + this.customerMeetings = null; + this.internalMeetings = null; + + this.customerService.apiGetCustomerData(); + this.meetingService.apiGetMeetingData(); + + this.customersSub = this.customerService.getCustomers$().subscribe( + data => { + this.customers = data; + this.customersById = Utils.getSortedObjFromArray(this.customers, 'id'); + this.setComponentData(); + } + ); + + this.meetingsSub = this.meetingService.getMeetingsData$().subscribe( + data => { + this.meetingData = data; + if (null !== data) { + this.customerMeetings = data.customerMeetings; + this.internalMeetings = data.internalMeetings; + } else { + this.customerMeetings = null; + this.internalMeetings = null; + } + this.setComponentData(); + } + ); + } + + /** + * Sets component data + */ + private setComponentData() { + if (null !== this.customers && + null !== this.customerMeetings && + null !== this.internalMeetings) { + this.meetingCalendar.setData( + this.customersById, + this.customerMeetings, + this.internalMeetings, + ); + this.meetingList.setData( + this.customersById, + this.customerMeetings, + this.internalMeetings, + ); + } + } + + public rowClickedCustomerMeeting(e: ICustomerMeeting): void { + this.modalCustomerMeetingDetailStart.openModal(); + this.customerMeetingDetailStart.setData(this.customersById[e.customer_id], e); + } + + public rowClickedInternalMeeting(e: IInternalMeeting): void { + this.modalInternalMeetingDetailStart.openModal(); + this.internalMeetingDetailStart.setData(e); + } + + public editCustomerMeetingFunction(customerMeeting: ICustomerMeeting): void { + this.meetingService.apiEditCustomerMeeting(customerMeeting).subscribe( + data => { + this.customerMeetingDetailStart.updateData(data.result_data as ICustomer); + }, + error => { + } + ); + } + + public editCustomerMeetingReportFunction(reportValues: any): void { + const meetingId: number = reportValues.id; + const report: string = reportValues.report; + this.meetingService.apiEditCustomerMeetingReport(meetingId, report).subscribe( + data => { + this.customerMeetingDetailStart.updateData(data.result_data as ICustomer); + }, + error => {} + ); + } + + public deleteCustomerMeetingFunction(customerMeetingId: number): void { + this.meetingService.apiDeleteCustomerMeeting(customerMeetingId).subscribe( + data => { + this.modalCustomerMeetingDetailStart.exitModal(); + }, + error => { + } + ); + } + + public editInternalMeetingFunction(internalMeeting: IInternalMeeting): void { + this.meetingService.apiEditInternalMeeting(internalMeeting).subscribe( + data => { + this.internalMeetingDetailStart.updateData(data.result_data as IInternalMeeting); + }, + error => { + } + ); + } + + public deleteInternalMeetingFunction(internalMeetingId: number): void { + this.meetingService.apiDeleteInternalMeeting(internalMeetingId).subscribe( + data => { + this.modalInternalMeetingDetailStart.closeModal(); + }, + error => { + } + ); + } + + public editInternalMeetingReportFunction(reportValues: any): void { + const meetingId: number = reportValues.id; + const report: string = reportValues.report; + this.meetingService.apiEditInternalMeetingReport(meetingId, report).subscribe( + data => { + this.internalMeetingDetailStart.setData(data.result_data as IInternalMeeting); + }, + error => {} + ); + } + + public openCreateMeeting(): void { + this.modalInternalMeetingEdit.openModal(); + this.internalMeetingEdit.setData(Factory.getEmptyInternalMeeting(), true); + } + + public createMeetingInternal(internalMeeting: IInternalMeeting): void { + this.meetingService.apiCreateInternalMeeting(internalMeeting).subscribe( + data => { + this.modalInternalMeetingEdit.closeModal(); + }, + error => {} + ); + } + + /** + * Destroy + */ + ngOnDestroy(): void { + if (this.customersSub !== null && this.customersSub !== undefined) { + this.customersSub.unsubscribe(); + } + if (this.meetingsSub !== null && this.meetingsSub !== undefined) { + this.meetingsSub.unsubscribe(); + } + } +} diff --git a/plp-angular/src/app/views/technique/technique.component.html b/plp-angular/src/app/views/technique/technique.component.html new file mode 100644 index 0000000..ccd6112 --- /dev/null +++ b/plp-angular/src/app/views/technique/technique.component.html @@ -0,0 +1 @@ +

technique works!

diff --git a/plp-angular/src/app/views/technique/technique.component.scss b/plp-angular/src/app/views/technique/technique.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/app/views/technique/technique.component.ts b/plp-angular/src/app/views/technique/technique.component.ts new file mode 100644 index 0000000..93abea7 --- /dev/null +++ b/plp-angular/src/app/views/technique/technique.component.ts @@ -0,0 +1,16 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-technique', + templateUrl: './technique.component.html', + styleUrls: ['./technique.component.scss'] +}) + +export class TechniqueComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/plp-angular/src/assets/.gitkeep b/plp-angular/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/plp-angular/src/assets/apple-touch-icon.png b/plp-angular/src/assets/apple-touch-icon.png new file mode 100644 index 0000000..2c08eba Binary files /dev/null and b/plp-angular/src/assets/apple-touch-icon.png differ diff --git a/plp-angular/src/assets/elements/close-x.svg b/plp-angular/src/assets/elements/close-x.svg new file mode 100644 index 0000000..e517eb6 --- /dev/null +++ b/plp-angular/src/assets/elements/close-x.svg @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/plp-angular/src/assets/elements/select-arrow.svg b/plp-angular/src/assets/elements/select-arrow.svg new file mode 100644 index 0000000..6b82fba --- /dev/null +++ b/plp-angular/src/assets/elements/select-arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plp-angular/src/assets/elements/spinner.gif b/plp-angular/src/assets/elements/spinner.gif new file mode 100644 index 0000000..48fbe00 Binary files /dev/null and b/plp-angular/src/assets/elements/spinner.gif differ diff --git a/plp-angular/src/assets/favicon-small.png b/plp-angular/src/assets/favicon-small.png new file mode 100644 index 0000000..88bce97 Binary files /dev/null and b/plp-angular/src/assets/favicon-small.png differ diff --git a/plp-angular/src/assets/favicon.png b/plp-angular/src/assets/favicon.png new file mode 100644 index 0000000..fb87db8 Binary files /dev/null and b/plp-angular/src/assets/favicon.png differ diff --git a/plp-angular/src/assets/mstile-144x144.png b/plp-angular/src/assets/mstile-144x144.png new file mode 100644 index 0000000..78efaa5 Binary files /dev/null and b/plp-angular/src/assets/mstile-144x144.png differ diff --git a/plp-angular/src/assets/wall.png b/plp-angular/src/assets/wall.png new file mode 100644 index 0000000..cf6fcf6 Binary files /dev/null and b/plp-angular/src/assets/wall.png differ diff --git a/plp-angular/src/environments/environment.beta.ts b/plp-angular/src/environments/environment.beta.ts new file mode 100644 index 0000000..70350d1 --- /dev/null +++ b/plp-angular/src/environments/environment.beta.ts @@ -0,0 +1,14 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + production: true, + + // URL of development API + apiUrl: 'https://beta-api.plp-tool.de/', + apiAssetPath: 'https://beta-api.plp-tool.de/assets/', + debugParam: '', + password: '' +}; diff --git a/plp-angular/src/environments/environment.gamma.ts b/plp-angular/src/environments/environment.gamma.ts new file mode 100644 index 0000000..fce253a --- /dev/null +++ b/plp-angular/src/environments/environment.gamma.ts @@ -0,0 +1,14 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + production: true, + + // URL of development API + apiUrl: 'https://api.plp-tool.de/', + apiAssetPath: 'https://api.plp-tool.de/assets/', + debugParam: '', + password: '' +}; diff --git a/plp-angular/src/environments/environment.prod.ts b/plp-angular/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/plp-angular/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/plp-angular/src/environments/environment.ts b/plp-angular/src/environments/environment.ts new file mode 100644 index 0000000..f721fae --- /dev/null +++ b/plp-angular/src/environments/environment.ts @@ -0,0 +1,33 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +//////////////////////////////////////////////////////////////////// +// LOCAL 4 Spawntree ;) +// php bin/console server:status +// php bin/console server:start *:8001 +// php bin/console server:stop *:8001 +// https://symfony.com/doc/current/setup/built_in_web_server.html +// +// ng serve --port 4300 +//////////////////////////////////////////////////////////////////// + +export const environment = { + production: false, + + // URL of development API + apiUrl: 'http://localhost:8001/', + apiAssetPath: 'http://localhost:8001/assets/', + debugParam: '?XDEBUG_SESSION_START=', + password: 'plpSpawnTr33!' +}; + + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/plp-angular/src/environments/path.ts b/plp-angular/src/environments/path.ts new file mode 100644 index 0000000..99d6323 --- /dev/null +++ b/plp-angular/src/environments/path.ts @@ -0,0 +1,11 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +import {environment} from './environment'; + +export const path = { + path_assets: environment.apiAssetPath, + // path_contact_info: environment.apiAssetPath + "contact-info/", +}; diff --git a/plp-angular/src/favicon.ico b/plp-angular/src/favicon.ico new file mode 100644 index 0000000..d36ae57 Binary files /dev/null and b/plp-angular/src/favicon.ico differ diff --git a/plp-angular/src/index.html b/plp-angular/src/index.html new file mode 100644 index 0000000..9307dd1 --- /dev/null +++ b/plp-angular/src/index.html @@ -0,0 +1,19 @@ + + + + + PLP Verwaltungstool + + + + + + + + + + + + + + diff --git a/plp-angular/src/main.ts b/plp-angular/src/main.ts new file mode 100644 index 0000000..c7b673c --- /dev/null +++ b/plp-angular/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/plp-angular/src/polyfills.ts b/plp-angular/src/polyfills.ts new file mode 100644 index 0000000..aa665d6 --- /dev/null +++ b/plp-angular/src/polyfills.ts @@ -0,0 +1,63 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags.ts'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/plp-angular/src/scss/_reset.scss b/plp-angular/src/scss/_reset.scss new file mode 100644 index 0000000..c82caf8 --- /dev/null +++ b/plp-angular/src/scss/_reset.scss @@ -0,0 +1,367 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0-modified | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +/* make sure to set some focus styles for accessibility */ +:focus { + outline: 0; +} + +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +input[type=search]::-webkit-search-cancel-button, +input[type=search]::-webkit-search-decoration, +input[type=search]::-webkit-search-results-button, +input[type=search]::-webkit-search-results-decoration { + -webkit-appearance: none; + -moz-appearance: none; +} + +input[type=search] { + -webkit-appearance: none; + -moz-appearance: none; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +textarea { + overflow: auto; + vertical-align: top; + resize: vertical; +} + +/** + * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. + */ + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; + max-width: 100%; +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. + * Known issue: no IE 6 support. + */ + +[hidden] { + display: none; +} + +/** + * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using + * `em` units. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-size: 100%; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ +} + +/** + * Address `outline` inconsistency between Chrome and other browsers. + */ + +a:focus { + outline: thin dotted; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/** + * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. + * 2. Improve image quality when scaled in IE 7. + */ + +img { + border: 0; /* 1 */ + -ms-interpolation-mode: bicubic; /* 2 */ +} + +/** + * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. + */ + +figure { + margin: 0; +} + +/** + * Correct margin displayed oddly in IE 6/7. + */ + +form { + margin: 0; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct color not being inherited in IE 6/7/8/9. + * 2. Correct text not wrapping in Firefox 3. + * 3. Correct alignment displayed oddly in IE 6/7. + */ + +legend { + border: 0; /* 1 */ + padding: 0; + white-space: normal; /* 2 */ + *margin-left: -7px; /* 3 */ +} + +/** + * 1. Correct font size not being inherited in all browsers. + * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, + * and Chrome. + * 3. Improve appearance and consistency in all browsers. + */ + +button, +input, +select, +textarea { + font-size: 100%; /* 1 */ + margin: 0; /* 2 */ + vertical-align: baseline; /* 3 */ + *vertical-align: middle; /* 3 */ +} + +/** + * Address Firefox 3+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +button, +input { + line-height: normal; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. + * Correct `select` style inheritance in Firefox 4+ and Opera. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + * 4. Remove inner spacing in IE 7 without affecting normal text inputs. + * Known issue: inner spacing remains in IE 6. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ + *overflow: visible; /* 4 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * 1. Address box sizing set to content-box in IE 8/9. + * 2. Remove excess padding in IE 8/9. + * 3. Remove excess padding in IE 7. + * Known issue: excess padding remains in IE 6. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + *height: 13px; /* 3 */ + *width: 13px; /* 3 */ +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/** + * Remove inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Remove inner padding and border in Firefox 3+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * 1. Remove default vertical scrollbar in IE 6/7/8/9. + * 2. Improve readability and alignment in all browsers. + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +html, +button, +input, +select, +textarea { + color: #222; +} + + +::-moz-selection { + background: #b3d4fc; + text-shadow: none; +} + +::selection { + background: #b3d4fc; + text-shadow: none; +} + +img { + vertical-align: middle; +} + +fieldset { + border: 0; + margin: 0; + padding: 0; +} + +textarea { + resize: vertical; +} + +.chromeframe { + margin: 0.2em 0; + background: #ccc; + color: #000; + padding: 0.2em 0; +} + diff --git a/plp-angular/src/scss/_variables.scss b/plp-angular/src/scss/_variables.scss new file mode 100644 index 0000000..c7c51b0 --- /dev/null +++ b/plp-angular/src/scss/_variables.scss @@ -0,0 +1,20 @@ +/* Variables for plp project */ + +$color-default: rgba(51, 51, 51, 1); +$color-plp-primary: rgba(0, 122, 153, 1); +$color-plp-secondary: rgba(255, 252, 13, 1); +$color-plp-tertiary: rgba(197, 58, 122, 1); +$color-plp-tertiary-light: rgba(197, 58, 122, 0.6); +$color-plp-tertiary-light: rgba(197, 58, 122, 0.1); +$color-plp-grey: rgba(153, 153, 153, 1); +$color-plp-grey-light: rgba(200, 200, 200, 1); + +$color-white: rgba(255, 255, 255, 1); +$color-black: rgba(0, 0, 0, 1); +$color-red: rgba(251, 57, 62, 1); +$color-green: rgba(0, 153, 0, 1); +$color-blue: rgba(48, 155, 248, 1); + +$font-size-default: 14px; + +$line-height-default: 19px; \ No newline at end of file diff --git a/plp-angular/src/scss/components/_ag-grid.scss b/plp-angular/src/scss/components/_ag-grid.scss new file mode 100644 index 0000000..3706a10 --- /dev/null +++ b/plp-angular/src/scss/components/_ag-grid.scss @@ -0,0 +1,37 @@ +.content { + height: 100%; + position: relative; +} + +.ag-grid-box { + height: 500px; + min-height: auto; +} + +.inactive { + background: $color-plp-tertiary-light !important; + font-style: italic; + color: $color-plp-grey; +} + +.dot { + border-radius: 50%; + width: 10px; + height: 10px; + display: inline-block; + &--customer { + background: #ad2121; + } + &--operator { + background: #e3bc08; + } + &--internal { + background: #1e90ff; + } + &--production { + background: #13f347; + } + &--service { + background: #ac1eff; + } +} diff --git a/plp-angular/src/scss/components/_breadcrumb.scss b/plp-angular/src/scss/components/_breadcrumb.scss new file mode 100644 index 0000000..5aeb54b --- /dev/null +++ b/plp-angular/src/scss/components/_breadcrumb.scss @@ -0,0 +1,24 @@ +breadcrumb { + .container { + height: 2.5rem; + display: flex; + justify-content: center; + align-items: center; + background: $color-plp-tertiary; + color: $color-white; + } + ol { + li { + + } + } +} + +@media only screen and (max-width: 768px) { + breadcrumb { + .container { + padding-left: 2vw; + justify-content: left; + } + } +} diff --git a/plp-angular/src/scss/components/_calendar.scss b/plp-angular/src/scss/components/_calendar.scss new file mode 100644 index 0000000..a5c92c8 --- /dev/null +++ b/plp-angular/src/scss/components/_calendar.scss @@ -0,0 +1,87 @@ +#calendar, #c-list { + margin: 0 0 3rem 0; + h2 { + color: $color-plp-tertiary; + font-size: 1.5rem; + line-height: 1.75rem; + text-transform: uppercase; + } + .c-filter-box { + background: rgba(230, 230, 230, 1); + padding: 1.5rem 0 0 0; + margin: 0 0 2rem 0; + &--buttons { + display: flex; + justify-content: center; + padding: 0 0 2rem 0; + .button { + margin: 0 2rem; + width: 13rem; + text-align: center; + } + } + h3 { + text-align: center; + margin: 0 0 1rem 0; + } + } +} + +.calendar-legend { + display: block; + position: absolute; + right: 0; + top: 0; + li { + position: relative; + display: inline-block; + padding: 0 2rem; + &:last-child { + padding-right: 0; + } + &:after { + content: ""; + position: absolute; + left: 0; + top: calc(50% - 6px); + width: 10px; + height: 10px; + border-radius: 50%; + display: block; + } + &.legend-color--customer { + &:after { + background: #ad2121; + } + } + &.legend-color--operator { + &:after { + background: #e3bc08; + } + } + &.legend-color--internal { + &:after { + background: #1e90ff; + } + } + &.legend-color--production { + &:after { + background: #13f347; + } + } + &.legend-color--service { + &:after { + background: #ac1eff; + } + } + } +} + +.user-filter { + display: flex; + justify-content: flex-end; + padding: 0 0 2rem 0; + div { + width: 20rem; + } +} diff --git a/plp-angular/src/scss/components/_forms.scss b/plp-angular/src/scss/components/_forms.scss new file mode 100644 index 0000000..b139627 --- /dev/null +++ b/plp-angular/src/scss/components/_forms.scss @@ -0,0 +1,202 @@ +.form { + &--small { + width: 20vw; + .row { + display: block !important; + } + } + p.error { + display: block; + padding: 0.5rem 1rem; + margin: 0 0 0.5rem 0; + background: $color-plp-tertiary; + color: $color-white; + } + p.error-msg { + color: $color-plp-tertiary; + font-weight: bold; + margin: 0; + } + .row { + display: flex; + padding: 0 0 1rem 0; + &--last { + .column { + display: flex; + justify-content: flex-end; + } + .button { + margin-left: 1rem; + } + } + &--error { + padding: 0; + } + .error { + + } + } + .column { + flex: 1; + padding: 0 2rem 0 0; + &--checkbox { + overflow: hidden; + input { + float: left; + margin: 2px 10px 0 0; + } + label { + padding: 0 0 0 23px; + } + .checkbox-inner-column { + float: left; + width: 50%; + padding: 0 0 0.5rem 0; + &:nth-child(2n + 1) { + clear: both; + } + } + } + } + label, + p.label { + display: block; + padding: 0 0 0.5rem 0; + margin: 0; + &.error { + color: $color-plp-tertiary; + } + } + input, + textarea { + font-family: Helvetica, Arial, Verdana, sans-serif; + padding: 0.5rem; + display: block; + width: 100%; + background: $color-white; + border: 1px solid $color-plp-primary; + } + input { + &[type='checkbox'] { + width: auto; + } + &:disabled { + color: $color-plp-grey; + font-style: italic; + } + } + textarea { + height: 12.25rem; + } + select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 0; + font-size: 1em; + width: 100%; + display: block; + border: 1px solid $color-plp-primary; + padding: calc(0.5rem - 2px) 0.5rem; + background: $color-white url("/assets/elements/select-arrow.svg") no-repeat calc(100% - 1rem) 50%/1rem auto; + &:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #000; + } + &::-ms-expand { + display:none; + } + &:disabled { + color: $color-plp-grey; + font-style: italic; + background: $color-white; + } + } + + input, + textarea, + select { + transition: 0.3s; + &.error { + border-color: $color-plp-tertiary; + background-color: $color-plp-tertiary-light; + } + } +} + +.button { + display: block; + padding: calc(0.5rem - 1px) 2rem; + background: $color-plp-tertiary; + color: $color-white; + border: none; + margin: 0 0 2rem 0; + cursor: pointer; + transition: 0.3s; + &:hover { + background-color: $color-plp-primary; + } + &[disabled] { + color: $color-plp-grey; + background: $color-plp-grey-light; + &:hover { + background-color: $color-plp-grey-light; + } + } + &--inline { + display: inline-block; + } +} + +.button-row { + position: relative; + .button-row--link { + cursor: pointer; + position: absolute; + left: 0; + top: 1rem; + color: $color-plp-tertiary; + text-decoration: underline; + &:hover { + color: $color-plp-primary; + } + } +} + +#forgot-pw { + cursor: pointer; +} + +@media only screen and (max-width: 1004px) { + .form { + &--small { + width: 60vw; + } + } +} + +@media only screen and (max-width: 768px) { + .form { + padding-bottom: 4rem; + &--small { + width: 80vw; + } + } +} + +@media only screen and (max-width: 400px) { + .form { + &--small { + .row { + padding: 0 0 1rem 0 !important; + } + } + .row { + display: block; + padding: 0; + } + .column { + padding: 0 0 1.5rem 0; + } + } +} diff --git a/plp-angular/src/scss/components/_message.scss b/plp-angular/src/scss/components/_message.scss new file mode 100644 index 0000000..50e2f1f --- /dev/null +++ b/plp-angular/src/scss/components/_message.scss @@ -0,0 +1,64 @@ +.message-modal { + position: fixed; + z-index: 9000; + left: 0; + top: 0; + right: 0; + bottom: 0; + width: 100%; + height: 100%; + visibility: hidden; + opacity: 0; + transition: all 0.3s ease-in-out; + background: rgba(0, 0, 0, .7); + &.active { + visibility: visible; + opacity: 1; + } +} +.message { + position: fixed; + z-index: 9001; + left: 0; + top: 0; + right: 0; + width: 100%; + visibility: hidden; + opacity: 0; + padding: 30px; + text-align: center; + transition: all 0.3s ease-in-out; + &.active { + visibility: visible; + opacity: 1; + } + &.message--error { + background: $color-red; + } + &.message--success { + background: $color-green; + } + &.message--info { + background: $color-blue; + .button { + color: $color-blue; + } + } + p { + color: $color-white; + font-size: 1.5rem; + line-height: 2rem; + overflow: auto; + max-height: 400px; + } + .button { + margin: 0 auto; + background-color: $color-white; + border: 0.125rem solid $color-white; + color: $color-red; + &:hover { + background: $color-red; + color: $color-white; + } + } +} \ No newline at end of file diff --git a/plp-angular/src/scss/components/_modal.scss b/plp-angular/src/scss/components/_modal.scss new file mode 100644 index 0000000..066d59f --- /dev/null +++ b/plp-angular/src/scss/components/_modal.scss @@ -0,0 +1,93 @@ +body { + &.body--modal-open { + overflow: hidden; + } +} + +.modal { + opacity: 0; + visibility: hidden; + position: fixed; + z-index: 4999; + left: 0; + right: 0; + top: 0; + bottom: 0; + width: 100%; + height: 100%; + background: rgba(0,0,0,.6); + transition: .3s; + &.modal-open { + visibility: visible; + opacity: 1; + } + &.overlay { + background: rgba(0,0,0,.8); + } +} +.modal-content { + position: fixed; + z-index: 5000; + left: 5vw; + right: 5vw; + bottom: -90vh; + background: $color-white; + border: 0.25rem solid $color-plp-tertiary; + border-bottom: none; + padding: 0.5rem; + height: 90vh; + transition: .6s; + &.modal-open { + bottom: 0; + } + &-inner { + overflow: auto; + height: 100%; + padding: 1rem; + } + &.overlay { + opacity: 0; + visibility: hidden; + border-bottom: 0.25rem solid $color-plp-primary; + border-color: $color-plp-primary; + left: 10vw; + right: 10vw; + top: 10vh; + bottom: 10vh; + height: 80vh; + &.modal-open { + visibility: visible; + opacity: 1; + } + } + .close { + cursor: pointer; + position: absolute; + right: 1.5rem; + top: 1.5rem; + display: block; + width: 27px; + height: 27px; + text-indent: -9999px; + font-size: 1px; + line-height: 1px; + background: transparent url("/assets/elements/close-x.svg") no-repeat left top; + background-size: 100% auto; + } +} + +@media only screen and (max-width: 1004px) { + .modal-content { + height: 96vh; + left: 2vw; + right: 2vw; + bottom: - 96vh; + &.overlay { + height: 96vh; + left: 2vw; + right: 2vw; + top: 2vh; + bottom: 2vh; + } + } +} diff --git a/plp-angular/src/scss/components/_navigation.scss b/plp-angular/src/scss/components/_navigation.scss new file mode 100644 index 0000000..7d391cf --- /dev/null +++ b/plp-angular/src/scss/components/_navigation.scss @@ -0,0 +1,17 @@ +#navigation { + li { + cursor: pointer; + margin: 0 0 0.5rem 0; + p { + + } + } +} +.home-btn { + cursor: pointer; + margin: 0 0 2rem 0; +} +#logout { + cursor: pointer; + margin: 2rem 0 0 0; +} diff --git a/plp-angular/src/scss/components/_search_bar.scss b/plp-angular/src/scss/components/_search_bar.scss new file mode 100644 index 0000000..02fc080 --- /dev/null +++ b/plp-angular/src/scss/components/_search_bar.scss @@ -0,0 +1,49 @@ +.searchForm { + position: relative; + display: inline-block; + margin: 0 0 2rem 0; + input { + font-family: Helvetica, Arial, Verdana, sans-serif; + padding: 0.5rem; + background: $color-white; + border: 1px solid $color-plp-primary; + } + .resetSearch { + position: absolute; + right: 1px; + top: 1px; + background: $color-white; + width: 36px; + height: calc(100% - 2px); + padding: 0; + border: none; + cursor: pointer; + text-indent: -9999px; + &::before, + &::after { + content: ""; + display: block; + position: absolute; + left: 50%; + top: calc(50% - 9px); + width: 2px; + height: 18px; + background: $color-plp-primary; + } + &::before { + transform: rotate(45deg); + } + &::after { + transform: rotate(-45deg); + } + } +} + +@media only screen and (max-width: 768px) { + .searchForm { + display: block; + input { + width: 100%; + } + } +} diff --git a/plp-angular/src/scss/components/_structure.scss b/plp-angular/src/scss/components/_structure.scss new file mode 100644 index 0000000..a311c9e --- /dev/null +++ b/plp-angular/src/scss/components/_structure.scss @@ -0,0 +1,245 @@ +#wrapper { + #header { + color: $color-plp-secondary; + height: 2.5rem; + font-size: 0.75rem; + letter-spacing: 0.1em; + .user { + position: absolute; + right: 2vw; + top: 0; + height: 2.5rem; + color: $color-white; + display: flex; + align-items: center; + } + } + #content { + display: flex; + align-items: stretch; + height: calc(100vh - 6.5rem); + margin: 2rem 0; + aside { + margin: 0 1vw 0 2vw; + width: 17vw; + background: $color-plp-primary; + color: $color-white; + overflow: auto; + padding: 1.5rem; + } + #main { + margin: 0 2vw 0 1vw; + border: 0.25vw solid $color-plp-primary; + width: 77vw; + padding: 1.5rem; + overflow: auto; + &.not-logged-in { + width: 97vw; + } + } + } +} + +body, table, td, th { + color: $color-default; +} + +a { + color: $color-plp-primary; + &:hover { + color: $color-plp-tertiary; + } +} + +h1 { + width: 50%; + padding: 1rem; + margin: 0 0 2rem 0; + background: $color-plp-primary; + color: $color-plp-secondary; + text-transform: uppercase; + font-size: 1.5rem; + line-height: 1.875rem; + font-weight: bold; +} + +h2 { + margin: 0 0 2rem 0; + color: $color-plp-tertiary; + text-transform: uppercase; + font-size: 2rem; + line-height: 2.5rem; + font-weight: bold; +} + +h3, h4, h5, h6 { + text-transform: uppercase; + font-weight: bold; + margin: 0 0 0.5rem 0; +} + +p { + margin: 0 0 2rem 0; +} + +input[type="text"], +input[type="password"], +input[type="number"], +input[type="search"], +textarea { + width: 30vw; +} + +.grid { + display: flex; + .grid-item { + flex: 1; + margin-right: 30px; + } +} + +.right { + float: right; +} + +dl { + overflow: hidden; + dt { + clear: both; + float: left; + width: 30%; + padding: 0.75rem 0; + border-top: 1px solid $color-plp-primary; + &:first-of-type { + border: none; + padding-top: 0; + } + } + dd { + float: right; + width: 70%; + padding: 0.75rem 0 0.75rem 2rem; + border-top: 1px solid $color-plp-primary; + &:first-of-type { + border: none; + padding-top: 0; + } + } +} +.comment { + border-top: 1px solid $color-plp-primary; + padding: 0.75rem 0; +} + +body { + &:after { + visibility: hidden; + opacity: 0; + content: ""; + position: fixed; + z-index: 9999; + left: 0; + top: 0; + right: 0; + bottom: 0; + width: 100vw; + height: 100vh; + transition: visibility 1s, opacity 1s, background-color 1s; + } +} +body.loading { + overflow: hidden; + &::after { + visibility: visible; + opacity: 1; + background: rgba(0,0,0,0.2) url("/assets/elements/spinner.gif") no-repeat 50% 50%/60px auto; + } +} + +@media only screen and (max-width: 1004px) { + #wrapper { + #content { + aside { + overflow: visible; + width: 5vw; + position: relative; + padding: 0; + &:before { + content: ""; + display: block; + position: absolute; + left: 0.1875rem; + top: 1.875rem; + right: 0.1875rem; + width: calc(100% - 0.375rem); + height: 0.1875rem; + background: #fff; + } + &:after { + content: ""; + display: block; + position: absolute; + left: 0.1875rem; + top: 1rem; + right: 0.1875rem; + width: calc(100% - 0.375rem); + height: 0.625rem; + border-top: 0.1875rem solid #fff; + border-bottom: 0.1875rem solid #fff; + } + .aside-inner { + z-index: 300; + position: absolute; + left: 0; + top: 0; + height: 100%; + width: 0; + overflow: auto; + background: $color-plp-primary; + color: $color-white; + } + &:hover { + .aside-inner { + width: 50vw; + padding: 1.5rem; + } + } + } + #main { + width: 89vw; + } + } + } + h1 { + width: 100%; + } +} + +@media only screen and (max-width: 768px) { + .grid { + display: block; + .grid-item { + margin: 0 0 2rem 0; + } + } + .right { + float: none; + } +} + +@media only screen and (max-width: 400px) { + #wrapper { + #content { + aside { + &:hover { + .aside-inner { + width: 80vw; + } + } + } + } + } + h1 { + font-size: 1rem; + } +} diff --git a/plp-angular/src/scss/components/_tabs.scss b/plp-angular/src/scss/components/_tabs.scss new file mode 100644 index 0000000..f3c6bfc --- /dev/null +++ b/plp-angular/src/scss/components/_tabs.scss @@ -0,0 +1,73 @@ +.tabs { + display: block; + width: 100%; + box-sizing: border-box; + position: relative; +} +.tabs-nav { + padding-bottom: 30px; + padding-right: 40px; + display: flex; + position: relative; + width: 100%; + user-select: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + li { + font-size: 1rem; + text-align: center; + cursor: pointer; + //flex-grow: 1; + padding: 0.75rem 2rem; + &.disabled { + cursor: default; + opacity: 0.5; + } + &.active { + color: $color-plp-tertiary; + border-top: 1px solid $color-plp-tertiary; + border-bottom: 1px solid $color-plp-tertiary; + } + } +} +.tab-entries { + position: relative; + transition: all 0.3s ease-in-out; +} + +.tab-entry { + display: table !important; + width: 100%; + right: -9999px; + bottom: -9999px; + padding: 0 0 40px 0; + visibility: hidden; + opacity: 0; + background: transparent; + position: fixed; + &.active { + opacity: 1; + top: 0; + left: 0; + right: 0; + bottom: 0; + visibility: visible; + position: relative; + } +} + +@media only screen and (max-width: 768px) { + .tabs-nav { + display: block; + padding-right: 0; + li, + li.active { + border-bottom: 1px solid $color-plp-tertiary; + border-top: none; + &:first-child { + border-top: 1px solid $color-plp-tertiary; + } + } + } +} diff --git a/plp-angular/src/scss/styles.scss b/plp-angular/src/scss/styles.scss new file mode 100644 index 0000000..e3f4526 --- /dev/null +++ b/plp-angular/src/scss/styles.scss @@ -0,0 +1,111 @@ +@import "reset"; +@import "variables"; + +@import "components/structure"; +@import "components/ag-grid"; +@import "components/breadcrumb"; +@import "components/calendar"; +@import "components/forms"; +@import "components/message"; +@import "components/modal"; +@import "components/navigation"; +@import "components/search_bar"; +@import "components/tabs"; + +/* apply a natural box layout model to all elements, but allowing person to change */ +html {box-sizing:border-box;} +*, *:before, *:after {box-sizing:inherit;} + +/* Change font-size for mobile */ +html { + font-size: $font-size-default; +} +body, textarea { + font-size: $font-size-default; + line-height: $line-height-default; + color: $color-default; + font-family: Helvetica, Arial, Verdana, sans-serif; +} + +strong { + font-weight: bold; +} + +.pre-wrap { + white-space: pre-wrap; +} + +/* iOS Fix */ +div:hover, div:active, +span:hover, span:active { + -webkit-user-select: none; + -webkit-touch-callout: none; +} + +/* + 0.0625rem = 1px + 0.125rem = 2px + 0.25rem = 4px + 0.5rem = 8px + 0.625rem = 10px + 1rem = 16px + 1.25rem = 20px + 1.5rem = 24px + 1.75rem = 28px + 1.875rem = 30px + 2rem = 32px + 2.5rem = 40px + 3.125rem = 50px; + 4rem = 64px + 6.25rem = 100px + 12.5rem = 200px + 58rem = 928px + 62rem = 992px + 62.375rem = 998px + 62.75rem = 1004px +*/ + +.router-component {} + +/**************************/ + +.overview-box { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: flex-start; + padding: 0 14rem; + margin: 0 -1rem 3rem -1rem; + font-size: 0.75rem; + li { + width: 7rem; + height: 7rem; + /*width: 14rem; + height: 14rem;*/ + margin: 0 1rem 3rem 1rem; + background: transparent url('/assets/wall.png') no-repeat left top/100% auto; + position: relative; + cursor: pointer; + p { + position: absolute; + top: 7.5rem; + left: 0; + width: 100%; + text-align: center; + } + } +} + +@media only screen and (max-width: 1004px) { + .overview-box { + padding: 0 7rem; + li { + width: 3.5rem; + height: 3.5rem; + p { + top: 4rem; + overflow: hidden; + } + } + } +} diff --git a/plp-angular/src/test.ts b/plp-angular/src/test.ts new file mode 100644 index 0000000..1631789 --- /dev/null +++ b/plp-angular/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/plp-angular/tsconfig.app.json b/plp-angular/tsconfig.app.json new file mode 100644 index 0000000..1882923 --- /dev/null +++ b/plp-angular/tsconfig.app.json @@ -0,0 +1,21 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": ["node"] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/test.ts", + "src/**/*.spec.ts" + ], + "types": [ + + ] +} diff --git a/plp-angular/tsconfig.json b/plp-angular/tsconfig.json new file mode 100644 index 0000000..a409145 --- /dev/null +++ b/plp-angular/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "es2020", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true + } +} diff --git a/plp-angular/tsconfig.spec.json b/plp-angular/tsconfig.spec.json new file mode 100644 index 0000000..6400fde --- /dev/null +++ b/plp-angular/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/plp-angular/tslint.json b/plp-angular/tslint.json new file mode 100644 index 0000000..6ccb655 --- /dev/null +++ b/plp-angular/tslint.json @@ -0,0 +1,155 @@ +{ + "extends": "tslint:recommended", + "rules": { + "align": { + "options": [ + "parameters", + "statements" + ] + }, + "array-type": false, + "arrow-parens": false, + "arrow-return-shorthand": true, + "deprecation": { + "severity": "warning" + }, + "component-class-suffix": true, + "contextual-lifecycle": true, + "curly": true, + "directive-class-suffix": true, + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "eofline": true, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "import-spacing": true, + "indent": { + "options": [ + "spaces" + ] + }, + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-conflicting-lifecycle": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-inputs-metadata-property": true, + "no-output-native": true, + "no-output-on-prefix": true, + "no-output-rename": true, + "semicolon": { + "options": [ + "always" + ] + }, + "space-before-function-paren": { + "options": { + "anonymous": "never", + "asyncArrow": "always", + "constructor": "never", + "method": "never", + "named": "never" + } + }, + "no-outputs-metadata-property": true, + "template-banana-in-box": true, + "template-no-negated-async": true, + "typedef-whitespace": { + "options": [ + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + }, + { + "call-signature": "onespace", + "index-signature": "onespace", + "parameter": "onespace", + "property-declaration": "onespace", + "variable-declaration": "onespace" + } + ] + }, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true, + "variable-name": { + "options": [ + "ban-keywords", + "check-format", + "allow-pascal-case" + ] + }, + "whitespace": { + "options": [ + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type", + "check-typecast" + ] + } + }, + "rulesDirectory": [ + "codelyzer" + ] +} \ No newline at end of file