From 737a43ff823481f3fb3e82fa23141be33c255836 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Thu, 19 Jan 2023 14:47:52 +0100 Subject: [PATCH 01/43] first implementation --- frontends/dnet-is-application/.editorconfig | 16 + frontends/dnet-is-application/.gitignore | 42 + frontends/dnet-is-application/README.md | 27 + frontends/dnet-is-application/angular.json | 102 + .../dnet-is-application/package-lock.json | 11986 ++++++++++++++++ frontends/dnet-is-application/package.json | 40 + .../src/app/app-routing.module.ts | 13 + .../src/app/app.component.css | 0 .../src/app/app.component.html | 5 + .../src/app/app.component.spec.ts | 35 + .../src/app/app.component.ts | 12 + .../dnet-is-application/src/app/app.module.ts | 58 + .../src/app/datafilter.pipe.spec.ts | 8 + .../src/app/datafilter.pipe.ts | 22 + .../src/app/info/info.component.css | 0 .../src/app/info/info.component.html | 123 + .../src/app/info/info.component.spec.ts | 23 + .../src/app/info/info.component.ts | 75 + .../src/app/iscommon.service.spec.ts | 16 + .../src/app/iscommon.service.ts | 22 + .../main-container.component.css | 17 + .../main-container.component.html | 26 + .../main-container.component.spec.ts | 40 + .../main-container.component.ts | 21 + .../main-menu-tree.component.css | 4 + .../main-menu-tree.component.html | 36 + .../main-menu-tree.component.spec.ts | 32 + .../main-menu-tree.component.ts | 112 + .../src/app/main-menu-tree/menu-data.ts | 24 + .../src/app/model/controller.model.ts | 8 + .../dnet-is-application/src/assets/.gitkeep | 0 frontends/dnet-is-application/src/favicon.ico | Bin 0 -> 948 bytes frontends/dnet-is-application/src/index.html | 16 + frontends/dnet-is-application/src/main.ts | 7 + .../dnet-is-application/src/proxy.conf.json | 6 + frontends/dnet-is-application/src/styles.css | 16 + .../dnet-is-application/tsconfig.app.json | 14 + frontends/dnet-is-application/tsconfig.json | 33 + .../dnet-is-application/tsconfig.spec.json | 14 + 39 files changed, 13051 insertions(+) create mode 100644 frontends/dnet-is-application/.editorconfig create mode 100644 frontends/dnet-is-application/.gitignore create mode 100644 frontends/dnet-is-application/README.md create mode 100644 frontends/dnet-is-application/angular.json create mode 100644 frontends/dnet-is-application/package-lock.json create mode 100644 frontends/dnet-is-application/package.json create mode 100644 frontends/dnet-is-application/src/app/app-routing.module.ts create mode 100644 frontends/dnet-is-application/src/app/app.component.css create mode 100644 frontends/dnet-is-application/src/app/app.component.html create mode 100644 frontends/dnet-is-application/src/app/app.component.spec.ts create mode 100644 frontends/dnet-is-application/src/app/app.component.ts create mode 100644 frontends/dnet-is-application/src/app/app.module.ts create mode 100644 frontends/dnet-is-application/src/app/datafilter.pipe.spec.ts create mode 100644 frontends/dnet-is-application/src/app/datafilter.pipe.ts create mode 100644 frontends/dnet-is-application/src/app/info/info.component.css create mode 100644 frontends/dnet-is-application/src/app/info/info.component.html create mode 100644 frontends/dnet-is-application/src/app/info/info.component.spec.ts create mode 100644 frontends/dnet-is-application/src/app/info/info.component.ts create mode 100644 frontends/dnet-is-application/src/app/iscommon.service.spec.ts create mode 100644 frontends/dnet-is-application/src/app/iscommon.service.ts create mode 100644 frontends/dnet-is-application/src/app/main-container/main-container.component.css create mode 100644 frontends/dnet-is-application/src/app/main-container/main-container.component.html create mode 100644 frontends/dnet-is-application/src/app/main-container/main-container.component.spec.ts create mode 100644 frontends/dnet-is-application/src/app/main-container/main-container.component.ts create mode 100644 frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.css create mode 100644 frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.html create mode 100644 frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.spec.ts create mode 100644 frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts create mode 100644 frontends/dnet-is-application/src/app/main-menu-tree/menu-data.ts create mode 100644 frontends/dnet-is-application/src/app/model/controller.model.ts create mode 100644 frontends/dnet-is-application/src/assets/.gitkeep create mode 100644 frontends/dnet-is-application/src/favicon.ico create mode 100644 frontends/dnet-is-application/src/index.html create mode 100644 frontends/dnet-is-application/src/main.ts create mode 100644 frontends/dnet-is-application/src/proxy.conf.json create mode 100644 frontends/dnet-is-application/src/styles.css create mode 100644 frontends/dnet-is-application/tsconfig.app.json create mode 100644 frontends/dnet-is-application/tsconfig.json create mode 100644 frontends/dnet-is-application/tsconfig.spec.json diff --git a/frontends/dnet-is-application/.editorconfig b/frontends/dnet-is-application/.editorconfig new file mode 100644 index 00000000..59d9a3a3 --- /dev/null +++ b/frontends/dnet-is-application/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/frontends/dnet-is-application/.gitignore b/frontends/dnet-is-application/.gitignore new file mode 100644 index 00000000..0711527e --- /dev/null +++ b/frontends/dnet-is-application/.gitignore @@ -0,0 +1,42 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db diff --git a/frontends/dnet-is-application/README.md b/frontends/dnet-is-application/README.md new file mode 100644 index 00000000..261033f0 --- /dev/null +++ b/frontends/dnet-is-application/README.md @@ -0,0 +1,27 @@ +# DnetIsApplication + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 15.1.1. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application 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. + +## 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 a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. diff --git a/frontends/dnet-is-application/angular.json b/frontends/dnet-is-application/angular.json new file mode 100644 index 00000000..445feeb1 --- /dev/null +++ b/frontends/dnet-is-application/angular.json @@ -0,0 +1,102 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "dnet-is-application": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/dnet-is-application", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": [ + "zone.js" + ], + "tsConfig": "tsconfig.app.json", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "@angular/material/prebuilt-themes/indigo-pink.css", + "src/styles.css" + ], + "scripts": [ + ] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "browserTarget": "dnet-is-application:build:production" + }, + "development": { + "browserTarget": "dnet-is-application:build:development", + "proxyConfig": "src/proxy.conf.json" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "dnet-is-application:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "polyfills": [ + "zone.js", + "zone.js/testing" + ], + "tsConfig": "tsconfig.spec.json", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "@angular/material/prebuilt-themes/indigo-pink.css", + "src/styles.css" + ], + "scripts": [] + } + } + } + } + } +} diff --git a/frontends/dnet-is-application/package-lock.json b/frontends/dnet-is-application/package-lock.json new file mode 100644 index 00000000..0bd0e7ab --- /dev/null +++ b/frontends/dnet-is-application/package-lock.json @@ -0,0 +1,11986 @@ +{ + "name": "dnet-is-application", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dnet-is-application", + "version": "0.0.0", + "dependencies": { + "@angular/animations": "^15.1.0", + "@angular/cdk": "^15.1.1", + "@angular/common": "^15.1.0", + "@angular/compiler": "^15.1.0", + "@angular/core": "^15.1.0", + "@angular/forms": "^15.1.0", + "@angular/material": "^15.1.1", + "@angular/platform-browser": "^15.1.0", + "@angular/platform-browser-dynamic": "^15.1.0", + "@angular/router": "^15.1.0", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.12.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^15.1.1", + "@angular/cli": "~15.1.1", + "@angular/compiler-cli": "^15.1.0", + "@types/jasmine": "~4.3.0", + "jasmine-core": "~4.5.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.0.0", + "typescript": "~4.9.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "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.1501.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1501.1.tgz", + "integrity": "sha512-2uDa/+nVGwQ5X6UJtB14V37SbD/64WSg0hKyX5z1yp6wYrSuk7PWV8hddIsiYM3aIT5wTGqfLil6NkV4G/BzQw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "15.1.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-devkit/architect/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.1.1.tgz", + "integrity": "sha512-9eziOA4uZwIg8OYjebkKz/yqQ1WIqajGrXr/goaAKcKhr8BprWXs5NhkIzMrELekA/dZOkR6Gpwz8d/XwplCww==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.2.0", + "@angular-devkit/architect": "0.1501.1", + "@angular-devkit/build-webpack": "0.1501.1", + "@angular-devkit/core": "15.1.1", + "@babel/core": "7.20.12", + "@babel/generator": "7.20.7", + "@babel/helper-annotate-as-pure": "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.7", + "@babel/template": "7.20.7", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "15.1.1", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.13", + "babel-loader": "9.1.2", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "4.21.4", + "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.16.17", + "glob": "8.0.3", + "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.27.0", + "mini-css-extract-plugin": "2.7.2", + "open": "8.4.0", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "6.0.1", + "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.57.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.1", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.4.1", + "webpack": "5.75.0", + "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.16.17" + }, + "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-angular/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/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==", + "dev": true + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1501.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1501.1.tgz", + "integrity": "sha512-b2Vyhx3JRHi179kSB/zc7G+/uuWq7S/7pZAau0Ry17N6Ihg2BwpLxBe0mvKcDecLmw+1ozBv2WLRCnxKXLZ4mw==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1501.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" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/core": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.1.1.tgz", + "integrity": "sha512-wss76zfw4oPHs+Dd0OIbLv8os/BXDkDErj9hCjBbycQN768EqF8z7EBNGy6SKHYhmfXJy9REUkEgt9qPMJb4CQ==", + "dev": true, + "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/core/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/schematics": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.1.1.tgz", + "integrity": "sha512-ullwoxFT9aMhQR2aNwb/66A6l4HTgp4I6thbBywt86nn+ZGbJCzLKRdv2vmYh9JaxZYh1pydxWjKLEUdlycKXg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "15.1.1", + "jsonc-parser": "3.2.0", + "magic-string": "0.27.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-devkit/schematics/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular/animations": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-15.1.0.tgz", + "integrity": "sha512-uBw1iQVJ3QS5e/gypsD7M50O//9GvpphgGqt9ZClknyD8dxO/YryEB+Kt4GNvNQxRKhRTksD8r4KaodukdQ15w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.1.0" + } + }, + "node_modules/@angular/cdk": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-15.1.1.tgz", + "integrity": "sha512-99zaW+EqS/pJh2BLxC+L+/mAyaC3oncRUqRL4WWLENZI2lqD6mCe/kRYDL57WbSZaI54Of38u9GhkBVA/0rn7A==", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^7.1.2" + }, + "peerDependencies": { + "@angular/common": "^15.0.0 || ^16.0.0", + "@angular/core": "^15.0.0 || ^16.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cdk/node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "optional": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@angular/cdk/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "optional": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/@angular/cli": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-15.1.1.tgz", + "integrity": "sha512-539I3B5yTasaX/EQrXZyXOc9eZUyVBxMWiGj3/bmlCsft7/Y8J+A92uftjxIO4P8lYWzSdSxFT3Bu1zI1b6yzw==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1501.1", + "@angular-devkit/core": "15.1.1", + "@angular-devkit/schematics": "15.1.1", + "@schematics/angular": "15.1.1", + "@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.0", + "ora": "5.4.1", + "pacote": "15.0.8", + "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.1.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-15.1.0.tgz", + "integrity": "sha512-O0JKOeJ7dFcd/mnnfm4xQOYTAc+yL+OrRpGte7z84lKPU2fupLpGW/30tHUy1TXixsANyTLC3cTVXTY5szPdqg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.1.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-15.1.0.tgz", + "integrity": "sha512-+ky5Cvgps725Q/KdgsYzi/fe9LbT5ujhZoT9N5k+tYTJsepMUrpExFwMFkWrdMUYTK7DaxC9ufjZ4WZmHVhFoA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.1.0" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.1.0.tgz", + "integrity": "sha512-mKeXolM/plP9ebkHy3YGxHx0Yg63d09S0QCpdIcmvrbJpaPeM2D1SAkbDpO46T4BsfgfWHtSYByb5JcesrYrpQ==", + "dev": true, + "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.1.0", + "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==", + "dev": 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/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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/core": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.1.0.tgz", + "integrity": "sha512-HiwctuR73MuLoLeP35j9xF8/SIg7ELx+iHZtp/TBfoH+LOmjWbdrAdVAPTbqnxvK0aJG+527dhgC6tBOXgBTcg==", + "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" + } + }, + "node_modules/@angular/forms": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-15.1.0.tgz", + "integrity": "sha512-MUAbruJng0iG/cHhCkDNrh31Y54upgBUjjkE4DnoHv138Wa7vba+GMYv2tTrs4rPWnB9vPziZgI0xIi/oSGxzg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.1.0", + "@angular/core": "15.1.0", + "@angular/platform-browser": "15.1.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/material": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-15.1.1.tgz", + "integrity": "sha512-QhyTJv9CnimXKXb4LCH93ovJVAdnoHyElwspl80PcfAV/6A6VrRQAflFoul0WL4WPrV50DG7TWYiEwHPpblbCw==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/auto-init": "15.0.0-canary.684e33d25.0", + "@material/banner": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/button": "15.0.0-canary.684e33d25.0", + "@material/card": "15.0.0-canary.684e33d25.0", + "@material/checkbox": "15.0.0-canary.684e33d25.0", + "@material/chips": "15.0.0-canary.684e33d25.0", + "@material/circular-progress": "15.0.0-canary.684e33d25.0", + "@material/data-table": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dialog": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/drawer": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/fab": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/floating-label": "15.0.0-canary.684e33d25.0", + "@material/form-field": "15.0.0-canary.684e33d25.0", + "@material/icon-button": "15.0.0-canary.684e33d25.0", + "@material/image-list": "15.0.0-canary.684e33d25.0", + "@material/layout-grid": "15.0.0-canary.684e33d25.0", + "@material/line-ripple": "15.0.0-canary.684e33d25.0", + "@material/linear-progress": "15.0.0-canary.684e33d25.0", + "@material/list": "15.0.0-canary.684e33d25.0", + "@material/menu": "15.0.0-canary.684e33d25.0", + "@material/menu-surface": "15.0.0-canary.684e33d25.0", + "@material/notched-outline": "15.0.0-canary.684e33d25.0", + "@material/radio": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/segmented-button": "15.0.0-canary.684e33d25.0", + "@material/select": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/slider": "15.0.0-canary.684e33d25.0", + "@material/snackbar": "15.0.0-canary.684e33d25.0", + "@material/switch": "15.0.0-canary.684e33d25.0", + "@material/tab": "15.0.0-canary.684e33d25.0", + "@material/tab-bar": "15.0.0-canary.684e33d25.0", + "@material/tab-indicator": "15.0.0-canary.684e33d25.0", + "@material/tab-scroller": "15.0.0-canary.684e33d25.0", + "@material/textfield": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tooltip": "15.0.0-canary.684e33d25.0", + "@material/top-app-bar": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/animations": "^15.0.0 || ^16.0.0", + "@angular/cdk": "15.1.1", + "@angular/common": "^15.0.0 || ^16.0.0", + "@angular/core": "^15.0.0 || ^16.0.0", + "@angular/forms": "^15.0.0 || ^16.0.0", + "@angular/platform-browser": "^15.0.0 || ^16.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.1.0.tgz", + "integrity": "sha512-yuJweAR+rJhWWHM4Im3Iy6S4+W3OtcVHijcqrxfVxiA9ZHbDw/jpYDi06ZZIgfnNyGWi5/BzJbHvxH3b0lAo5Q==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/animations": "15.1.0", + "@angular/common": "15.1.0", + "@angular/core": "15.1.0" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.1.0.tgz", + "integrity": "sha512-ukyycXkuu4Ah/35cbN4pEB91D2PK5eZVbJ+liCD6uRb4UI3X+QVg6Qz6MoIctVAlTV6tWK20T81zoux9SzWKsg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.1.0", + "@angular/compiler": "15.1.0", + "@angular/core": "15.1.0", + "@angular/platform-browser": "15.1.0" + } + }, + "node_modules/@angular/router": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-15.1.0.tgz", + "integrity": "sha512-78ItVVXOYdu/RRxruHwSmtNxEP2clx+afHKrkwc4e7/6uxVr4rl0VQhO6qHYme/bBtbLIcBZGJoSyoUg/xUSvQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.1.0", + "@angular/core": "15.1.0", + "@angular/platform-browser": "15.1.0", + "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==", + "dev": true + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", + "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", + "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.2.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", + "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "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==", + "dev": true, + "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.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "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==", + "dev": true, + "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.20.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", + "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "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==", + "dev": true, + "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.20.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", + "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", + "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", + "dev": true, + "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==", + "dev": true, + "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.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", + "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.5", + "@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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", + "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "dev": true, + "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-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==", + "dev": true, + "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==", + "dev": true, + "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.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz", + "integrity": "sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==", + "dev": true, + "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.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", + "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", + "dev": true, + "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.19.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.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", + "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@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.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", + "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "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-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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", + "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", + "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "dev": true, + "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==", + "dev": true, + "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.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", + "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dev": true, + "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-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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/runtime": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", + "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", + "dev": true, + "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==", + "dev": true, + "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.20.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", + "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@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==", + "dev": 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==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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/@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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "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.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "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==", + "dev": true + }, + "node_modules/@material/animation": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-5osi1z4JQIXcklPALbH/zTfOm2pDzHt9Fxm7ZyURy250xIZj6QjULRzPTnzOhC2ropfix9ra2Cfggbf0dcRbEQ==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/auto-init": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-OigQTmrVzkcGvxNjOaIe5oItTFPgrO9xLewvharDI6m6yvO1z7OBnkcW+sFN6ggLNYNxd0O1u9v64vMsmeDABQ==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/banner": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-PqtGp3KWzdu58rWv/DIvSfe38m5YKOBbAAbBinSvgadBb/da+IE1t5F7YPNKE1T5lJsQBGVUYx6QBIeXm+aI/A==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/button": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/base": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-oOaqb/SfjWwTKsdJUZmeh/Qrs41nIJI0N+zELsxnvbGjSIN1ZMAKYZFPMahqvC68OJ6+5CvJM8PoTNs5l+B8IQ==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/button": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-Nkekk4edeX+ObVOa7UlwavaHdmckPV5wU4SAJf3iA3R61cmz+KsgAgpzfcwv5WfNhIlc2nLu8QYEecpHdo9d/w==", + "dependencies": { + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/card": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-xhyB7XX5KkEiCEqwSPkl58ZGYL6xFdnY62zimyBXJRG/Eaa0Swj3kW20hVCpt4f7c9Zmp8Se27rg8vnKmhvO3g==", + "dependencies": { + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/checkbox": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-NFpM3TS924PmVsk2KQLNU95OYCf8ZwYgzeqfnAexU0bEfjUJXINBun2Go0AaeOUMjuvWUe+byjrXgv8SFYbMUA==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/chips": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-z4ajQ4NnsAQ/Si9tZ4xmxzjj2Qb+vW++4QjCjjjwAGIZbCe0xglAnMh2t66XLJUxt7RoKZuZVEO7ZqcFZpvJFQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/checkbox": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/circular-progress": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-G6qD0nGNtEUwWnAMJuA9INYFpZoKtx7KFjBaPF4Ol2YLHtmShALNAYyn54TMAK8AZ2IpW08PXjGS7Ye88vrdEQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/progress-indicator": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/data-table": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-+wDw1DDDFfAsKAMzs84f/5GCjux39zjNfW8tL4wFbkWNwewmQrG9zaQMJhBpVOtLCrM8Gj6SOgOANqgqoCjvGg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/checkbox": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/icon-button": "15.0.0-canary.684e33d25.0", + "@material/linear-progress": "15.0.0-canary.684e33d25.0", + "@material/list": "15.0.0-canary.684e33d25.0", + "@material/menu": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/select": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/density": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-661yEVRMGrlq6S6WuSbPRO+ZwpdUOg2glCc7y96doM6itSLOa3UEAldjOLfsYZVB74GnKCiuDp//QmfoRyYTfA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/dialog": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-szn0dHnfeQTSOC6SSRSGAzX6Tnx+4NnSMUwNkXm+3bwjds8ZVK26+DXwLrP5f3ID5F1K5sFsRf2INo5/TNTHyQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/button": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/icon-button": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/dom": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-7pEJLYov+tGgfuD8mZxoVU6rWtPI8ppjTAhz+F27Hz9FG0JETMWTKpDPBXLnKvX7vhIxL83GvZ9geNHCe8Hfog==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/drawer": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-/KMckLf1PYU/H3PXnS4e0aFl03qG3JlSv4LGgX6juJufcONqGTl/m63EMO/L/eUy6H1CRrXmVDjik/jzHLyDhg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/list": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/elevation": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-WDF8SsRtq3rXUbVVbd9K4DUijIPH0bUFSOreVYxudpuxAfTlDS5+aeS1EK9UIBFYLuba4u5wVT2tDv6e1RTfrQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/fab": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-KCu87rWOKEAe9vZcAm6K8XazYSWPNjMG+OhrbPjHW6bCO7as1YCgtmkBkhff7csY/rFmcVpIy884xtUfLmSudQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/feature-targeting": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-HyH1erNTSjS63sigNSUMaCd0nJhTNdDFeC+myrxwtDaQm+uYJ8troCNtQM3g6mx0XATNtX5aTOoPmrM6yVVi1A==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/floating-label": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-f7TPp6bKpGvV3sYYiZHSGlrixXKkXXITW3Esp7KB9jRq42c0H82novmdwvY0eTef4ootmA2JEysr78KQfHBUPg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/focus-ring": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-ikw2RVUfgzXChpWIzPH1VzRvTjYb5ZKj4H+CZf7jqPUXMstFOZg90Bp7ARLZHqYiyNMuUq3zUTHozS6iHorSqg==", + "dependencies": { + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0" + } + }, + "node_modules/@material/form-field": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-vpF9N/uq5no/7+8GAbEH0868FhOuBgxAWRr1Sfb+jthKfBr8OS/wPU/AHzZHdHdAm7PQynbeOXfDsX2dI//PDA==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/icon-button": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-wMI+XGzmIN/o2ePBKg2hLyx7H4pXCRAyyIKMQS1FMp1UKa2tYmiHVX/V8skhKwCqxg3i6Ls/LxMjfPxTR18WvQ==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/image-list": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-Ol+uaHYBe5R/cgzlfh5ONnMVX0wO6fV74JMUcQCQlxP6lXau/edARo4tkRc7A7UJUkU3VRv0EpEjLoCRNUPGaA==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/layout-grid": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-ALXE1mqFNb/RB2lVRQ3/r1Aufw2mFZnOjRE+boYDVepmAG/xWyPCyaGoavELJF5l4GAb0tXi8wA/8HeGbLOpuA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/line-ripple": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-7hRx8C/e9i0P6pgQpNOMfTwSS2r1fwEvBL72QDVGLtLuoKKwsjjgP6Z0Jat/GeHJe87u9LQvGBoD4upt+of/HA==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/linear-progress": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-iJclt7mKmcMk6pqD7ocXKfCWZhqBoODp7N593jYlxVpTJuEz2wiVAjZUDn/YGj/Uz3CRH+2YFfOiLr9pwWjhDg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/progress-indicator": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/list": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-rQ+FCSdzmwTcT00IYE0uRV3CS4oGSccKFl9hkcF+aHFW61L7ORh/SCGUDPrEfQFrFkMn5f8qroVJjpUAMXBz4g==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/menu": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-r7wzDLSGSI9629/mfpvsMzkVxpmV75kcD3IrW0Pcu6/Bv/1xi0EvjcUXzNJJoQlwN4Zj35Ymz/PCjZkIDIz68Q==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/list": "15.0.0-canary.684e33d25.0", + "@material/menu-surface": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/menu-surface": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-RVO5GAYcfWPaKwxsF/NhUAmrYXQCQBKvRQW0TIlbmAJz6lcFeTs6YZqF3u1C7qrL3ZQGz+sur/7ywj6QU0oMow==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/notched-outline": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-9YHcBkvJLPVYzkHcWoTpBZAFrEd+j1hjhGxLhh0LuNrZe8VroUkZD1TTnUAPHRG3os6EqEWWaKb0RN+aPIF2yQ==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/floating-label": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/progress-indicator": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-c0icji4faeNWUoqGENGC7Hav0Puxh0RwXIDVizffaUxKIGbajpIp5+4Zop73fK/xFLGMB/npg7TbP+aCGjQ3fw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/radio": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-U3Eh8sNUA8trDla1Bq8Bo02foxYvtoewaKeF8A8tAju81XZ4jRiftfOsOWZDZEHCVbbCB2QwvutvFlnay5n+Aw==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/ripple": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-RyePu7SjIm/OuyyEieZ/gxiPYkNZOZHeid72WRcN9ofdlljj2pifcdPvcfZA+v/DMS33xo5GjG2L/Qj6ClWrKw==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/rtl": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-NqdJl8Ayupp1Th+vCNCpVQHbUFOuF7TCte9LD1norTIBUF/QizIxWby2W5uUEiPbnh5j9PmE1CJtfLwKun3pcw==", + "dependencies": { + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/segmented-button": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-bEGgg8vgXNLyukyV8HRjFMuQ6t6nm5LQ4Pgm22um61Yc8qyi0BOqV41OR4SVdUrUqZxh1aVD+p+4NN03+LfQXw==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/select": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-kf178/2TeEinTv0mgmSBcmmExQ2h7a7dtR1E3WuqQgisJ/R6+zVLMkC2CnfIyzxYX2vkuUTG0ue3Reh/6XiqSg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/floating-label": "15.0.0-canary.684e33d25.0", + "@material/line-ripple": "15.0.0-canary.684e33d25.0", + "@material/list": "15.0.0-canary.684e33d25.0", + "@material/menu": "15.0.0-canary.684e33d25.0", + "@material/menu-surface": "15.0.0-canary.684e33d25.0", + "@material/notched-outline": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/shape": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-aEelpaTFmpnCji3TUGP9bVCS/bRVjUmLTHBPZtuu1gOrUVVtJ6kYOg73dZNJF+XOoNL2yOX/LRcKwsop29tptA==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/slider": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-WVyK+2pSNSZmj07M2K/a3TADoQ9FBCndfNC/vE7/wGIg4dddJJK5KvQ+yruf9R2cSzTL/S1sZ5WpyyeM8E9HTw==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/snackbar": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-itO+DCkOannZzR1/cCHcqAm7ifhuFvXmDItNoA8qLEcAyJDJJRkhpwj3XQ01yuo9gBFcSctp7Txt7e+Hncm/Jg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/button": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/icon-button": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/switch": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-Jxi0gl92yvvZZsAPxvVHzXx2ga+T/djMow98jvEczmpUorWnAhgiCr9CsSSRoosahWyRB8NLZOxUQrACxvffjw==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-WQL3wj9syHNcfe8KbgGGUcA34M8C/xZ+n0Fkkh8Kk6puVwaU+xqUNihsxPY6YzKpmh4PZ4oJaBdiN8zvFT1zqQ==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/tab-indicator": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-bar": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-SW/cMaDsIGGkM1ag3A7GJRlmr8eXmObWsvitQJzh6Azr5zzZtSI+GQygkMesAEE1gbpqOVN8d40rh3H7VVIAcA==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/tab": "15.0.0-canary.684e33d25.0", + "@material/tab-indicator": "15.0.0-canary.684e33d25.0", + "@material/tab-scroller": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-indicator": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-kKICqSPqOlaf0lzaFFCmuOqPXJC+cK48Qmsc+m5o6fJhkmuZRCYpIwB2JeP+uZSOq/bTH+SrPtCtnVlgWg6ksA==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-scroller": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-H6EU/TSiK/M2DyyORX5GEtXD9rKYxTMHC2VxsNWARPMFJGzgeW2ugYkFv+rKI1/c0bs0CJ4e+qFnOlBsQXZvyQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/tab": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/textfield": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-OvgpDXjvpyJTtAWskO69IDybFvDNzr9w2PN/Fk7yFm+uNVupaWz1Ew8lZ4gGslaTNSVmh2XcsvmzxcLINSiiNg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/floating-label": "15.0.0-canary.684e33d25.0", + "@material/line-ripple": "15.0.0-canary.684e33d25.0", + "@material/notched-outline": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/theme": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-AZxaXXAvRKzAi20RlMxzt2U5UmkCWyv7DMWEBXsxtG5Tk54mi1HsbVUp3fxDPTlmL7Pq8p1/DESg/o7TgRCVlw==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tokens": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-wVwbQOTCXDPKYPdHQHLr026y36MMFelID1CmbfRk6mSol4O8yE9U0fXcShfRDW8Qo5E3X31w9c2A6T3neJY7wQ==", + "dependencies": { + "@material/elevation": "15.0.0-canary.684e33d25.0" + } + }, + "node_modules/@material/tooltip": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-dtm26QjxyQdinc8btgz6yys07b7bUW4FZgNF2EBPeGrICrPg7jf+JEvDziz5g8VMaTBQLOQRSCGy0MKuRlOjLw==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/button": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/top-app-bar": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-1M+oupUxflfW7u81P1XlxoLZB8bLzwtpKofIfDNRbEsiKhlLTERJR3Yak3BGE9xakNMysAaBHlkb5MrN5bNPFw==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/touch-target": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-zdE69Slg8+T7sTn1OwqZ6H7WBYac9mxJ/JlJqfTqthzIjZRcCxBSYymQJcDHjsrPnUojOtr9U4Tpm5YZ96TEkQ==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/typography": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-aVnvgMwcfNa/K4wujzpKDIxjGl2hbkEL+m+OKDSQqWYjKcP9QrbzCXJruJBqxrBoPRHLbqo47k5f9uT8raSgjw==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@ngtools/webpack": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.1.1.tgz", + "integrity": "sha512-pHkVE4IfIGcrIqxxrBQJV62GBqXF+LU4sPY5MLNWIfKSctW6AdTVoO9ilx8pclaFJkMLkPMbrmfGosYw47L+lg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.3.tgz", + "integrity": "sha512-8cXNkDIbnXPVbhXMmQ7/bklCAjtmPaXfI9aEM4iH+xSuEHINLMHhlfESvVwdqmHJRJkR48vNJTSUvoF6GRPSFA==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.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.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/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/git/node_modules/which": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "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.1", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.1.tgz", + "integrity": "sha512-GIykAFdOVK31Q1/zAtT5MbxqQL2vyl9mvFJv+OGu01zxbhL3p0xc8gJjdNGX1mWmUT43aEKVO2L6V/2j4TOsAA==", + "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.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "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.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.0.tgz", + "integrity": "sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ==", + "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.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "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/@schematics/angular": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-15.1.1.tgz", + "integrity": "sha512-Ujo4vt/r3WzIhGn2I2Lt3eOTWSsVxoXfcXxFRuxl3cil/9mH1X66hDTQ2DVYiXPFGcQMjcNaDwlQxyor4yGbqA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "15.1.1", + "@angular-devkit/schematics": "15.1.1", + "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/@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==", + "dev": 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/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "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==", + "dev": 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==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", + "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.31", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.32", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz", + "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.1.tgz", + "integrity": "sha512-Vu8l+UGcshYmV1VWwULgnV/2RDbBaO6i2Ptx7nd//oJPIZGhoI1YLST4VKagD2Pq/Bc2/7zvtvhM7F3p4SN7kQ==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/agentkeepalive/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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/babel-loader": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": 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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "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==", + "dev": true, + "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/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==", + "dev": 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==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", + "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001445", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001445.tgz", + "integrity": "sha512-8sdQIdMztYmzfTMO6KfLny878Ln9c2M0fc7EH60IjlP4Dc4PiCy7K2Vl3ITmWgOyPgVQKa5x+UP/KqFsxj4mBg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "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==", + "dev": true + }, + "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.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": 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==", + "dev": true, + "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==", + "dev": 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==", + "dev": 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==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": 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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.1.tgz", + "integrity": "sha512-Dg91JFeCDA17FKnneN7oCMz4BkQ4TcffkgHP4OWwp9yx3pi7ubqMDXXSacfNak1PQqjc95skyt+YBLHQJnkJwA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4" + }, + "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==", + "dev": true + }, + "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==", + "dev": 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==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/critters": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "dev": true, + "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==", + "dev": true, + "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-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": 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==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": 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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "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==", + "dev": true, + "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.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", + "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", + "dev": 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.2.3" + }, + "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==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.16.17.tgz", + "integrity": "sha512-Tn7NuMqRcM+T/qCOxbQRq0qrwWl1sUWp6ARfJRakE8Bepew6zata4qrKgH2YqovNC5e/2fcTa7o+VL/FAOZC1Q==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": 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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": 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==", + "dev": 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==", + "dev": 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==", + "dev": 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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": 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.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.0.tgz", + "integrity": "sha512-EUojgQaSPy6sxcqcZgQv6TVF6jiKvurji3AxhAivs/Ep4O1UpS8TusaxpybfFHZ2skRhLqzk6WR8nqNYIMMDeA==", + "dev": true, + "dependencies": { + "minipass": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, + "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.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-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==", + "dev": true, + "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==", + "dev": true + }, + "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.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "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==", + "dev": true, + "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.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "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==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.0.tgz", + "integrity": "sha512-bTf9UWe/UP1yxG3QUrj/KOvEhTAUWPcv+WvbFZ28LcqznXabp7Xu6o9y1JEC18+oqODuS7VhTpekV5XvFwsxJg==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz", + "integrity": "sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "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==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": 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==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "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/jasmine-core": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", + "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", + "dev": true + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": 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.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz", + "integrity": "sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA==", + "dev": 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-coverage": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.0.tgz", + "integrity": "sha512-gPVdoZBNDZ08UCzdMHHhEImKrw1+PAOQOIiffv1YsvxFhBjqvo/SVXNk4tqn1SYqX0BJZT6S/59zgxiBe+9OuA==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-coverage/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma-coverage/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "dev": true, + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.0.0.tgz", + "integrity": "sha512-SB8HNNiazAHXM1vGEzf8/tSyEhkfxuDdhYdPBX2Mwgzt0OuF2gicApQ+uvXLID/gXyJQgvrM9+1/2SxZFUUDIA==", + "dev": true, + "peerDependencies": { + "jasmine-core": "^4.0.0", + "karma": "^6.0.0", + "karma-jasmine": "^5.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/karma/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/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==", + "dev": 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==", + "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/karma/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/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==", + "dev": 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==", + "dev": 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==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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==", + "dev": 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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.7.1.tgz", + "integrity": "sha512-lzbd0Eq1HRdWM2abSD7mk6YIVY0AogGJzb/z+lqzRk+8+XJP+M6L1MS5FUSc3jjGru4dbKjEMJmqlsoYYpuivQ==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.3" + }, + "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==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "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.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", + "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": 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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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/minipass/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/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-gyp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-releases": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.0.0.tgz", + "integrity": "sha512-SBU9oFglRVZnfElwAtF14NivyulDqF1VKqqwNsFW9HDcbHMAPHpRSsVFgKuwFGq/hVvWZExz62Th0kvxn/XE7Q==", + "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.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz", + "integrity": "sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q==", + "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.3", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.3.tgz", + "integrity": "sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^4.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.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.2.tgz", + "integrity": "sha512-5n/Pq41w/uZghpdlXAY5kIM85RgJThtTH/NYBRAZ9VUOBWV90USaQjwGrw76fZP3Lj5hl/VZjpVvOaRBMoL/2w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.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": "^4.0.0", + "minipass-collect": "^1.0.2", + "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-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.1.tgz", + "integrity": "sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==", + "dev": true, + "dependencies": { + "minipass": "^4.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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": 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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "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/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pacote": { + "version": "15.0.8", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.0.8.tgz", + "integrity": "sha512-UlcumB/XS6xyyIMwg/WwMAyUmga+RivB5KgkRwA1hZNtrx+0Bt41KxHCvg1kr0pZ/ZeD8qjhW4fph6VaYRCbLw==", + "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", + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.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==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": 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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "optional": true + }, + "node_modules/punycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.2.0.tgz", + "integrity": "sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw==", + "dev": true, + "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==", + "dev": 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==", + "dev": true, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dev": 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.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.0.tgz", + "integrity": "sha512-b/9jxWJ8EwogJPpv99ma+QwtqB7FSl3+V6UXS7Aaay8/5VwMY50oIFooY1UKXMWpfNCM6T/PoGqa5GD1g9xf9w==", + "dev": true, + "dependencies": { + "glob": "^8.0.1", + "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/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/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/regexpu-core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", + "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": 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==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/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/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/safevalues": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.3.4.tgz", + "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" + }, + "node_modules/sass": { + "version": "1.57.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz", + "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "optional": true + }, + "node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.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==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "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.5.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz", + "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.1", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", + "dev": true + }, + "node_modules/socket.io-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", + "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", + "dev": 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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "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.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "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==", + "dev": true, + "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==", + "dev": true, + "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.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/ssri": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.1.tgz", + "integrity": "sha512-WVy6di9DlPOeBWEjMScpNipeSX2jIZBGEn5Uuo8Q7aIuFEuDX0pw8RxcOjlD1TWP4obi24ki7m/13+nFpcbXrw==", + "dev": true, + "dependencies": { + "minipass": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.4.tgz", + "integrity": "sha512-Ha1Ccw2/N5C/IF8Do6zgNe8F3jQo8MPBnMBGvX0QjNv/I97BcNRzK6/mzOpZHHK7DjMLTI3c7Xw7Y1KvdChkvw==", + "dev": 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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/terser": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "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/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==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/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==", + "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/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/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==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", + "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", + "dev": 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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": 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==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": 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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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-dev-server/node_modules/ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "dev": true, + "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/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "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==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "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/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.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/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==", + "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/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/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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/zone.js": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.12.0.tgz", + "integrity": "sha512-XtC+I5dXU14HrzidAKBNMqneIVUykLEAA1x+v4KVrd6AUPWlwYORF8KgsVqvgdHiKZ4BkxxjvYi/ksEixTPR0Q==", + "dependencies": { + "tslib": "^2.3.0" + } + } + } +} diff --git a/frontends/dnet-is-application/package.json b/frontends/dnet-is-application/package.json new file mode 100644 index 00000000..f0f93764 --- /dev/null +++ b/frontends/dnet-is-application/package.json @@ -0,0 +1,40 @@ +{ + "name": "dnet-is-application", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test" + }, + "private": true, + "dependencies": { + "@angular/animations": "^15.1.0", + "@angular/cdk": "^15.1.1", + "@angular/common": "^15.1.0", + "@angular/compiler": "^15.1.0", + "@angular/core": "^15.1.0", + "@angular/forms": "^15.1.0", + "@angular/material": "^15.1.1", + "@angular/platform-browser": "^15.1.0", + "@angular/platform-browser-dynamic": "^15.1.0", + "@angular/router": "^15.1.0", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.12.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^15.1.1", + "@angular/cli": "~15.1.1", + "@angular/compiler-cli": "^15.1.0", + "@types/jasmine": "~4.3.0", + "jasmine-core": "~4.5.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.0.0", + "typescript": "~4.9.4" + } +} diff --git a/frontends/dnet-is-application/src/app/app-routing.module.ts b/frontends/dnet-is-application/src/app/app-routing.module.ts new file mode 100644 index 00000000..eed5d44a --- /dev/null +++ b/frontends/dnet-is-application/src/app/app-routing.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { InfoComponent } from './info/info.component'; + +const routes: Routes = [ + {path:"info", component:InfoComponent} +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule] +}) +export class AppRoutingModule { } diff --git a/frontends/dnet-is-application/src/app/app.component.css b/frontends/dnet-is-application/src/app/app.component.css new file mode 100644 index 00000000..e69de29b diff --git a/frontends/dnet-is-application/src/app/app.component.html b/frontends/dnet-is-application/src/app/app.component.html new file mode 100644 index 00000000..69ad4098 --- /dev/null +++ b/frontends/dnet-is-application/src/app/app.component.html @@ -0,0 +1,5 @@ + + + + + diff --git a/frontends/dnet-is-application/src/app/app.component.spec.ts b/frontends/dnet-is-application/src/app/app.component.spec.ts new file mode 100644 index 00000000..32f1f92c --- /dev/null +++ b/frontends/dnet-is-application/src/app/app.component.spec.ts @@ -0,0 +1,35 @@ +import { TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + RouterTestingModule + ], + declarations: [ + AppComponent + ], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title 'dnet-is-application'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('dnet-is-application'); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('.content span')?.textContent).toContain('dnet-is-application app is running!'); + }); +}); diff --git a/frontends/dnet-is-application/src/app/app.component.ts b/frontends/dnet-is-application/src/app/app.component.ts new file mode 100644 index 00000000..c5d87ed9 --- /dev/null +++ b/frontends/dnet-is-application/src/app/app.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { TitleStrategy } from '@angular/router'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] +}) +export class AppComponent { + title = 'dnet-is-application'; + +} diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts new file mode 100644 index 00000000..460ffe7b --- /dev/null +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -0,0 +1,58 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; + +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; +import { FormsModule } from '@angular/forms'; +import { HttpClientModule } from '@angular/common/http'; +import { InfoComponent } from './info/info.component'; +import { DatafilterPipe } from './datafilter.pipe'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { LayoutModule } from '@angular/cdk/layout'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatButtonModule } from '@angular/material/button'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import {FlatTreeControl} from '@angular/cdk/tree'; +import {MatTree, MatTreeFlatDataSource, MatTreeFlattener, MatTreeNode, MatTreeModule} from '@angular/material/tree'; +import { MainContainerComponent } from './main-container/main-container.component'; +import { MainMenuTreeComponent } from './main-menu-tree/main-menu-tree.component'; +import { MatBadgeModule } from '@angular/material/badge'; +import { MatCardModule } from '@angular/material/card'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatInputModule} from '@angular/material/input' +import {MatTableModule} from '@angular/material/table'; + + +@NgModule({ + declarations: [ + AppComponent, + InfoComponent, + DatafilterPipe, + MainContainerComponent, + MainMenuTreeComponent + ], + imports: [ + BrowserModule, + AppRoutingModule, + FormsModule, + HttpClientModule, + NoopAnimationsModule, + LayoutModule, + MatToolbarModule, + MatButtonModule, + MatSidenavModule, + MatIconModule, + MatListModule, + MatTreeModule, + MatBadgeModule, + MatCardModule, + MatFormFieldModule, + MatInputModule, + MatTableModule + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/frontends/dnet-is-application/src/app/datafilter.pipe.spec.ts b/frontends/dnet-is-application/src/app/datafilter.pipe.spec.ts new file mode 100644 index 00000000..872c8c8a --- /dev/null +++ b/frontends/dnet-is-application/src/app/datafilter.pipe.spec.ts @@ -0,0 +1,8 @@ +import { DatafilterPipe } from './datafilter.pipe'; + +describe('DatafilterPipe', () => { + it('create an instance', () => { + const pipe = new DatafilterPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/frontends/dnet-is-application/src/app/datafilter.pipe.ts b/frontends/dnet-is-application/src/app/datafilter.pipe.ts new file mode 100644 index 00000000..2f26b1a1 --- /dev/null +++ b/frontends/dnet-is-application/src/app/datafilter.pipe.ts @@ -0,0 +1,22 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'datafilter' +}) +export class DatafilterPipe implements PipeTransform { + + transform(items: any[], searchTerm?: string) { + let filteredList: any[] = []; + if (searchTerm) { + return items.filter(item => + Object.keys(item).some(k => item[k] != null && + item[k].toString().toLowerCase() + .includes(searchTerm.toLowerCase())) + ); + } + else { + return items; + } + } + +} diff --git a/frontends/dnet-is-application/src/app/info/info.component.css b/frontends/dnet-is-application/src/app/info/info.component.css new file mode 100644 index 00000000..e69de29b diff --git a/frontends/dnet-is-application/src/app/info/info.component.html b/frontends/dnet-is-application/src/app/info/info.component.html new file mode 100644 index 00000000..e582a1c0 --- /dev/null +++ b/frontends/dnet-is-application/src/app/info/info.component.html @@ -0,0 +1,123 @@ +
+ +

Container Info

+ + + Filter + + + + + + + {{section.name}} + + + + + + + + + + + + + + + + + + + + +
Property {{element.k}} Value {{element.v}}
No data matching the filter "{{input.value}}"
+
+
+
+ + + + Modules + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Group {{element.group}} Name {{element.name}} Versions {{element.versions}} Files {{element.files}}
No data matching the filter "{{input.value}}"
+
+
+
+ + + + + + + + diff --git a/frontends/dnet-is-application/src/app/info/info.component.spec.ts b/frontends/dnet-is-application/src/app/info/info.component.spec.ts new file mode 100644 index 00000000..93617f1e --- /dev/null +++ b/frontends/dnet-is-application/src/app/info/info.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { InfoComponent } from './info.component'; + +describe('InfoComponent', () => { + let component: InfoComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ InfoComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(InfoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontends/dnet-is-application/src/app/info/info.component.ts b/frontends/dnet-is-application/src/app/info/info.component.ts new file mode 100644 index 00000000..1c617ebd --- /dev/null +++ b/frontends/dnet-is-application/src/app/info/info.component.ts @@ -0,0 +1,75 @@ +import { Component } from '@angular/core'; +import { ISCommonService } from '../iscommon.service'; +import { MatTableDataSource } from '@angular/material/table'; + +export interface KeyValue { + k: string; + v: string; +} + +export interface Module { + group: string; + name: string; + versions: string[]; + files: string[]; +} + +export interface KeyValueDatasource { + name: string; + datasource: MatTableDataSource; +} + + +@Component({ + selector: 'app-info', + templateUrl: './info.component.html', + styleUrls: ['./info.component.css'] +}) +export class InfoComponent { + infoFilter?:string; + + kvDatasources:KeyValueDatasource[] = []; + moduleDatasource:MatTableDataSource = new MatTableDataSource([]); + + displayedKVColumns: string[] = ['k', 'v']; + displayedModuleColumns: string[] = ['group', 'name', 'versions', 'files']; + + constructor(public service:ISCommonService) { + this.service.loadInfo().subscribe({ + next:(data:any[]) => { + data.forEach(section => { + if (section['name'] == 'Modules') { + this.moduleDatasource.data = section['data']; + } else { + this.kvDatasources.push({ + name: section['name'], + datasource : new MatTableDataSource(section['data']) + }); + } + }) + }, + error:error => console.log(error), + complete:()=>console.log("Completed") + }) + } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); + this.kvDatasources.forEach(s => s.datasource.filter = filterValue) + this.moduleDatasource.filter = filterValue; + } + + getFilteredInfo(data:any[]) { + if (this.infoFilter) { + return data.filter(obj => { + return Object.keys(obj).reduce((acc, curr) => { + return acc || obj[curr].toString().toLowerCase().includes(this.infoFilter); + }, false); + }) + } + else + return data + + } + +} diff --git a/frontends/dnet-is-application/src/app/iscommon.service.spec.ts b/frontends/dnet-is-application/src/app/iscommon.service.spec.ts new file mode 100644 index 00000000..06bf113e --- /dev/null +++ b/frontends/dnet-is-application/src/app/iscommon.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ISCommonService } from './iscommon.service'; + +describe('ISCommonService', () => { + let service: ISCommonService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ISCommonService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/frontends/dnet-is-application/src/app/iscommon.service.ts b/frontends/dnet-is-application/src/app/iscommon.service.ts new file mode 100644 index 00000000..1ff5af32 --- /dev/null +++ b/frontends/dnet-is-application/src/app/iscommon.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { ResourceType } from './model/controller.model'; +import { Observable, Observer } from 'rxjs'; +@Injectable({ + providedIn: 'root' +}) +export class ISCommonService { + + constructor(public client:HttpClient) { } + + + loadResourceTypes():Observable { + return this.client.get("/ajax/resourceTypes"); + } + + loadInfo():Observable { + return this.client.get("/ajax/info/"); + } + + +} diff --git a/frontends/dnet-is-application/src/app/main-container/main-container.component.css b/frontends/dnet-is-application/src/app/main-container/main-container.component.css new file mode 100644 index 00000000..ac9b3b14 --- /dev/null +++ b/frontends/dnet-is-application/src/app/main-container/main-container.component.css @@ -0,0 +1,17 @@ +.sidenav-container { + height: 100%; +} + +.sidenav { + width: 400px; +} + +.sidenav .mat-toolbar { + background: inherit; +} + +.mat-toolbar.mat-primary { + position: sticky; + top: 0; + z-index: 1; +} diff --git a/frontends/dnet-is-application/src/app/main-container/main-container.component.html b/frontends/dnet-is-application/src/app/main-container/main-container.component.html new file mode 100644 index 00000000..cd9d52b1 --- /dev/null +++ b/frontends/dnet-is-application/src/app/main-container/main-container.component.html @@ -0,0 +1,26 @@ + + + Menu + + + + + + dnet-is-application + + + + + + + diff --git a/frontends/dnet-is-application/src/app/main-container/main-container.component.spec.ts b/frontends/dnet-is-application/src/app/main-container/main-container.component.spec.ts new file mode 100644 index 00000000..552f7705 --- /dev/null +++ b/frontends/dnet-is-application/src/app/main-container/main-container.component.spec.ts @@ -0,0 +1,40 @@ +import { LayoutModule } from '@angular/cdk/layout'; +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatToolbarModule } from '@angular/material/toolbar'; + +import { MainContainerComponent } from './main-container.component'; + +describe('MainContainerComponent', () => { + let component: MainContainerComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [MainContainerComponent], + imports: [ + NoopAnimationsModule, + LayoutModule, + MatButtonModule, + MatIconModule, + MatListModule, + MatSidenavModule, + MatToolbarModule, + ] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MainContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should compile', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontends/dnet-is-application/src/app/main-container/main-container.component.ts b/frontends/dnet-is-application/src/app/main-container/main-container.component.ts new file mode 100644 index 00000000..6b7e30d4 --- /dev/null +++ b/frontends/dnet-is-application/src/app/main-container/main-container.component.ts @@ -0,0 +1,21 @@ +import { Component } from '@angular/core'; +import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; +import { Observable } from 'rxjs'; +import { map, shareReplay } from 'rxjs/operators'; + +@Component({ + selector: 'app-main-container', + templateUrl: './main-container.component.html', + styleUrls: ['./main-container.component.css'] +}) +export class MainContainerComponent { + + isHandset$: Observable = this.breakpointObserver.observe(Breakpoints.Handset) + .pipe( + map(result => result.matches), + shareReplay() + ); + + constructor(private breakpointObserver: BreakpointObserver) {} + +} diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.css b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.css new file mode 100644 index 00000000..bcf84cd4 --- /dev/null +++ b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.css @@ -0,0 +1,4 @@ +.type-icon { + color: #757575; + margin-right: 5px; +} diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.html b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.html new file mode 100644 index 00000000..e4307f5a --- /dev/null +++ b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.html @@ -0,0 +1,36 @@ + + + + + {{ node.type === 'menuitem' ? 'description' : 'folder' }} + +
+ {{node.name}} + {{node.name}} +
+
+ {{node.name}} + {{node.name}} +
+
+ + + + + {{ node.type ==='menuitem' ? 'description' : 'folder' }} + +
+ {{node.name}} + {{node.name}} +
+
+ {{node.name}} + {{node.name}} +
+
+
diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.spec.ts b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.spec.ts new file mode 100644 index 00000000..72d4c764 --- /dev/null +++ b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.spec.ts @@ -0,0 +1,32 @@ +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatTreeModule } from '@angular/material/tree'; + +import { MainMenuTreeComponent } from './main-menu-tree.component'; + +describe('MainMenuTreeComponent', () => { + let component: MainMenuTreeComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ MainMenuTreeComponent ], + imports: [ + MatButtonModule, + MatIconModule, + MatTreeModule, + ] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MainMenuTreeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should compile', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts new file mode 100644 index 00000000..0c4bcf4b --- /dev/null +++ b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts @@ -0,0 +1,112 @@ +import { Component } from '@angular/core'; +import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree'; +import { FlatTreeControl } from '@angular/cdk/tree'; +import { menuData } from './menu-data'; +import { ResourceType } from '../model/controller.model'; +import { ISCommonService } from '../iscommon.service'; + +export interface MenuNode { + name: string; + type: string; + route?: string; + badge?: string; + children?: MenuNode[]; +} + +export interface FlatTreeNode { + name: string; + type: string; + level: number; + route?: string; + badge?: string; + expandable: boolean; +} + +@Component({ + selector: 'app-main-menu-tree', + templateUrl: './main-menu-tree.component.html', + styleUrls: ['./main-menu-tree.component.css'] +}) +export class MainMenuTreeComponent { + + /** The TreeControl controls the expand/collapse state of tree nodes. */ + treeControl: FlatTreeControl; + + /** The TreeFlattener is used to generate the flat list of items from hierarchical data. */ + treeFlattener: MatTreeFlattener; + + /** The MatTreeFlatDataSource connects the control and flattener to provide data. */ + dataSource: MatTreeFlatDataSource; + + constructor(public service:ISCommonService) { + this.treeFlattener = new MatTreeFlattener( + this.transformer, + this.getLevel, + this.isExpandable, + this.getChildren); + + this.service.loadResourceTypes().subscribe((data:ResourceType[]) => { + let simpleResources: MenuNode[] = [] + let advancedResources: MenuNode[] = [] + + data.forEach(resType => { + let item:MenuNode = { + name: resType.name, + type: 'menuitem', + badge: resType.count.toString() + } + if (resType.simple) { + simpleResources.push(item) + } else { + advancedResources.push(item) + } + }) + + menuData.forEach(m => { + if (m.name=='Simple Resources') { + m.children = simpleResources + } else if (m.name=='Advanced Resources') { + m.children = advancedResources + } + }) + this.dataSource.data = menuData; + }) + + this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable); + this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener); + this.dataSource.data = menuData; + + } + + /** Transform the data to something the tree can read. */ + transformer(node: MenuNode, level: number): FlatTreeNode { + return { + name: node.name, + type: node.type, + route: node.route, + badge: node.badge, + level, + expandable: !!node.children + }; + } + + /** Get the level of the node */ + getLevel(node: FlatTreeNode): number { + return node.level; + } + + /** Get whether the node is expanded or not. */ + isExpandable(node: FlatTreeNode): boolean { + return node.expandable; + } + + /** Get whether the node has children or not. */ + hasChild(index: number, node: FlatTreeNode): boolean { + return node.expandable; + } + + /** Get the children for the node. */ + getChildren(node: MenuNode): MenuNode[] | null | undefined { + return node.children; + } +} diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/menu-data.ts b/frontends/dnet-is-application/src/app/main-menu-tree/menu-data.ts new file mode 100644 index 00000000..fe939c0c --- /dev/null +++ b/frontends/dnet-is-application/src/app/main-menu-tree/menu-data.ts @@ -0,0 +1,24 @@ +export const menuData = [ + { name: 'Home', type: 'menuitem' }, + { + name: 'Datasources', + type: 'menu', + children: [ + { name: 'Search', type: 'menuitem' } + ] + }, + { + name: 'Simple Resources', + type: 'menu', + children: [] + }, + { + name: 'Advanced Resources', + type: 'menu', + children: [] + }, + { name: 'Workflow History', type: 'menuitem' }, + { name: 'Container Info', type: 'menuitem', route: 'info' }, + { name: 'API Documentation', type: 'menuitem' } + +]; diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts new file mode 100644 index 00000000..75a17602 --- /dev/null +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -0,0 +1,8 @@ +export interface ResourceType{ + id:string + name:string + contentType:string + count:number + simple:boolean +} + diff --git a/frontends/dnet-is-application/src/assets/.gitkeep b/frontends/dnet-is-application/src/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/frontends/dnet-is-application/src/favicon.ico b/frontends/dnet-is-application/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..997406ad22c29aae95893fb3d666c30258a09537 GIT binary patch literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 + + + + DnetIsApplication + + + + + + + + + + + diff --git a/frontends/dnet-is-application/src/main.ts b/frontends/dnet-is-application/src/main.ts new file mode 100644 index 00000000..c58dc05c --- /dev/null +++ b/frontends/dnet-is-application/src/main.ts @@ -0,0 +1,7 @@ +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; + + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/frontends/dnet-is-application/src/proxy.conf.json b/frontends/dnet-is-application/src/proxy.conf.json new file mode 100644 index 00000000..247e804d --- /dev/null +++ b/frontends/dnet-is-application/src/proxy.conf.json @@ -0,0 +1,6 @@ +{ + "/ajax": { + "target": "http://localhost:8280", + "secure": false + } + } \ No newline at end of file diff --git a/frontends/dnet-is-application/src/styles.css b/frontends/dnet-is-application/src/styles.css new file mode 100644 index 00000000..3ed3130d --- /dev/null +++ b/frontends/dnet-is-application/src/styles.css @@ -0,0 +1,16 @@ +/* You can add global styles to this file, and also import other style files */ + +html, body { height: 100%; } +body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } + +table { + width: 100%; +} + +.warning { + background-color: darkorange; +} + +.text-monospace { + font-family: monospace; +} diff --git a/frontends/dnet-is-application/tsconfig.app.json b/frontends/dnet-is-application/tsconfig.app.json new file mode 100644 index 00000000..374cc9d2 --- /dev/null +++ b/frontends/dnet-is-application/tsconfig.app.json @@ -0,0 +1,14 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/frontends/dnet-is-application/tsconfig.json b/frontends/dnet-is-application/tsconfig.json new file mode 100644 index 00000000..ed966d43 --- /dev/null +++ b/frontends/dnet-is-application/tsconfig.json @@ -0,0 +1,33 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "useDefineForClassFields": false, + "lib": [ + "ES2022", + "dom" + ] + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/frontends/dnet-is-application/tsconfig.spec.json b/frontends/dnet-is-application/tsconfig.spec.json new file mode 100644 index 00000000..be7e9da7 --- /dev/null +++ b/frontends/dnet-is-application/tsconfig.spec.json @@ -0,0 +1,14 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} -- 2.17.1 From 93560e881e6ebe83503590c48cf81dc0c2e5e002 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 20 Jan 2023 11:39:34 +0100 Subject: [PATCH 02/43] info and protocols --- .../src/app/app-routing.module.ts | 4 +- .../src/app/app.component.css | 18 +++ .../src/app/app.component.html | 32 ++++- .../src/app/app.component.spec.ts | 41 +++++- .../src/app/app.component.ts | 13 +- .../dnet-is-application/src/app/app.module.ts | 16 +-- .../src/app/info/info.component.html | 121 +++++++++--------- .../src/app/info/info.component.ts | 16 +-- .../src/app/iscommon.service.ts | 6 +- .../main-container.component.css | 17 --- .../main-container.component.html | 26 ---- .../main-container.component.spec.ts | 40 ------ .../main-container.component.ts | 21 --- .../main-menu-tree.component.ts | 2 + .../src/app/model/controller.model.ts | 14 +- .../src/app/protocols/protocols.component.css | 0 .../app/protocols/protocols.component.html | 51 ++++++++ .../app/protocols/protocols.component.spec.ts | 23 ++++ .../src/app/protocols/protocols.component.ts | 35 +++++ 19 files changed, 297 insertions(+), 199 deletions(-) delete mode 100644 frontends/dnet-is-application/src/app/main-container/main-container.component.css delete mode 100644 frontends/dnet-is-application/src/app/main-container/main-container.component.html delete mode 100644 frontends/dnet-is-application/src/app/main-container/main-container.component.spec.ts delete mode 100644 frontends/dnet-is-application/src/app/main-container/main-container.component.ts create mode 100644 frontends/dnet-is-application/src/app/protocols/protocols.component.css create mode 100644 frontends/dnet-is-application/src/app/protocols/protocols.component.html create mode 100644 frontends/dnet-is-application/src/app/protocols/protocols.component.spec.ts create mode 100644 frontends/dnet-is-application/src/app/protocols/protocols.component.ts diff --git a/frontends/dnet-is-application/src/app/app-routing.module.ts b/frontends/dnet-is-application/src/app/app-routing.module.ts index eed5d44a..835c774c 100644 --- a/frontends/dnet-is-application/src/app/app-routing.module.ts +++ b/frontends/dnet-is-application/src/app/app-routing.module.ts @@ -1,9 +1,11 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { InfoComponent } from './info/info.component'; +import { ProtocolsComponent } from './protocols/protocols.component'; const routes: Routes = [ - {path:"info", component:InfoComponent} + { path:"info" , component:InfoComponent}, + { path:"adv_resources/protocol" , component:ProtocolsComponent} ]; @NgModule({ diff --git a/frontends/dnet-is-application/src/app/app.component.css b/frontends/dnet-is-application/src/app/app.component.css index e69de29b..16aa103f 100644 --- a/frontends/dnet-is-application/src/app/app.component.css +++ b/frontends/dnet-is-application/src/app/app.component.css @@ -0,0 +1,18 @@ +.sidenav-container { + height: 100%; + } + + .sidenav { + width: 400px; + } + + .sidenav .mat-toolbar { + background: inherit; + } + + .mat-toolbar.mat-primary { + position: sticky; + top: 0; + z-index: 1; + } + \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/app.component.html b/frontends/dnet-is-application/src/app/app.component.html index 69ad4098..699393a0 100644 --- a/frontends/dnet-is-application/src/app/app.component.html +++ b/frontends/dnet-is-application/src/app/app.component.html @@ -1,5 +1,27 @@ - - - - - + + + Menu + + + + + + {{title}} + + + + + + + + \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/app.component.spec.ts b/frontends/dnet-is-application/src/app/app.component.spec.ts index 32f1f92c..56222f55 100644 --- a/frontends/dnet-is-application/src/app/app.component.spec.ts +++ b/frontends/dnet-is-application/src/app/app.component.spec.ts @@ -1,8 +1,44 @@ -import { TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; +import { LayoutModule } from '@angular/cdk/layout'; +import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { MatButtonModule } from '@angular/material/button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatListModule } from '@angular/material/list'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatToolbarModule } from '@angular/material/toolbar'; import { AppComponent } from './app.component'; describe('AppComponent', () => { + + let component: AppComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [AppComponent], + imports: [ + NoopAnimationsModule, + LayoutModule, + MatButtonModule, + MatIconModule, + MatListModule, + MatSidenavModule, + MatToolbarModule, + ] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AppComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should compile', () => { + expect(component).toBeTruthy(); + }); + beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ @@ -33,3 +69,6 @@ describe('AppComponent', () => { expect(compiled.querySelector('.content span')?.textContent).toContain('dnet-is-application app is running!'); }); }); + + + diff --git a/frontends/dnet-is-application/src/app/app.component.ts b/frontends/dnet-is-application/src/app/app.component.ts index c5d87ed9..3ddfee01 100644 --- a/frontends/dnet-is-application/src/app/app.component.ts +++ b/frontends/dnet-is-application/src/app/app.component.ts @@ -1,5 +1,8 @@ import { Component } from '@angular/core'; import { TitleStrategy } from '@angular/router'; +import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; +import { Observable } from 'rxjs'; +import { map, shareReplay } from 'rxjs/operators'; @Component({ selector: 'app-root', @@ -7,6 +10,14 @@ import { TitleStrategy } from '@angular/router'; styleUrls: ['./app.component.css'] }) export class AppComponent { - title = 'dnet-is-application'; + title = 'D-NET Information Service Application'; + isHandset$: Observable = this.breakpointObserver.observe(Breakpoints.Handset) + .pipe( + map(result => result.matches), + shareReplay() + ); + + constructor(private breakpointObserver: BreakpointObserver) {} + } diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 460ffe7b..b8e42ec0 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -14,24 +14,22 @@ import { MatButtonModule } from '@angular/material/button'; import { MatSidenavModule } from '@angular/material/sidenav'; import { MatIconModule } from '@angular/material/icon'; import { MatListModule } from '@angular/material/list'; -import {FlatTreeControl} from '@angular/cdk/tree'; -import {MatTree, MatTreeFlatDataSource, MatTreeFlattener, MatTreeNode, MatTreeModule} from '@angular/material/tree'; -import { MainContainerComponent } from './main-container/main-container.component'; +import { MatTreeModule} from '@angular/material/tree'; import { MainMenuTreeComponent } from './main-menu-tree/main-menu-tree.component'; import { MatBadgeModule } from '@angular/material/badge'; import { MatCardModule } from '@angular/material/card'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatInputModule} from '@angular/material/input' -import {MatTableModule} from '@angular/material/table'; - +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input' +import { MatTableModule } from '@angular/material/table'; +import { ProtocolsComponent } from './protocols/protocols.component'; @NgModule({ declarations: [ AppComponent, InfoComponent, DatafilterPipe, - MainContainerComponent, - MainMenuTreeComponent + MainMenuTreeComponent, + ProtocolsComponent ], imports: [ BrowserModule, diff --git a/frontends/dnet-is-application/src/app/info/info.component.html b/frontends/dnet-is-application/src/app/info/info.component.html index e582a1c0..3768a4f4 100644 --- a/frontends/dnet-is-application/src/app/info/info.component.html +++ b/frontends/dnet-is-application/src/app/info/info.component.html @@ -1,79 +1,80 @@ -
- -

Container Info

- - + + + Container Info + + + + Filter - - + + - - - - {{section.name}} - - +
+
+

{{section.name}}

- + - + - + - + + + + + +
Property {{element.k}} Value {{element.v}}
No data matching the filter "{{input.value}}"
+
+
+ + +
+

Modules

+ + + + + + + + + + + + + + + + + + + + + + + + +
Group {{element.group}} Name {{element.name}} Versions {{element.versions}} Files {{element.files}}
No data matching the filter "{{input.value}}"
- - - +
+ +
+
+ + + - - - Modules - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Group {{element.group}} Name {{element.name}} Versions {{element.versions}} Files {{element.files}}
No data matching the filter "{{input.value}}"
-
-
-
@@ -118,6 +119,4 @@ ---> - - +--> \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/info/info.component.ts b/frontends/dnet-is-application/src/app/info/info.component.ts index 1c617ebd..eec79597 100644 --- a/frontends/dnet-is-application/src/app/info/info.component.ts +++ b/frontends/dnet-is-application/src/app/info/info.component.ts @@ -16,7 +16,7 @@ export interface Module { export interface KeyValueDatasource { name: string; - datasource: MatTableDataSource; + datasource: MatTableDataSource; } @@ -26,7 +26,6 @@ export interface KeyValueDatasource { styleUrls: ['./info.component.css'] }) export class InfoComponent { - infoFilter?:string; kvDatasources:KeyValueDatasource[] = []; moduleDatasource:MatTableDataSource = new MatTableDataSource([]); @@ -58,18 +57,5 @@ export class InfoComponent { this.kvDatasources.forEach(s => s.datasource.filter = filterValue) this.moduleDatasource.filter = filterValue; } - - getFilteredInfo(data:any[]) { - if (this.infoFilter) { - return data.filter(obj => { - return Object.keys(obj).reduce((acc, curr) => { - return acc || obj[curr].toString().toLowerCase().includes(this.infoFilter); - }, false); - }) - } - else - return data - - } } diff --git a/frontends/dnet-is-application/src/app/iscommon.service.ts b/frontends/dnet-is-application/src/app/iscommon.service.ts index 1ff5af32..798f3cef 100644 --- a/frontends/dnet-is-application/src/app/iscommon.service.ts +++ b/frontends/dnet-is-application/src/app/iscommon.service.ts @@ -1,7 +1,8 @@ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; -import { ResourceType } from './model/controller.model'; +import { ResourceType,Protocol } from './model/controller.model'; import { Observable, Observer } from 'rxjs'; + @Injectable({ providedIn: 'root' }) @@ -18,5 +19,8 @@ export class ISCommonService { return this.client.get("/ajax/info/"); } + loadProtocols():Observable { + return this.client.get("/ajax/protocols/"); + } } diff --git a/frontends/dnet-is-application/src/app/main-container/main-container.component.css b/frontends/dnet-is-application/src/app/main-container/main-container.component.css deleted file mode 100644 index ac9b3b14..00000000 --- a/frontends/dnet-is-application/src/app/main-container/main-container.component.css +++ /dev/null @@ -1,17 +0,0 @@ -.sidenav-container { - height: 100%; -} - -.sidenav { - width: 400px; -} - -.sidenav .mat-toolbar { - background: inherit; -} - -.mat-toolbar.mat-primary { - position: sticky; - top: 0; - z-index: 1; -} diff --git a/frontends/dnet-is-application/src/app/main-container/main-container.component.html b/frontends/dnet-is-application/src/app/main-container/main-container.component.html deleted file mode 100644 index cd9d52b1..00000000 --- a/frontends/dnet-is-application/src/app/main-container/main-container.component.html +++ /dev/null @@ -1,26 +0,0 @@ - - - Menu - - - - - - dnet-is-application - - - - - - - diff --git a/frontends/dnet-is-application/src/app/main-container/main-container.component.spec.ts b/frontends/dnet-is-application/src/app/main-container/main-container.component.spec.ts deleted file mode 100644 index 552f7705..00000000 --- a/frontends/dnet-is-application/src/app/main-container/main-container.component.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { LayoutModule } from '@angular/cdk/layout'; -import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatListModule } from '@angular/material/list'; -import { MatSidenavModule } from '@angular/material/sidenav'; -import { MatToolbarModule } from '@angular/material/toolbar'; - -import { MainContainerComponent } from './main-container.component'; - -describe('MainContainerComponent', () => { - let component: MainContainerComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [MainContainerComponent], - imports: [ - NoopAnimationsModule, - LayoutModule, - MatButtonModule, - MatIconModule, - MatListModule, - MatSidenavModule, - MatToolbarModule, - ] - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(MainContainerComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontends/dnet-is-application/src/app/main-container/main-container.component.ts b/frontends/dnet-is-application/src/app/main-container/main-container.component.ts deleted file mode 100644 index 6b7e30d4..00000000 --- a/frontends/dnet-is-application/src/app/main-container/main-container.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component } from '@angular/core'; -import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; -import { Observable } from 'rxjs'; -import { map, shareReplay } from 'rxjs/operators'; - -@Component({ - selector: 'app-main-container', - templateUrl: './main-container.component.html', - styleUrls: ['./main-container.component.css'] -}) -export class MainContainerComponent { - - isHandset$: Observable = this.breakpointObserver.observe(Breakpoints.Handset) - .pipe( - map(result => result.matches), - shareReplay() - ); - - constructor(private breakpointObserver: BreakpointObserver) {} - -} diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts index 0c4bcf4b..671fce34 100644 --- a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts +++ b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts @@ -56,8 +56,10 @@ export class MainMenuTreeComponent { badge: resType.count.toString() } if (resType.simple) { + item.route = '/resources/' + resType.id; simpleResources.push(item) } else { + item.route = '/adv_resources/' + resType.id; advancedResources.push(item) } }) diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts index 75a17602..e9e8119d 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -1,4 +1,4 @@ -export interface ResourceType{ +export interface ResourceType { id:string name:string contentType:string @@ -6,3 +6,15 @@ export interface ResourceType{ simple:boolean } +export interface ProtocolParams { + name:string + label:string + type:string + optional:boolean + hasSelFunction:boolean +} + +export interface Protocol { + id: string + params: ProtocolParams[] +} \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/protocols/protocols.component.css b/frontends/dnet-is-application/src/app/protocols/protocols.component.css new file mode 100644 index 00000000..e69de29b diff --git a/frontends/dnet-is-application/src/app/protocols/protocols.component.html b/frontends/dnet-is-application/src/app/protocols/protocols.component.html new file mode 100644 index 00000000..c9b1046d --- /dev/null +++ b/frontends/dnet-is-application/src/app/protocols/protocols.component.html @@ -0,0 +1,51 @@ + + + Harvesting Protocols + + +
+

{{prot.protocol}}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + +
Name {{element.name}} Label {{element.label}} Type {{element.type}} Required + + Has Sel Function + +
No parameters
+
+
+ +
\ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/protocols/protocols.component.spec.ts b/frontends/dnet-is-application/src/app/protocols/protocols.component.spec.ts new file mode 100644 index 00000000..341b9b31 --- /dev/null +++ b/frontends/dnet-is-application/src/app/protocols/protocols.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ProtocolsComponent } from './protocols.component'; + +describe('ProtocolsComponent', () => { + let component: ProtocolsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ProtocolsComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ProtocolsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontends/dnet-is-application/src/app/protocols/protocols.component.ts b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts new file mode 100644 index 00000000..6602d753 --- /dev/null +++ b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts @@ -0,0 +1,35 @@ +import { Component } from '@angular/core'; +import { ISCommonService } from '../iscommon.service'; +import { MatTableDataSource } from '@angular/material/table'; +import { Protocol, ProtocolParams } from '../model/controller.model'; + +export interface ProtocolDatasource { + protocol: string; + datasource: MatTableDataSource; +} + +@Component({ + selector: 'app-protocols', + templateUrl: './protocols.component.html', + styleUrls: ['./protocols.component.css'] +}) +export class ProtocolsComponent { + protDatasources:ProtocolDatasource[] = []; + colums : string[] = ['name', 'label', 'type', 'optional', 'hasSelFunction']; + + constructor(public service:ISCommonService) { + this.service.loadProtocols().subscribe({ + next:(data:Protocol[]) => { + data.forEach(p => { + this.protDatasources.push({ + protocol : p.id, + datasource : new MatTableDataSource(p.params) + }); + }) + }, + error:error => console.log(error), + complete:() => console.log("Completed") + }) + } + +} -- 2.17.1 From 8791d61303925aa8fbb76e6e054cca402fcef041 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 20 Jan 2023 13:19:34 +0100 Subject: [PATCH 03/43] menu with panels --- .../src/app/app.component.html | 2 +- .../dnet-is-application/src/app/app.module.ts | 8 ++- .../main-menu-panels.component.css | 13 +++++ .../main-menu-panels.component.html | 57 +++++++++++++++++++ .../main-menu-panels.component.spec.ts | 23 ++++++++ .../main-menu-panels.component.ts | 17 ++++++ .../app/protocols/protocols.component.html | 2 +- 7 files changed, 118 insertions(+), 4 deletions(-) create mode 100644 frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css create mode 100644 frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html create mode 100644 frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.spec.ts create mode 100644 frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts diff --git a/frontends/dnet-is-application/src/app/app.component.html b/frontends/dnet-is-application/src/app/app.component.html index 699393a0..944ef7b1 100644 --- a/frontends/dnet-is-application/src/app/app.component.html +++ b/frontends/dnet-is-application/src/app/app.component.html @@ -4,7 +4,7 @@ [mode]="(isHandset$ | async) ? 'over' : 'side'" [opened]="(isHandset$ | async) === false"> Menu - + diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index b8e42ec0..7b4deb15 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -22,6 +22,8 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input' import { MatTableModule } from '@angular/material/table'; import { ProtocolsComponent } from './protocols/protocols.component'; +import { MainMenuPanelsComponent } from './main-menu-panels/main-menu-panels.component'; +import { MatExpansionModule } from '@angular/material/expansion'; @NgModule({ declarations: [ @@ -29,7 +31,8 @@ import { ProtocolsComponent } from './protocols/protocols.component'; InfoComponent, DatafilterPipe, MainMenuTreeComponent, - ProtocolsComponent + ProtocolsComponent, + MainMenuPanelsComponent ], imports: [ BrowserModule, @@ -48,7 +51,8 @@ import { ProtocolsComponent } from './protocols/protocols.component'; MatCardModule, MatFormFieldModule, MatInputModule, - MatTableModule + MatTableModule, + MatExpansionModule ], providers: [], bootstrap: [AppComponent] diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css new file mode 100644 index 00000000..92f09260 --- /dev/null +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css @@ -0,0 +1,13 @@ +.menu-count { + padding-top: 0.1em; + padding-bottom: 0.1em; + padding-left: 0.4em; + padding-right: 0.4em; + border-radius: 1em; + font-size: 0.7em; + color: #fff; + background-color:cornflowerblue; + width: 2em; + text-align: center; + float: right; +} diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html new file mode 100644 index 00000000..c91f0cb0 --- /dev/null +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html @@ -0,0 +1,57 @@ + + + + Home + +

...

+
+ + + Datasources + + + Search + + + + + + + Simple Resources + + + + {{r.name}} {{r.count}} + + + + + + + Advanced Resources + + + + {{r.name}} {{r.count}} + + + + + + + Logs + + + Workflow History + + + + + + Info + + + Container Info + + +
\ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.spec.ts b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.spec.ts new file mode 100644 index 00000000..a984d6a9 --- /dev/null +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MainMenuPanelsComponent } from './main-menu-panels.component'; + +describe('MainMenuPanelsComponent', () => { + let component: MainMenuPanelsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ MainMenuPanelsComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(MainMenuPanelsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts new file mode 100644 index 00000000..21d7f30a --- /dev/null +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts @@ -0,0 +1,17 @@ +import { Component } from '@angular/core'; +import { ResourceType } from '../model/controller.model'; +import { ISCommonService } from '../iscommon.service'; + +@Component({ + selector: 'app-main-menu-panels', + templateUrl: './main-menu-panels.component.html', + styleUrls: ['./main-menu-panels.component.css'] +}) +export class MainMenuPanelsComponent { + + resTypes:ResourceType[] = []; + + constructor(public service:ISCommonService) { + this.service.loadResourceTypes().subscribe((data:ResourceType[]) => this.resTypes = data); + } +} diff --git a/frontends/dnet-is-application/src/app/protocols/protocols.component.html b/frontends/dnet-is-application/src/app/protocols/protocols.component.html index c9b1046d..334d13f0 100644 --- a/frontends/dnet-is-application/src/app/protocols/protocols.component.html +++ b/frontends/dnet-is-application/src/app/protocols/protocols.component.html @@ -3,7 +3,7 @@ Harvesting Protocols -
+

{{prot.protocol}}

-- 2.17.1 From 118c3ac7d3ddf026bd454af5e274185a9e9a8ac8 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 20 Jan 2023 16:57:03 +0100 Subject: [PATCH 04/43] wf history --- .../src/app/app-routing.module.ts | 4 +- .../dnet-is-application/src/app/app.module.ts | 4 +- .../src/app/info/info.component.html | 66 ++++++++--------- .../src/app/info/info.component.ts | 7 +- ...mon.service.spec.ts => is.service.spec.ts} | 8 +- .../dnet-is-application/src/app/is.service.ts | 37 ++++++++++ .../src/app/iscommon.service.ts | 26 ------- .../main-menu-panels.component.css | 3 + .../main-menu-panels.component.html | 8 +- .../main-menu-panels.component.ts | 12 ++- .../main-menu-tree.component.html | 4 + .../main-menu-tree.component.ts | 4 +- .../src/app/model/controller.model.ts | 13 ++++ .../src/app/protocols/protocols.component.ts | 4 +- .../app/wf-history/wf-history.component.css | 0 .../app/wf-history/wf-history.component.html | 74 +++++++++++++++++++ .../wf-history/wf-history.component.spec.ts | 23 ++++++ .../app/wf-history/wf-history.component.ts | 45 +++++++++++ 18 files changed, 264 insertions(+), 78 deletions(-) rename frontends/dnet-is-application/src/app/{iscommon.service.spec.ts => is.service.spec.ts} (53%) create mode 100644 frontends/dnet-is-application/src/app/is.service.ts delete mode 100644 frontends/dnet-is-application/src/app/iscommon.service.ts create mode 100644 frontends/dnet-is-application/src/app/wf-history/wf-history.component.css create mode 100644 frontends/dnet-is-application/src/app/wf-history/wf-history.component.html create mode 100644 frontends/dnet-is-application/src/app/wf-history/wf-history.component.spec.ts create mode 100644 frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts diff --git a/frontends/dnet-is-application/src/app/app-routing.module.ts b/frontends/dnet-is-application/src/app/app-routing.module.ts index 835c774c..16f82460 100644 --- a/frontends/dnet-is-application/src/app/app-routing.module.ts +++ b/frontends/dnet-is-application/src/app/app-routing.module.ts @@ -2,10 +2,12 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { InfoComponent } from './info/info.component'; import { ProtocolsComponent } from './protocols/protocols.component'; +import { WfHistoryComponent } from './wf-history/wf-history.component'; const routes: Routes = [ { path:"info" , component:InfoComponent}, - { path:"adv_resources/protocol" , component:ProtocolsComponent} + { path:"adv_resources/protocol" , component:ProtocolsComponent}, + { path:"wf_history" , component:WfHistoryComponent} ]; @NgModule({ diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 7b4deb15..16c370b6 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -24,6 +24,7 @@ import { MatTableModule } from '@angular/material/table'; import { ProtocolsComponent } from './protocols/protocols.component'; import { MainMenuPanelsComponent } from './main-menu-panels/main-menu-panels.component'; import { MatExpansionModule } from '@angular/material/expansion'; +import { WfHistoryComponent } from './wf-history/wf-history.component'; @NgModule({ declarations: [ @@ -32,7 +33,8 @@ import { MatExpansionModule } from '@angular/material/expansion'; DatafilterPipe, MainMenuTreeComponent, ProtocolsComponent, - MainMenuPanelsComponent + MainMenuPanelsComponent, + WfHistoryComponent ], imports: [ BrowserModule, diff --git a/frontends/dnet-is-application/src/app/info/info.component.html b/frontends/dnet-is-application/src/app/info/info.component.html index 3768a4f4..3532f3a9 100644 --- a/frontends/dnet-is-application/src/app/info/info.component.html +++ b/frontends/dnet-is-application/src/app/info/info.component.html @@ -3,7 +3,7 @@ Container Info - + Filter @@ -35,39 +35,39 @@ -
-

Modules

-
+
+

Modules

+
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Group {{element.group}} Name {{element.name}} Versions {{element.versions}} Files {{element.files}}
No data matching the filter "{{input.value}}"
-
+ + Group + {{element.group}} + + + + Name + {{element.name}} + + + + Versions + {{element.versions}} + + + + Files + {{element.files}} + + + + + + + + No data matching the filter "{{input.value}}" + + +
diff --git a/frontends/dnet-is-application/src/app/info/info.component.ts b/frontends/dnet-is-application/src/app/info/info.component.ts index eec79597..1416a49c 100644 --- a/frontends/dnet-is-application/src/app/info/info.component.ts +++ b/frontends/dnet-is-application/src/app/info/info.component.ts @@ -1,5 +1,5 @@ import { Component } from '@angular/core'; -import { ISCommonService } from '../iscommon.service'; +import { ISService } from '../is.service'; import { MatTableDataSource } from '@angular/material/table'; export interface KeyValue { @@ -19,7 +19,6 @@ export interface KeyValueDatasource { datasource: MatTableDataSource; } - @Component({ selector: 'app-info', templateUrl: './info.component.html', @@ -28,12 +27,12 @@ export interface KeyValueDatasource { export class InfoComponent { kvDatasources:KeyValueDatasource[] = []; - moduleDatasource:MatTableDataSource = new MatTableDataSource([]); + moduleDatasource:MatTableDataSource = new MatTableDataSource([]); displayedKVColumns: string[] = ['k', 'v']; displayedModuleColumns: string[] = ['group', 'name', 'versions', 'files']; - constructor(public service:ISCommonService) { + constructor(public service:ISService) { this.service.loadInfo().subscribe({ next:(data:any[]) => { data.forEach(section => { diff --git a/frontends/dnet-is-application/src/app/iscommon.service.spec.ts b/frontends/dnet-is-application/src/app/is.service.spec.ts similarity index 53% rename from frontends/dnet-is-application/src/app/iscommon.service.spec.ts rename to frontends/dnet-is-application/src/app/is.service.spec.ts index 06bf113e..ed56fec7 100644 --- a/frontends/dnet-is-application/src/app/iscommon.service.spec.ts +++ b/frontends/dnet-is-application/src/app/is.service.spec.ts @@ -1,13 +1,13 @@ import { TestBed } from '@angular/core/testing'; -import { ISCommonService } from './iscommon.service'; +import { ISService } from './is.service'; -describe('ISCommonService', () => { - let service: ISCommonService; +describe('ISService', () => { + let service: ISService; beforeEach(() => { TestBed.configureTestingModule({}); - service = TestBed.inject(ISCommonService); + service = TestBed.inject(ISService); }); it('should be created', () => { diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts new file mode 100644 index 00000000..3b2dcb77 --- /dev/null +++ b/frontends/dnet-is-application/src/app/is.service.ts @@ -0,0 +1,37 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpParams } from '@angular/common/http'; +import { ResourceType,Protocol,WfHistoryEntry } from './model/controller.model'; +import { Observable, Observer } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class ISService { + + constructor(public client:HttpClient) { } + + + loadResourceTypes():Observable { + return this.client.get("/ajax/resourceTypes"); + } + + loadInfo():Observable { + return this.client.get("/ajax/info/"); + } + + loadProtocols():Observable { + return this.client.get("/ajax/protocols/"); + } + + loadWfHistory(total?:number, from?:number, to?:number):Observable { + let params = new HttpParams(); + + if (total && total > 0) { params = params.append('total', total); } + if (from && from > 0) { params = params.append('from', from); } + if (to && to > 0) { params = params.append('to', to); } + + + return this.client.get('/ajax/wfs/', {params: params}); + } + +} diff --git a/frontends/dnet-is-application/src/app/iscommon.service.ts b/frontends/dnet-is-application/src/app/iscommon.service.ts deleted file mode 100644 index 798f3cef..00000000 --- a/frontends/dnet-is-application/src/app/iscommon.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { ResourceType,Protocol } from './model/controller.model'; -import { Observable, Observer } from 'rxjs'; - -@Injectable({ - providedIn: 'root' -}) -export class ISCommonService { - - constructor(public client:HttpClient) { } - - - loadResourceTypes():Observable { - return this.client.get("/ajax/resourceTypes"); - } - - loadInfo():Observable { - return this.client.get("/ajax/info/"); - } - - loadProtocols():Observable { - return this.client.get("/ajax/protocols/"); - } - -} diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css index 92f09260..491543a1 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css @@ -11,3 +11,6 @@ text-align: center; float: right; } + +.collapse-buttons { text-align: right; } +.collapse-buttons button { font-size: 0.6em; } diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html index c91f0cb0..296d335b 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html @@ -1,4 +1,10 @@ - + +
+ + +
+ + Home diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts index 21d7f30a..bf0046b7 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts @@ -1,6 +1,7 @@ -import { Component } from '@angular/core'; +import {Component, ViewChild} from '@angular/core'; import { ResourceType } from '../model/controller.model'; -import { ISCommonService } from '../iscommon.service'; +import { ISService } from '../is.service'; +import {MatAccordion} from '@angular/material/expansion'; @Component({ selector: 'app-main-menu-panels', @@ -8,10 +9,13 @@ import { ISCommonService } from '../iscommon.service'; styleUrls: ['./main-menu-panels.component.css'] }) export class MainMenuPanelsComponent { - + + @ViewChild(MatAccordion) + accordion!:MatAccordion; + resTypes:ResourceType[] = []; - constructor(public service:ISCommonService) { + constructor(public service:ISService) { this.service.loadResourceTypes().subscribe((data:ResourceType[]) => this.resTypes = data); } } diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.html b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.html index e4307f5a..a84203f7 100644 --- a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.html +++ b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.html @@ -1,3 +1,7 @@ + + + + diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts index 671fce34..107db5f0 100644 --- a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts +++ b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts @@ -3,7 +3,7 @@ import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree' import { FlatTreeControl } from '@angular/cdk/tree'; import { menuData } from './menu-data'; import { ResourceType } from '../model/controller.model'; -import { ISCommonService } from '../iscommon.service'; +import { ISService } from '../is.service'; export interface MenuNode { name: string; @@ -38,7 +38,7 @@ export class MainMenuTreeComponent { /** The MatTreeFlatDataSource connects the control and flattener to provide data. */ dataSource: MatTreeFlatDataSource; - constructor(public service:ISCommonService) { + constructor(public service:ISService) { this.treeFlattener = new MatTreeFlattener( this.transformer, this.getLevel, diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts index e9e8119d..2d02df5a 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -17,4 +17,17 @@ export interface ProtocolParams { export interface Protocol { id: string params: ProtocolParams[] +} + +export interface WfHistoryEntry { + processId: string, + name: string, + family: string, + status: string, + startDate: string, + endDate: string, + dsId?: string, + dsName?: string, + dsApi?: string, + details: Map } \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/protocols/protocols.component.ts b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts index 6602d753..76d92f36 100644 --- a/frontends/dnet-is-application/src/app/protocols/protocols.component.ts +++ b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts @@ -1,5 +1,5 @@ import { Component } from '@angular/core'; -import { ISCommonService } from '../iscommon.service'; +import { ISService } from '../is.service'; import { MatTableDataSource } from '@angular/material/table'; import { Protocol, ProtocolParams } from '../model/controller.model'; @@ -17,7 +17,7 @@ export class ProtocolsComponent { protDatasources:ProtocolDatasource[] = []; colums : string[] = ['name', 'label', 'type', 'optional', 'hasSelFunction']; - constructor(public service:ISCommonService) { + constructor(public service:ISService) { this.service.loadProtocols().subscribe({ next:(data:Protocol[]) => { data.forEach(p => { diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.css b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.css new file mode 100644 index 00000000..e69de29b diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html new file mode 100644 index 00000000..9f5a8726 --- /dev/null +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html @@ -0,0 +1,74 @@ + + + Workflow History + + + + + Filter + + + + +

+ Recent workflows (max {{total}}) + Workflows from {{from | date:"yyyy-MM-dd HH:mm:ss"}} to {{to | date:"yyyy-MM-dd HH:mm:ss"}} + Workflows from {{from | date:"yyyy-MM-dd HH:mm:ss"}} to undefined + Workflows from undefined to {{to | date:"yyyy-MM-dd HH:mm:ss"}} +
+ Count : {{wfDatasource.filteredData.length}} +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Process Id {{element.processId}} Workflow Name {{element.name}} Workflow Family {{element.family}} Datasource {{element.dsName}} Status {{element.status}} Start Date {{element.startDate}} End Date {{element.endDate}}
No data matching the filter "{{input.value}}"
+ +
+
+ + + diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.spec.ts b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.spec.ts new file mode 100644 index 00000000..203ed650 --- /dev/null +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WfHistoryComponent } from './wf-history.component'; + +describe('WfHistoryComponent', () => { + let component: WfHistoryComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ WfHistoryComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(WfHistoryComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts new file mode 100644 index 00000000..444f1990 --- /dev/null +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts @@ -0,0 +1,45 @@ +import { Component } from '@angular/core'; +import { ISService } from '../is.service'; +import { MatTableDataSource } from '@angular/material/table'; +import { WfHistoryEntry } from '../model/controller.model'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import {map} from 'rxjs/operators'; + +@Component({ + selector: 'app-wf-history', + templateUrl: './wf-history.component.html', + styleUrls: ['./wf-history.component.css'] +}) +export class WfHistoryComponent { + + wfDatasource:MatTableDataSource = new MatTableDataSource([]); + + colums : string[] = ['processId', 'name', 'family', 'status', 'startDate', 'endDate', 'dsName']; + + total:number = 100 + from:number = -1 + to:number = -1 + + constructor(public service:ISService, route: ActivatedRoute) { + + let totalP = route.snapshot.paramMap.get('total'); + let fromP = route.snapshot.queryParamMap.get('from'); + let toP = route.snapshot.queryParamMap.get('to'); + + if (totalP) { this.total = parseInt(totalP); } + if (fromP) { this.from = parseInt(fromP); } + if (toP) { this.to = parseInt(toP); } + + this.service.loadWfHistory(this.total, this.from, this.to).subscribe({ + next:(data:WfHistoryEntry[]) => this.wfDatasource.data = data, + error:error => console.log(error), + complete:() => console.log("Completed") + }) + } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); + this.wfDatasource.filter = filterValue; + } +} \ No newline at end of file -- 2.17.1 From 8785218ae9d6108c4b02d9986307ee629eeec172 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Mon, 23 Jan 2023 11:08:43 +0100 Subject: [PATCH 05/43] ui --- .../src/app/app.component.html | 3 +- .../src/app/info/info.component.html | 160 ++++++------------ .../app/protocols/protocols.component.html | 78 ++++----- .../app/wf-history/wf-history.component.html | 10 +- 4 files changed, 92 insertions(+), 159 deletions(-) diff --git a/frontends/dnet-is-application/src/app/app.component.html b/frontends/dnet-is-application/src/app/app.component.html index 944ef7b1..104f1eed 100644 --- a/frontends/dnet-is-application/src/app/app.component.html +++ b/frontends/dnet-is-application/src/app/app.component.html @@ -19,9 +19,10 @@ {{title}}
+
- +
\ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/info/info.component.html b/frontends/dnet-is-application/src/app/info/info.component.html index 3532f3a9..d9b20827 100644 --- a/frontends/dnet-is-application/src/app/info/info.component.html +++ b/frontends/dnet-is-application/src/app/info/info.component.html @@ -1,122 +1,66 @@ - - - Container Info - - +

Container Info

- - Filter - - + + Filter + + -
-
-

{{section.name}}

- +
+
+

{{section.name}}

+
- - - - + + + + - - - - + + + + - + - - - - -
Property {{element.k}} Property {{element.k}} Value {{element.v}} Value {{element.v}}
No data matching the filter "{{input.value}}"
-
-
+ + + No data matching the filter "{{input.value}}" + + + + -
-

Modules

- +
+

Modules

+
- - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - + + - - - - -
Group {{element.group}} Group {{element.group}} Name {{element.name}} Name {{element.name}} Versions {{element.versions}} Versions {{element.versions}} Files {{element.files}} Files {{element.files}}
No data matching the filter "{{input.value}}"
-
- -
-
- - - - - - - - - - \ No newline at end of file + + + No data matching the filter "{{input.value}}" + + + \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/protocols/protocols.component.html b/frontends/dnet-is-application/src/app/protocols/protocols.component.html index 334d13f0..f051df50 100644 --- a/frontends/dnet-is-application/src/app/protocols/protocols.component.html +++ b/frontends/dnet-is-application/src/app/protocols/protocols.component.html @@ -1,51 +1,45 @@ - - - Harvesting Protocols - - -
-

{{prot.protocol}}

+

Harvesting Protocols

- +
+

{{prot.protocol}}

- -
- - +
Name {{element.name}}
- - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + -   - + + + + - - - - -
Label {{element.label}} Name {{element.name}} Type {{element.type}} Label {{element.label}} Required - - Type {{element.type}} Has Sel Function - - Required + +
Has Sel Function + +
No parameters
-
-
+   + -
\ No newline at end of file + + + No parameters + + + \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html index 9f5a8726..54edac1b 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html @@ -1,10 +1,6 @@ - - - Workflow History - - +

Workflow History

- + Filter @@ -67,8 +63,6 @@ -
-
-- 2.17.1 From 9d8159b392b745478372b8cff69bed41b9e165b0 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Mon, 23 Jan 2023 14:22:14 +0100 Subject: [PATCH 06/43] first dialog --- .../src/app/app.component.css | 3 +- .../dnet-is-application/src/app/app.module.ts | 17 ++--- .../src/app/datafilter.pipe.spec.ts | 8 --- .../src/app/datafilter.pipe.ts | 22 ------- .../src/app/info/info.component.ts | 13 +--- .../src/app/model/controller.model.ts | 12 ++++ .../src/app/wf-history/wf-dialog.html | 31 ++++++++++ .../app/wf-history/wf-history.component.html | 8 ++- .../app/wf-history/wf-history.component.ts | 62 +++++++++++++++---- frontends/dnet-is-application/src/styles.css | 11 ++++ 10 files changed, 119 insertions(+), 68 deletions(-) delete mode 100644 frontends/dnet-is-application/src/app/datafilter.pipe.spec.ts delete mode 100644 frontends/dnet-is-application/src/app/datafilter.pipe.ts create mode 100644 frontends/dnet-is-application/src/app/wf-history/wf-dialog.html diff --git a/frontends/dnet-is-application/src/app/app.component.css b/frontends/dnet-is-application/src/app/app.component.css index 16aa103f..1f3a5e34 100644 --- a/frontends/dnet-is-application/src/app/app.component.css +++ b/frontends/dnet-is-application/src/app/app.component.css @@ -3,7 +3,7 @@ } .sidenav { - width: 400px; + width: 350px; } .sidenav .mat-toolbar { @@ -15,4 +15,3 @@ top: 0; z-index: 1; } - \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 16c370b6..35ac35ef 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -6,7 +6,6 @@ import { AppComponent } from './app.component'; import { FormsModule } from '@angular/forms'; import { HttpClientModule } from '@angular/common/http'; import { InfoComponent } from './info/info.component'; -import { DatafilterPipe } from './datafilter.pipe'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { LayoutModule } from '@angular/cdk/layout'; import { MatToolbarModule } from '@angular/material/toolbar'; @@ -24,17 +23,18 @@ import { MatTableModule } from '@angular/material/table'; import { ProtocolsComponent } from './protocols/protocols.component'; import { MainMenuPanelsComponent } from './main-menu-panels/main-menu-panels.component'; import { MatExpansionModule } from '@angular/material/expansion'; -import { WfHistoryComponent } from './wf-history/wf-history.component'; +import { WfDialog, WfHistoryComponent } from './wf-history/wf-history.component'; +import { MatDialogModule } from '@angular/material/dialog'; @NgModule({ declarations: [ AppComponent, - InfoComponent, - DatafilterPipe, - MainMenuTreeComponent, - ProtocolsComponent, MainMenuPanelsComponent, - WfHistoryComponent + MainMenuTreeComponent, + InfoComponent, + ProtocolsComponent, + WfHistoryComponent, + WfDialog ], imports: [ BrowserModule, @@ -54,7 +54,8 @@ import { WfHistoryComponent } from './wf-history/wf-history.component'; MatFormFieldModule, MatInputModule, MatTableModule, - MatExpansionModule + MatExpansionModule, + MatDialogModule ], providers: [], bootstrap: [AppComponent] diff --git a/frontends/dnet-is-application/src/app/datafilter.pipe.spec.ts b/frontends/dnet-is-application/src/app/datafilter.pipe.spec.ts deleted file mode 100644 index 872c8c8a..00000000 --- a/frontends/dnet-is-application/src/app/datafilter.pipe.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { DatafilterPipe } from './datafilter.pipe'; - -describe('DatafilterPipe', () => { - it('create an instance', () => { - const pipe = new DatafilterPipe(); - expect(pipe).toBeTruthy(); - }); -}); diff --git a/frontends/dnet-is-application/src/app/datafilter.pipe.ts b/frontends/dnet-is-application/src/app/datafilter.pipe.ts deleted file mode 100644 index 2f26b1a1..00000000 --- a/frontends/dnet-is-application/src/app/datafilter.pipe.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'datafilter' -}) -export class DatafilterPipe implements PipeTransform { - - transform(items: any[], searchTerm?: string) { - let filteredList: any[] = []; - if (searchTerm) { - return items.filter(item => - Object.keys(item).some(k => item[k] != null && - item[k].toString().toLowerCase() - .includes(searchTerm.toLowerCase())) - ); - } - else { - return items; - } - } - -} diff --git a/frontends/dnet-is-application/src/app/info/info.component.ts b/frontends/dnet-is-application/src/app/info/info.component.ts index 1416a49c..c8a5599f 100644 --- a/frontends/dnet-is-application/src/app/info/info.component.ts +++ b/frontends/dnet-is-application/src/app/info/info.component.ts @@ -1,18 +1,7 @@ import { Component } from '@angular/core'; import { ISService } from '../is.service'; import { MatTableDataSource } from '@angular/material/table'; - -export interface KeyValue { - k: string; - v: string; -} - -export interface Module { - group: string; - name: string; - versions: string[]; - files: string[]; -} +import { KeyValue, Module } from '../model/controller.model'; export interface KeyValueDatasource { name: string; diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts index 2d02df5a..ae71bdaf 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -6,6 +6,18 @@ export interface ResourceType { simple:boolean } +export interface KeyValue { + k: string; + v: string; + } + + export interface Module { + group: string; + name: string; + versions: string[]; + files: string[]; + } + export interface ProtocolParams { name:string label:string diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html b/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html new file mode 100644 index 00000000..9872724e --- /dev/null +++ b/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html @@ -0,0 +1,31 @@ +

Details

+ +
+ + + Filter + + + + + + + + + + + + + + + + + + + + + + +
k{{element.k}}v {{element.v}}
No data matching the filter "{{filterParams.value}}"
+ +
\ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html index 54edac1b..1e25d063 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html @@ -12,16 +12,18 @@ Workflows from {{from | date:"yyyy-MM-dd HH:mm:ss"}} to undefined Workflows from undefined to {{to | date:"yyyy-MM-dd HH:mm:ss"}}
- Count : {{wfDatasource.filteredData.length}} + Count : {{historyDatasource.filteredData.length}}

- +
- + diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts index 444f1990..0bb19362 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts @@ -1,10 +1,12 @@ -import { Component } from '@angular/core'; +import { Component, Inject } from '@angular/core'; import { ISService } from '../is.service'; import { MatTableDataSource } from '@angular/material/table'; import { WfHistoryEntry } from '../model/controller.model'; import { ActivatedRoute } from '@angular/router'; import { Observable } from 'rxjs'; -import {map} from 'rxjs/operators'; +import { map } from 'rxjs/operators'; +import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { KeyValue } from '../model/controller.model'; @Component({ selector: 'app-wf-history', @@ -13,16 +15,16 @@ import {map} from 'rxjs/operators'; }) export class WfHistoryComponent { - wfDatasource:MatTableDataSource = new MatTableDataSource([]); - - colums : string[] = ['processId', 'name', 'family', 'status', 'startDate', 'endDate', 'dsName']; + historyDatasource: MatTableDataSource = new MatTableDataSource([]); - total:number = 100 - from:number = -1 - to:number = -1 + colums: string[] = ['processId', 'name', 'family', 'status', 'startDate', 'endDate', 'dsName']; + + total: number = 100 + from: number = -1 + to: number = -1 + + constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { - constructor(public service:ISService, route: ActivatedRoute) { - let totalP = route.snapshot.paramMap.get('total'); let fromP = route.snapshot.queryParamMap.get('from'); let toP = route.snapshot.queryParamMap.get('to'); @@ -32,14 +34,48 @@ export class WfHistoryComponent { if (toP) { this.to = parseInt(toP); } this.service.loadWfHistory(this.total, this.from, this.to).subscribe({ - next:(data:WfHistoryEntry[]) => this.wfDatasource.data = data, - error:error => console.log(error), - complete:() => console.log("Completed") + next: (data: WfHistoryEntry[]) => this.historyDatasource.data = data, + error: error => console.log(error), + complete: () => console.log("Completed") }) } + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); + this.historyDatasource.filter = filterValue; + } + + openWfDialog(wf: WfHistoryEntry): void { + const wfDialogRef = this.dialog.open(WfDialog, { + data: wf + }); + } +} + +@Component({ + selector: 'wf-dialog', + templateUrl: 'wf-dialog.html', +}) +export class WfDialog { + + wfDatasource: MatTableDataSource = new MatTableDataSource([]); + colums: string[] = ['k', 'v']; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: WfHistoryEntry, + ) { + let list:KeyValue[] = []; + for (let [key, value] of new Map(Object.entries(data.details))) { + list.push({k: key, v: value}); + } + this.wfDatasource.data = list; + } applyFilter(event: Event) { const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); this.wfDatasource.filter = filterValue; } + onNoClick(): void { + this.dialogRef.close(); + } } \ No newline at end of file diff --git a/frontends/dnet-is-application/src/styles.css b/frontends/dnet-is-application/src/styles.css index 3ed3130d..4acdef93 100644 --- a/frontends/dnet-is-application/src/styles.css +++ b/frontends/dnet-is-application/src/styles.css @@ -14,3 +14,14 @@ table { .text-monospace { font-family: monospace; } + +a:not([href]) { + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + text-decoration: underline; + text-underline-offset: 3px; + color: #336699; +} + \ No newline at end of file -- 2.17.1 From 4a41d8cf846349570cbef43f6397b7f1ccb6d374 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Tue, 24 Jan 2023 10:08:55 +0100 Subject: [PATCH 07/43] ui --- .../src/app/info/info.component.html | 16 +-- .../main-menu-panels.component.css | 2 + .../src/app/wf-history/wf-dialog.html | 15 ++- .../app/wf-history/wf-history.component.css | 1 + .../app/wf-history/wf-history.component.html | 111 +++++++++--------- .../app/wf-history/wf-history.component.ts | 69 ++++++++++- frontends/dnet-is-application/src/styles.css | 22 +++- 7 files changed, 164 insertions(+), 72 deletions(-) diff --git a/frontends/dnet-is-application/src/app/info/info.component.html b/frontends/dnet-is-application/src/app/info/info.component.html index d9b20827..c54a31b7 100644 --- a/frontends/dnet-is-application/src/app/info/info.component.html +++ b/frontends/dnet-is-application/src/app/info/info.component.html @@ -12,12 +12,12 @@ - + - + @@ -36,23 +36,23 @@
Process Id {{element.processId}} + {{element.processId}} + Property {{element.k}} {{element.k}} Value {{element.v}} {{element.v}}
- + - + - - + + - - + + diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css index 491543a1..7c244416 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css @@ -14,3 +14,5 @@ .collapse-buttons { text-align: right; } .collapse-buttons button { font-size: 0.6em; } + +.mat-expansion-panel-spacing { margin: 0; } diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html b/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html index 9872724e..a68c3ffa 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html +++ b/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html @@ -1,6 +1,11 @@

Details

+

+ Started at: {{startDate}}
+ Finished at: {{endDate}}
+ Duration: {{duration}}
+

Filter @@ -11,12 +16,12 @@
- + - + @@ -28,4 +33,8 @@
Group Group {{element.group}} Name Name {{element.name}} Versions {{element.versions}} Versions {{v}}
Files {{element.files}} Files {{f}}
k{{element.k}}{{element.k}} v {{element.v}} {{element.v}}
- \ No newline at end of file + + +
+ +
diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.css b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.css index e69de29b..8b137891 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.css +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.css @@ -0,0 +1 @@ + diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html index 1e25d063..7708ed95 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html @@ -1,70 +1,67 @@ -

Workflow History

+

Workflow History

- - Filter - - + + Filter + + -

- Recent workflows (max {{total}}) - Workflows from {{from | date:"yyyy-MM-dd HH:mm:ss"}} to {{to | date:"yyyy-MM-dd HH:mm:ss"}} - Workflows from {{from | date:"yyyy-MM-dd HH:mm:ss"}} to undefined - Workflows from undefined to {{to | date:"yyyy-MM-dd HH:mm:ss"}} -
- Count : {{historyDatasource.filteredData.length}} -

+

+ Recent workflows (max {{total}}) + Workflows from {{from | date:"yyyy-MM-dd HH:mm:ss"}} to {{to | + date:"yyyy-MM-dd HH:mm:ss"}} + Workflows from {{from | date:"yyyy-MM-dd HH:mm:ss"}} to + undefined + Workflows from undefined to {{to | date:"yyyy-MM-dd + HH:mm:ss"}} +
+ Count : {{historyDatasource.filteredData.length}} +

+ + + + + -
Process Id + {{element.processId}} +
+ + + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Workflow Name {{element.name}} Process Id - {{element.processId}} - Workflow Family {{element.family}} Workflow Name {{element.name}} Datasource {{element.dsName}} Workflow Family {{element.family}} Datasource {{element.dsName}} Status {{element.status}} Start Date {{element.startDate}} End Date {{element.endDate}}
No data matching the filter "{{input.value}}"
+ + Status + {{element.status}} + + + Start Date + {{element.startDate}} + + + End Date + {{element.endDate}} + + + + + + No data matching the filter "{{input.value}}" + + \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts index 0bb19362..3bf70c43 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts @@ -17,7 +17,7 @@ export class WfHistoryComponent { historyDatasource: MatTableDataSource = new MatTableDataSource([]); - colums: string[] = ['processId', 'name', 'family', 'status', 'startDate', 'endDate', 'dsName']; + colums: string[] = ['processId', 'name', 'family', 'dsName', 'status', 'startDate', 'endDate']; total: number = 100 from: number = -1 @@ -55,8 +55,13 @@ export class WfHistoryComponent { @Component({ selector: 'wf-dialog', templateUrl: 'wf-dialog.html', + styleUrls: ['wf-history.component.css'] + }) export class WfDialog { + startDate:string = ''; + endDate:string = ''; + duration:string = ''; wfDatasource: MatTableDataSource = new MatTableDataSource([]); colums: string[] = ['k', 'v']; @@ -66,10 +71,17 @@ export class WfDialog { @Inject(MAT_DIALOG_DATA) public data: WfHistoryEntry, ) { let list:KeyValue[] = []; - for (let [key, value] of new Map(Object.entries(data.details))) { + let map = new Map(Object.entries(data.details)); + for (let [key, value] of map) { list.push({k: key, v: value}); } this.wfDatasource.data = list; + this.startDate = data.startDate; + this.endDate = data.endDate; + this.duration = this.calculateDateDiff( + parseInt(map.get('system:startDate')), + parseInt(map.get('system:endDate')) + ); } applyFilter(event: Event) { const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); @@ -78,4 +90,57 @@ export class WfDialog { onNoClick(): void { this.dialogRef.close(); } + + + calculateDateDiff(start:number, end:number):string { + if (start <= 0 || end <= 0) { + return '-'; + } + var seconds = 0; + var minutes = 0; + var hours = 0; + var days = 0; + + if (end > start) { + seconds = Math.round((end - start) / 1000); + if (seconds > 60) { + minutes = Math.floor(seconds / 60); + seconds = seconds % 60; + if (minutes > 60) { + hours = Math.floor(minutes / 60); + minutes = minutes % 60; + if (hours > 24) { + days = Math.floor(hours / 24); + hours = hours % 24; + } + } + } + } + var res = ''; + if (days > 0) { + if (res) { res += ', '; } + res += days + " day(s)" + } + if (hours > 0) { + if (res) { res += ', '; } + res += hours + " hour(s)" + } + if (minutes > 0) { + if (res) { res += ', '; } + res += minutes + " minute(s)" + } + if (seconds > 0) { + if (res) { res += ', '; } + res += seconds + " second(s)" + } + if (!res) { + res = '0 seconds'; + } + + return res; +} + + + + } \ No newline at end of file diff --git a/frontends/dnet-is-application/src/styles.css b/frontends/dnet-is-application/src/styles.css index 4acdef93..642ee400 100644 --- a/frontends/dnet-is-application/src/styles.css +++ b/frontends/dnet-is-application/src/styles.css @@ -15,7 +15,7 @@ table { font-family: monospace; } -a:not([href]) { +a, a:not([href]) { cursor: pointer; -webkit-user-select: none; -moz-user-select: none; @@ -24,4 +24,22 @@ a:not([href]) { text-underline-offset: 3px; color: #336699; } - \ No newline at end of file + +table { + table-layout: fixed !important; +} + +tr { + height: auto !important; +} + +th, td { + white-space: nowrap !important; + overflow: hidden !important; + text-overflow: ellipsis !important; + font-size: 0.9em !important; + padding-top: 0.5em !important; + padding-bottom: 0.5em !important; +} + +.muted { color: darkgray; } -- 2.17.1 From d11c51879eb0113f19858187d520f3009230f246 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Tue, 24 Jan 2023 10:38:39 +0100 Subject: [PATCH 08/43] sort --- .../dnet-is-application/src/app/app.module.ts | 5 +++- .../app/wf-history/wf-history.component.html | 22 +++++++++--------- .../app/wf-history/wf-history.component.ts | 23 ++++++++++++++++--- frontends/dnet-is-application/src/styles.css | 2 ++ 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 35ac35ef..29c4a6a1 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -25,6 +25,8 @@ import { MainMenuPanelsComponent } from './main-menu-panels/main-menu-panels.com import { MatExpansionModule } from '@angular/material/expansion'; import { WfDialog, WfHistoryComponent } from './wf-history/wf-history.component'; import { MatDialogModule } from '@angular/material/dialog'; +import {MatSortModule} from '@angular/material/sort' + @NgModule({ declarations: [ @@ -55,7 +57,8 @@ import { MatDialogModule } from '@angular/material/dialog'; MatInputModule, MatTableModule, MatExpansionModule, - MatDialogModule + MatDialogModule, + MatSortModule ], providers: [], bootstrap: [AppComponent] diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html index 7708ed95..87576383 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html @@ -18,42 +18,42 @@ Count : {{historyDatasource.filteredData.length}}

- +
- + - + - + - + - - + + - - + + - - + + diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts index 3bf70c43..081b5c4b 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts @@ -1,19 +1,21 @@ -import { Component, Inject } from '@angular/core'; +import { Component, Inject,AfterViewInit, ViewChild } from '@angular/core'; import { ISService } from '../is.service'; import { MatTableDataSource } from '@angular/material/table'; +import { MatSort, Sort } from '@angular/material/sort'; import { WfHistoryEntry } from '../model/controller.model'; import { ActivatedRoute } from '@angular/router'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { KeyValue } from '../model/controller.model'; +import {LiveAnnouncer} from '@angular/cdk/a11y'; @Component({ selector: 'app-wf-history', templateUrl: './wf-history.component.html', styleUrls: ['./wf-history.component.css'] }) -export class WfHistoryComponent { +export class WfHistoryComponent implements AfterViewInit { historyDatasource: MatTableDataSource = new MatTableDataSource([]); @@ -23,7 +25,7 @@ export class WfHistoryComponent { from: number = -1 to: number = -1 - constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { + constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog, private _liveAnnouncer: LiveAnnouncer) { let totalP = route.snapshot.paramMap.get('total'); let fromP = route.snapshot.queryParamMap.get('from'); @@ -40,6 +42,13 @@ export class WfHistoryComponent { }) } + @ViewChild(MatSort) sort: MatSort | undefined + + ngAfterViewInit() { + if(this.sort) this.historyDatasource.sort = this.sort; + } + + applyFilter(event: Event) { const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); this.historyDatasource.filter = filterValue; @@ -50,6 +59,14 @@ export class WfHistoryComponent { data: wf }); } + + updateSort(sortState: Sort) { + if (sortState.direction) { + this._liveAnnouncer.announce(`Sorted ${sortState.direction}ending`); + } else { + this._liveAnnouncer.announce('Sorting cleared'); + } + } } @Component({ diff --git a/frontends/dnet-is-application/src/styles.css b/frontends/dnet-is-application/src/styles.css index 642ee400..91fc6ab2 100644 --- a/frontends/dnet-is-application/src/styles.css +++ b/frontends/dnet-is-application/src/styles.css @@ -33,6 +33,8 @@ tr { height: auto !important; } +th.mat-sort-header-sorted { color: black !important; } + th, td { white-space: nowrap !important; overflow: hidden !important; -- 2.17.1 From f1183df7496bd6c5c7ae4146cc9cc48f315e0092 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Tue, 24 Jan 2023 10:45:59 +0100 Subject: [PATCH 09/43] sort --- .../src/app/wf-history/wf-history.component.html | 3 +-- .../src/app/wf-history/wf-history.component.ts | 12 ++---------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html index 87576383..0630a642 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html @@ -5,7 +5,6 @@ -

Recent workflows (max {{total}}) Workflows from {{from | date:"yyyy-MM-dd HH:mm:ss"}} to {{to | @@ -18,7 +17,7 @@ Count : {{historyDatasource.filteredData.length}}

-
Process Id Process Id {{element.processId}} Workflow Name Workflow Name {{element.name}} Workflow Family Workflow Family {{element.family}} Datasource Datasource {{element.dsName}} Status Status {{element.status}} Start Date Start Date {{element.startDate}} End Date End Date {{element.endDate}}
+
diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts index 081b5c4b..ea83eed5 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts @@ -8,7 +8,6 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { KeyValue } from '../model/controller.model'; -import {LiveAnnouncer} from '@angular/cdk/a11y'; @Component({ selector: 'app-wf-history', @@ -25,7 +24,7 @@ export class WfHistoryComponent implements AfterViewInit { from: number = -1 to: number = -1 - constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog, private _liveAnnouncer: LiveAnnouncer) { + constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { let totalP = route.snapshot.paramMap.get('total'); let fromP = route.snapshot.queryParamMap.get('from'); @@ -59,14 +58,7 @@ export class WfHistoryComponent implements AfterViewInit { data: wf }); } - - updateSort(sortState: Sort) { - if (sortState.direction) { - this._liveAnnouncer.announce(`Sorted ${sortState.direction}ending`); - } else { - this._liveAnnouncer.announce('Sorting cleared'); - } - } + } @Component({ -- 2.17.1 From cfcd1493a1a3b64b6afd9c3ecadd5342a61831f6 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Tue, 24 Jan 2023 11:11:25 +0100 Subject: [PATCH 10/43] colored badge --- .../main-menu-panels.component.css | 1 - .../app/wf-history/wf-history.component.html | 2 +- frontends/dnet-is-application/src/styles.css | 23 +++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css index 7c244416..024bc9b7 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css @@ -14,5 +14,4 @@ .collapse-buttons { text-align: right; } .collapse-buttons button { font-size: 0.6em; } - .mat-expansion-panel-spacing { margin: 0; } diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html index 0630a642..547c1c3f 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html @@ -43,7 +43,7 @@ - + diff --git a/frontends/dnet-is-application/src/styles.css b/frontends/dnet-is-application/src/styles.css index 91fc6ab2..dc1ecaae 100644 --- a/frontends/dnet-is-application/src/styles.css +++ b/frontends/dnet-is-application/src/styles.css @@ -45,3 +45,26 @@ th, td { } .muted { color: darkgray; } + +.badge-label { + padding-top: 0.3em; + padding-bottom: 0.3em; + padding-left: 0.5em; + padding-right: 0.5em; + border-radius: 0.7em; + font-size: 0.9em; + color: #fff; + text-align: center; +} + +.badge-success { + background-color:darkgreen; +} + +.badge-failure { + background-color:red; +} + +.badge-warning { + background-color:darkorange; +} \ No newline at end of file -- 2.17.1 From 085c3123de9fd567d82bd30be15918485f271afa Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Tue, 24 Jan 2023 14:11:39 +0100 Subject: [PATCH 11/43] menu --- .../src/app/app-routing.module.ts | 4 +- .../src/app/app.component.html | 5 +-- .../dnet-is-application/src/app/app.module.ts | 6 ++- .../main-menu-panels.component.css | 27 ++++++++++-- .../main-menu-panels.component.html | 44 ++++++++++++------- .../main-menu-panels.component.ts | 3 +- .../src/app/resources/resources.component.css | 0 .../app/resources/resources.component.html | 1 + .../app/resources/resources.component.spec.ts | 23 ++++++++++ .../src/app/resources/resources.component.ts | 10 +++++ frontends/dnet-is-application/src/styles.css | 4 ++ 11 files changed, 100 insertions(+), 27 deletions(-) create mode 100644 frontends/dnet-is-application/src/app/resources/resources.component.css create mode 100644 frontends/dnet-is-application/src/app/resources/resources.component.html create mode 100644 frontends/dnet-is-application/src/app/resources/resources.component.spec.ts create mode 100644 frontends/dnet-is-application/src/app/resources/resources.component.ts diff --git a/frontends/dnet-is-application/src/app/app-routing.module.ts b/frontends/dnet-is-application/src/app/app-routing.module.ts index 16f82460..0167562b 100644 --- a/frontends/dnet-is-application/src/app/app-routing.module.ts +++ b/frontends/dnet-is-application/src/app/app-routing.module.ts @@ -3,11 +3,13 @@ import { RouterModule, Routes } from '@angular/router'; import { InfoComponent } from './info/info.component'; import { ProtocolsComponent } from './protocols/protocols.component'; import { WfHistoryComponent } from './wf-history/wf-history.component'; +import { ResourcesComponent } from './resources/resources.component'; const routes: Routes = [ { path:"info" , component:InfoComponent}, { path:"adv_resources/protocol" , component:ProtocolsComponent}, - { path:"wf_history" , component:WfHistoryComponent} + { path:"wf_history" , component:WfHistoryComponent}, + { path:"resources/:type" , component:ResourcesComponent} ]; @NgModule({ diff --git a/frontends/dnet-is-application/src/app/app.component.html b/frontends/dnet-is-application/src/app/app.component.html index 104f1eed..0ce85cdd 100644 --- a/frontends/dnet-is-application/src/app/app.component.html +++ b/frontends/dnet-is-application/src/app/app.component.html @@ -1,5 +1,5 @@ - @@ -12,8 +12,7 @@ type="button" aria-label="Toggle sidenav" mat-icon-button - (click)="drawer.toggle()" - *ngIf="isHandset$ | async"> + (click)="drawer.toggle()"> menu {{title}} diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 29c4a6a1..5b183555 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -25,7 +25,8 @@ import { MainMenuPanelsComponent } from './main-menu-panels/main-menu-panels.com import { MatExpansionModule } from '@angular/material/expansion'; import { WfDialog, WfHistoryComponent } from './wf-history/wf-history.component'; import { MatDialogModule } from '@angular/material/dialog'; -import {MatSortModule} from '@angular/material/sort' +import {MatSortModule} from '@angular/material/sort'; +import { ResourcesComponent } from './resources/resources.component' @NgModule({ @@ -36,7 +37,8 @@ import {MatSortModule} from '@angular/material/sort' InfoComponent, ProtocolsComponent, WfHistoryComponent, - WfDialog + WfDialog, + ResourcesComponent ], imports: [ BrowserModule, diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css index 024bc9b7..c6d4c582 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css @@ -4,14 +4,35 @@ padding-left: 0.4em; padding-right: 0.4em; border-radius: 1em; - font-size: 0.7em; color: #fff; background-color:cornflowerblue; - width: 2em; text-align: center; - float: right; + } .collapse-buttons { text-align: right; } .collapse-buttons button { font-size: 0.6em; } .mat-expansion-panel-spacing { margin: 0; } + +.menu-item { + padding-top: 0.3em; + padding-bottom: 0.3em; + padding-left: 7%; + padding-right: 3%; + font-size: 0.9em; + width: 90%; + color: #696969; + text-decoration: none !important; + display: inline-block; +} + +.menu-item:hover { + color: #999; + background-color: #eaeaea; +} + +.menu-item .badge-label { + font-size: 0.6em; + float: right; + width: 2em; +} \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html index 296d335b..903b5073 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html @@ -9,15 +9,15 @@ Home -

...

+
...
Datasources - - Search - +
+ Search +
@@ -25,39 +25,49 @@ Simple Resources - + Advanced Resources - + Logs - - Workflow History - + Info - - Container Info - + - \ No newline at end of file + diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts index bf0046b7..cb8a0bc2 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts @@ -1,8 +1,9 @@ -import {Component, ViewChild} from '@angular/core'; +import {Component, ViewChild, ViewEncapsulation} from '@angular/core'; import { ResourceType } from '../model/controller.model'; import { ISService } from '../is.service'; import {MatAccordion} from '@angular/material/expansion'; + @Component({ selector: 'app-main-menu-panels', templateUrl: './main-menu-panels.component.html', diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.css b/frontends/dnet-is-application/src/app/resources/resources.component.css new file mode 100644 index 00000000..e69de29b diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.html b/frontends/dnet-is-application/src/app/resources/resources.component.html new file mode 100644 index 00000000..f081ce30 --- /dev/null +++ b/frontends/dnet-is-application/src/app/resources/resources.component.html @@ -0,0 +1 @@ +

resources works!

diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.spec.ts b/frontends/dnet-is-application/src/app/resources/resources.component.spec.ts new file mode 100644 index 00000000..636bc3d8 --- /dev/null +++ b/frontends/dnet-is-application/src/app/resources/resources.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ResourcesComponent } from './resources.component'; + +describe('ResourcesComponent', () => { + let component: ResourcesComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ResourcesComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ResourcesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.ts b/frontends/dnet-is-application/src/app/resources/resources.component.ts new file mode 100644 index 00000000..4e313a7e --- /dev/null +++ b/frontends/dnet-is-application/src/app/resources/resources.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-resources', + templateUrl: './resources.component.html', + styleUrls: ['./resources.component.css'] +}) +export class ResourcesComponent { + +} diff --git a/frontends/dnet-is-application/src/styles.css b/frontends/dnet-is-application/src/styles.css index dc1ecaae..4f8289b6 100644 --- a/frontends/dnet-is-application/src/styles.css +++ b/frontends/dnet-is-application/src/styles.css @@ -67,4 +67,8 @@ th, td { .badge-warning { background-color:darkorange; +} + +.badge-info { + background-color: cornflowerblue } \ No newline at end of file -- 2.17.1 From 0a8a1ec118f731d0b84f3f0166c3559e7604ee85 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Wed, 25 Jan 2023 16:08:32 +0100 Subject: [PATCH 12/43] edit metadata of simple resources --- .../dnet-is-application/src/app/app.module.ts | 13 +- .../dnet-is-application/src/app/is.service.ts | 21 ++- .../main-menu-panels.component.html | 4 +- .../src/app/model/controller.model.ts | 15 +- .../src/app/resources/content-dialog.html | 9 + .../src/app/resources/metadata-dialog.html | 35 ++++ .../src/app/resources/new-dialog.html | 9 + .../app/resources/resources.component.html | 30 +++- .../src/app/resources/resources.component.ts | 164 +++++++++++++++++- .../src/app/wf-history/wf-dialog.html | 2 +- .../app/wf-history/wf-history.component.ts | 43 +++-- frontends/dnet-is-application/src/styles.css | 5 +- 12 files changed, 313 insertions(+), 37 deletions(-) create mode 100644 frontends/dnet-is-application/src/app/resources/content-dialog.html create mode 100644 frontends/dnet-is-application/src/app/resources/metadata-dialog.html create mode 100644 frontends/dnet-is-application/src/app/resources/new-dialog.html diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 5b183555..a8557902 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -3,7 +3,7 @@ import { BrowserModule } from '@angular/platform-browser'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; -import { FormsModule } from '@angular/forms'; +import { FormsModule,ReactiveFormsModule } from '@angular/forms'; import { HttpClientModule } from '@angular/common/http'; import { InfoComponent } from './info/info.component'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -26,8 +26,7 @@ import { MatExpansionModule } from '@angular/material/expansion'; import { WfDialog, WfHistoryComponent } from './wf-history/wf-history.component'; import { MatDialogModule } from '@angular/material/dialog'; import {MatSortModule} from '@angular/material/sort'; -import { ResourcesComponent } from './resources/resources.component' - +import { ResourcesComponent, ResContentDialog, ResCreateNewDialog, ResMetadataDialog } from './resources/resources.component' @NgModule({ declarations: [ @@ -38,7 +37,10 @@ import { ResourcesComponent } from './resources/resources.component' ProtocolsComponent, WfHistoryComponent, WfDialog, - ResourcesComponent + ResourcesComponent, + ResContentDialog, + ResCreateNewDialog, + ResMetadataDialog ], imports: [ BrowserModule, @@ -60,7 +62,8 @@ import { ResourcesComponent } from './resources/resources.component' MatTableModule, MatExpansionModule, MatDialogModule, - MatSortModule + MatSortModule, + ReactiveFormsModule ], providers: [], bootstrap: [AppComponent] diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts index 3b2dcb77..41d2f72d 100644 --- a/frontends/dnet-is-application/src/app/is.service.ts +++ b/frontends/dnet-is-application/src/app/is.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; -import { ResourceType,Protocol,WfHistoryEntry } from './model/controller.model'; +import { ResourceType,Protocol,WfHistoryEntry,SimpleResource } from './model/controller.model'; import { Observable, Observer } from 'rxjs'; @Injectable({ @@ -15,6 +15,10 @@ export class ISService { return this.client.get("/ajax/resourceTypes"); } + loadResourceType(id:string):Observable { + return this.client.get("/ajax/resourceTypes/" + encodeURIComponent(id)); + } + loadInfo():Observable { return this.client.get("/ajax/info/"); } @@ -23,14 +27,25 @@ export class ISService { return this.client.get("/ajax/protocols/"); } + loadSimpleResources(type:string):Observable { + return this.client.get("/ajax/resources/" + encodeURIComponent(type)); + } + + saveSimpleResourceMedatata(res:SimpleResource):Observable { + return this.client.post('/ajax/resources/' + encodeURIComponent(res.id) + '/metadata', res); + } + + deleteSimpleResource(res:SimpleResource):Observable { + return this.client.delete('/ajax/resources/' + encodeURIComponent(res.id)); + } + loadWfHistory(total?:number, from?:number, to?:number):Observable { let params = new HttpParams(); if (total && total > 0) { params = params.append('total', total); } if (from && from > 0) { params = params.append('from', from); } if (to && to > 0) { params = params.append('to', to); } - - + return this.client.get('/ajax/wfs/', {params: params}); } diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html index 903b5073..07cac31a 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html @@ -1,7 +1,7 @@
- - + +
diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts index ae71bdaf..80a686e4 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -11,12 +11,12 @@ export interface KeyValue { v: string; } - export interface Module { +export interface Module { group: string; name: string; versions: string[]; files: string[]; - } +} export interface ProtocolParams { name:string @@ -42,4 +42,13 @@ export interface WfHistoryEntry { dsName?: string, dsApi?: string, details: Map -} \ No newline at end of file +} + +export interface SimpleResource { + id: string, + name: string, + type: string, + description?: string, + creationDate?: string, + modificationDate?: string +} diff --git a/frontends/dnet-is-application/src/app/resources/content-dialog.html b/frontends/dnet-is-application/src/app/resources/content-dialog.html new file mode 100644 index 00000000..bfd3c108 --- /dev/null +++ b/frontends/dnet-is-application/src/app/resources/content-dialog.html @@ -0,0 +1,9 @@ +

Edit content

+ +
+ CONTENT FORM HERE +
+ +
+ +
diff --git a/frontends/dnet-is-application/src/app/resources/metadata-dialog.html b/frontends/dnet-is-application/src/app/resources/metadata-dialog.html new file mode 100644 index 00000000..8d86b8ed --- /dev/null +++ b/frontends/dnet-is-application/src/app/resources/metadata-dialog.html @@ -0,0 +1,35 @@ +
+

Edit metadata

+ +
+ + + ID + + This field should not be empty + + + + Type + + This field should not be empty + + + + Name + + This field is required + + + + Description + + +
+ +
+ + +
+ + diff --git a/frontends/dnet-is-application/src/app/resources/new-dialog.html b/frontends/dnet-is-application/src/app/resources/new-dialog.html new file mode 100644 index 00000000..9f20b5fd --- /dev/null +++ b/frontends/dnet-is-application/src/app/resources/new-dialog.html @@ -0,0 +1,9 @@ +

New resource

+ +
+ NEW RESOURCE FORM HERE +
+ +
+ +
diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.html b/frontends/dnet-is-application/src/app/resources/resources.component.html index f081ce30..1b390ce4 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.html +++ b/frontends/dnet-is-application/src/app/resources/resources.component.html @@ -1 +1,29 @@ -

resources works!

+

{{type.name}}

+ + + + + Filter + + + + + + {{r.name}} {{type.contentType}} + + +

{{r.description}}

+

+ Id: {{r.id}}
Creation date: {{r.creationDate}}
Modification date: {{r.modificationDate}} +

+
+ + + + raw content + + +
+ + + diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.ts b/frontends/dnet-is-application/src/app/resources/resources.component.ts index 4e313a7e..922c0a26 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.ts +++ b/frontends/dnet-is-application/src/app/resources/resources.component.ts @@ -1,10 +1,170 @@ -import { Component } from '@angular/core'; +import { Component, Inject,AfterViewInit, ViewChild, OnInit } from '@angular/core'; +import { ISService } from '../is.service'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatSort, Sort } from '@angular/material/sort'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { ResourceType, SimpleResource } from '../model/controller.model'; +import {FormControl, FormGroup, FormGroupDirective, NgForm, Validators} from '@angular/forms'; +import { ResourceLoader } from '@angular/compiler'; + @Component({ selector: 'app-resources', templateUrl: './resources.component.html', styleUrls: ['./resources.component.css'] }) -export class ResourcesComponent { +export class ResourcesComponent implements OnInit { + typeId:string = ''; + type:ResourceType = { id: '', name: '', contentType: '', count: 0, simple: true }; + resources:SimpleResource[] = []; + constructor(public service: ISService, public route: ActivatedRoute, public newDialog: MatDialog, public contentDialog: MatDialog, public metadataDialog: MatDialog) { + } + + ngOnInit() { + this.route.params.subscribe(params => { + this.typeId = params['type']; + this.service.loadResourceType(this.typeId).subscribe({ + next: (data: ResourceType) => this.type = data, + error: error => console.log(error), + complete: () => console.log("Completed") + }); + this.reload() + }); + } + + reload() { + if (this.typeId) { + console.log('reload'); + this.service.loadSimpleResources(this.typeId).subscribe({ + next: (data: SimpleResource[]) => this.resources = data, + error: error => console.log(error), + complete: () => console.log("Completed") + }); + } + } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); + //this.historyDatasource.filter = filterValue; + } + + openNewDialog(): void { + const dialogRef = this.newDialog.open(ResCreateNewDialog, { + data: { + + } + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); + } + + openMetadataDialog(r:SimpleResource): void { + const dialogRef = this.metadataDialog.open(ResMetadataDialog, { + data: r + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); + } + + openContentDialog(r:SimpleResource): void { + const dialogRef = this.contentDialog.open(ResContentDialog, { + data: r + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); + } + + deleteResource(r:SimpleResource) { + if (confirm('Are you sure?')) { + this.service.deleteSimpleResource(r).subscribe({ + next: (data: void) => this.reload(), + error: error => console.log(error), + complete: () => console.log("Completed") + }); + } + + } } + + +@Component({ + selector: 'res-content-dialog', + templateUrl: 'content-dialog.html', + styleUrls: ['resources.component.css'] + +}) +export class ResContentDialog { + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: SimpleResource, public service: ISService) { + + } + + onNoClick(): void { + this.dialogRef.close(); + } +} + +@Component({ + selector: 'res-metadata-dialog', + templateUrl: 'metadata-dialog.html', + styleUrls: ['resources.component.css'] + +}) +export class ResMetadataDialog { + metadataForm = new FormGroup({ + id: new FormControl('', [Validators.required]), + type: new FormControl('', [Validators.required]), + name: new FormControl('', [Validators.required]), + description : new FormControl('', []) + }); + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: SimpleResource, public service: ISService) { + this.metadataForm.get('id')?.setValue(data.id); + this.metadataForm.get('type')?.setValue(data.type); + this.metadataForm.get('name')?.setValue(data.name); + if (data.description) { + this.metadataForm.get('description')?.setValue(data.description); + } + } + + onSubmit():void { + const res = Object.assign({}, this.data, this.metadataForm.value); + + this.service.saveSimpleResourceMedatata(res).subscribe({ + next: (data: void) => { + this.dialogRef.close(1) + }, + error: error => console.log(error), + complete: () => console.log("Completed") + }); + } + + onNoClick(): void { + this.dialogRef.close(); + } +} + +@Component({ + selector: 'res-new-dialog', + templateUrl: 'new-dialog.html', + styleUrls: ['resources.component.css'] + +}) +export class ResCreateNewDialog { + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public resource: string, public service: ISService) { + + } + + onNoClick(): void { + this.dialogRef.close(); + } +} \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html b/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html index a68c3ffa..9e3a7347 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html +++ b/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html @@ -36,5 +36,5 @@
- +
diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts index ea83eed5..fa6077e3 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts @@ -1,10 +1,10 @@ -import { Component, Inject,AfterViewInit, ViewChild } from '@angular/core'; +import { Component, Inject,AfterViewInit, OnInit, ViewChild } from '@angular/core'; import { ISService } from '../is.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatSort, Sort } from '@angular/material/sort'; import { WfHistoryEntry } from '../model/controller.model'; -import { ActivatedRoute } from '@angular/router'; -import { Observable } from 'rxjs'; +import { ActivatedRoute, Params } from '@angular/router'; +import { Observable, combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { KeyValue } from '../model/controller.model'; @@ -14,7 +14,7 @@ import { KeyValue } from '../model/controller.model'; templateUrl: './wf-history.component.html', styleUrls: ['./wf-history.component.css'] }) -export class WfHistoryComponent implements AfterViewInit { +export class WfHistoryComponent implements AfterViewInit , OnInit{ historyDatasource: MatTableDataSource = new MatTableDataSource([]); @@ -24,21 +24,28 @@ export class WfHistoryComponent implements AfterViewInit { from: number = -1 to: number = -1 - constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { + constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { + } - let totalP = route.snapshot.paramMap.get('total'); - let fromP = route.snapshot.queryParamMap.get('from'); - let toP = route.snapshot.queryParamMap.get('to'); - - if (totalP) { this.total = parseInt(totalP); } - if (fromP) { this.from = parseInt(fromP); } - if (toP) { this.to = parseInt(toP); } - - this.service.loadWfHistory(this.total, this.from, this.to).subscribe({ - next: (data: WfHistoryEntry[]) => this.historyDatasource.data = data, - error: error => console.log(error), - complete: () => console.log("Completed") - }) + ngOnInit() { + combineLatest([ this.route.params, this.route.queryParams ], + (params: Params, queryParams: Params) => ({ params, queryParams }) + ).subscribe((res: { params: Params; queryParams: Params }) => { + const { params, queryParams} = res; + let totalP = queryParams['total']; + let fromP = queryParams['from']; + let toP = queryParams['to']; + + if (totalP) { this.total = parseInt(totalP); } + if (fromP) { this.from = parseInt(fromP); } + if (toP) { this.to = parseInt(toP); } + + this.service.loadWfHistory(this.total, this.from, this.to).subscribe({ + next: (data: WfHistoryEntry[]) => this.historyDatasource.data = data, + error: error => console.log(error), + complete: () => console.log("Completed") + }) + }); } @ViewChild(MatSort) sort: MatSort | undefined diff --git a/frontends/dnet-is-application/src/styles.css b/frontends/dnet-is-application/src/styles.css index 4f8289b6..f08e01a5 100644 --- a/frontends/dnet-is-application/src/styles.css +++ b/frontends/dnet-is-application/src/styles.css @@ -3,6 +3,9 @@ html, body { height: 100%; } body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } +.small { font-size: 0.9em !important; } +.muted { color: darkgray; } + table { width: 100%; } @@ -44,8 +47,6 @@ th, td { padding-bottom: 0.5em !important; } -.muted { color: darkgray; } - .badge-label { padding-top: 0.3em; padding-bottom: 0.3em; -- 2.17.1 From f4f076dc6a265827c0637f97e583ddfa8936d72a Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Thu, 26 Jan 2023 08:28:12 +0100 Subject: [PATCH 13/43] filter --- .../dnet-is-application/src/app/app.module.ts | 3 ++- .../src/app/pipes/filter.pipe.ts | 25 +++++++++++++++++++ .../app/resources/resources.component.html | 7 +++--- .../src/app/resources/resources.component.ts | 6 +---- 4 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 frontends/dnet-is-application/src/app/pipes/filter.pipe.ts diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index a8557902..4d2bc0a6 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; - +import { FilterPipe } from './pipes/filter.pipe'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { FormsModule,ReactiveFormsModule } from '@angular/forms'; @@ -31,6 +31,7 @@ import { ResourcesComponent, ResContentDialog, ResCreateNewDialog, ResMetadataDi @NgModule({ declarations: [ AppComponent, + FilterPipe, MainMenuPanelsComponent, MainMenuTreeComponent, InfoComponent, diff --git a/frontends/dnet-is-application/src/app/pipes/filter.pipe.ts b/frontends/dnet-is-application/src/app/pipes/filter.pipe.ts new file mode 100644 index 00000000..9fa31760 --- /dev/null +++ b/frontends/dnet-is-application/src/app/pipes/filter.pipe.ts @@ -0,0 +1,25 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ name: 'searchFilter' }) +export class FilterPipe implements PipeTransform { + /** + * Pipe filters the list of elements based on the search text provided + * + * @param items list of elements to search in + * @param searchText search string + * @returns list of elements filtered by search text or [] + */ + + transform(items: any[], searchText: string): any[] { + if (!items) return []; + if (!searchText) return items; + + searchText = searchText.trim().toLocaleLowerCase(); + + return items.filter(obj => { + return Object.keys(obj).reduce((acc, curr) => { + return acc || String(obj[curr]).toLowerCase().includes(searchText); + }, false); + }); + } +} \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.html b/frontends/dnet-is-application/src/app/resources/resources.component.html index 1b390ce4..3f9adc38 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.html +++ b/frontends/dnet-is-application/src/app/resources/resources.component.html @@ -3,11 +3,12 @@ - Filter - + Filter (Total: {{(resources | searchFilter: searchText).length}}) + - + + {{r.name}} {{type.contentType}} diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.ts b/frontends/dnet-is-application/src/app/resources/resources.component.ts index 922c0a26..7d31b96c 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.ts +++ b/frontends/dnet-is-application/src/app/resources/resources.component.ts @@ -20,6 +20,7 @@ export class ResourcesComponent implements OnInit { typeId:string = ''; type:ResourceType = { id: '', name: '', contentType: '', count: 0, simple: true }; resources:SimpleResource[] = []; + searchText:string = ''; constructor(public service: ISService, public route: ActivatedRoute, public newDialog: MatDialog, public contentDialog: MatDialog, public metadataDialog: MatDialog) { } @@ -47,11 +48,6 @@ export class ResourcesComponent implements OnInit { } } - applyFilter(event: Event) { - const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); - //this.historyDatasource.filter = filterValue; - } - openNewDialog(): void { const dialogRef = this.newDialog.open(ResCreateNewDialog, { data: { -- 2.17.1 From c8b8bf0dfdc78103231721af21e10f20b63be031 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Thu, 26 Jan 2023 08:39:21 +0100 Subject: [PATCH 14/43] removed menu label --- frontends/dnet-is-application/src/app/app.component.html | 1 - .../src/app/main-menu-panels/main-menu-panels.component.html | 1 - 2 files changed, 2 deletions(-) diff --git a/frontends/dnet-is-application/src/app/app.component.html b/frontends/dnet-is-application/src/app/app.component.html index 0ce85cdd..2a61e2f8 100644 --- a/frontends/dnet-is-application/src/app/app.component.html +++ b/frontends/dnet-is-application/src/app/app.component.html @@ -3,7 +3,6 @@ [attr.role]="(isHandset$ | async) ? 'dialog' : 'navigation'" [mode]="(isHandset$ | async) ? 'over' : 'side'" [opened]="(isHandset$ | async) === false"> - Menu
diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html index 07cac31a..c09e72f0 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html @@ -1,4 +1,3 @@ -
-- 2.17.1 From 229e7798d0023d182bf3daa46c070ef3e3973981 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Thu, 26 Jan 2023 10:55:02 +0100 Subject: [PATCH 15/43] form to add a resource --- .../dnet-is-application/src/app/is.service.ts | 27 +++++- .../src/app/resources/content-dialog.html | 29 +++++-- .../src/app/resources/new-dialog.html | 35 ++++++-- .../src/app/resources/resources.component.ts | 83 ++++++++++++++----- 4 files changed, 140 insertions(+), 34 deletions(-) diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts index 41d2f72d..4921b206 100644 --- a/frontends/dnet-is-application/src/app/is.service.ts +++ b/frontends/dnet-is-application/src/app/is.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { HttpClient, HttpParams } from '@angular/common/http'; +import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { ResourceType,Protocol,WfHistoryEntry,SimpleResource } from './model/controller.model'; import { Observable, Observer } from 'rxjs'; @@ -31,10 +31,35 @@ export class ISService { return this.client.get("/ajax/resources/" + encodeURIComponent(type)); } + loadSimpleResourceContent(id:any):Observable { + const headers = new HttpHeaders().set('Content-Type', 'text/plain; charset=utf-8'); + return this.client.get("/ajax/resources/" + encodeURIComponent(id) + '/content', { + headers, responseType: 'text' as 'json' + }); + } + saveSimpleResourceMedatata(res:SimpleResource):Observable { return this.client.post('/ajax/resources/' + encodeURIComponent(res.id) + '/metadata', res); } + saveSimpleResourceContent(id:string, content:string):Observable { + const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded') + let body = new HttpParams().set('content', content); + return this.client.post('/ajax/resources/' + encodeURIComponent(id) + '/content', body, { headers: headers }); + } + + addSimpleResource(name:string, type:string, description:string, content:string):Observable { + const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded') + let body = new HttpParams() + .set('name', name) + .set('type', type) + .set('description', description) + .set('content', content); + return this.client.post('/ajax/resources/', body, { headers: headers }); + } + + + deleteSimpleResource(res:SimpleResource):Observable { return this.client.delete('/ajax/resources/' + encodeURIComponent(res.id)); } diff --git a/frontends/dnet-is-application/src/app/resources/content-dialog.html b/frontends/dnet-is-application/src/app/resources/content-dialog.html index bfd3c108..80aab07f 100644 --- a/frontends/dnet-is-application/src/app/resources/content-dialog.html +++ b/frontends/dnet-is-application/src/app/resources/content-dialog.html @@ -1,9 +1,24 @@ -

Edit content

+
-
- CONTENT FORM HERE -
+

Edit content

-
- -
+
+ + + ID + + + + + Content ({{data.contentType}}) + + This field is required + +
+ +
+ + +
+ + diff --git a/frontends/dnet-is-application/src/app/resources/new-dialog.html b/frontends/dnet-is-application/src/app/resources/new-dialog.html index 9f20b5fd..6a799919 100644 --- a/frontends/dnet-is-application/src/app/resources/new-dialog.html +++ b/frontends/dnet-is-application/src/app/resources/new-dialog.html @@ -1,9 +1,30 @@ -

New resource

+
+

New Resource

-
- NEW RESOURCE FORM HERE -
+
-
- -
+ + Name + + This field is required + + + + Description + + + + + Content ({{data.contentType}}) + + This field is required + + +
+ +
+ + +
+ + diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.ts b/frontends/dnet-is-application/src/app/resources/resources.component.ts index 7d31b96c..9ed5ea6a 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.ts +++ b/frontends/dnet-is-application/src/app/resources/resources.component.ts @@ -39,7 +39,6 @@ export class ResourcesComponent implements OnInit { reload() { if (this.typeId) { - console.log('reload'); this.service.loadSimpleResources(this.typeId).subscribe({ next: (data: SimpleResource[]) => this.resources = data, error: error => console.log(error), @@ -50,9 +49,8 @@ export class ResourcesComponent implements OnInit { openNewDialog(): void { const dialogRef = this.newDialog.open(ResCreateNewDialog, { - data: { - - } + data: this.type, + width: '80%' }); dialogRef.afterClosed().subscribe(result => { @@ -62,7 +60,8 @@ export class ResourcesComponent implements OnInit { openMetadataDialog(r:SimpleResource): void { const dialogRef = this.metadataDialog.open(ResMetadataDialog, { - data: r + data: r, + width: '80%' }); dialogRef.afterClosed().subscribe(result => { @@ -71,12 +70,24 @@ export class ResourcesComponent implements OnInit { } openContentDialog(r:SimpleResource): void { - const dialogRef = this.contentDialog.open(ResContentDialog, { - data: r - }); + this.service.loadSimpleResourceContent(r.id).subscribe({ + next: (data: string) => { - dialogRef.afterClosed().subscribe(result => { - if (result) this.reload(); + const dialogRef = this.contentDialog.open(ResContentDialog, { + data: { + id: r.id, + contentType: this.type.contentType, + content: data + }, + width: '80%' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); + }, + error: error => console.log(error), + complete: () => console.log("Completed") }); } @@ -97,11 +108,29 @@ export class ResourcesComponent implements OnInit { selector: 'res-content-dialog', templateUrl: 'content-dialog.html', styleUrls: ['resources.component.css'] - }) export class ResContentDialog { - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: SimpleResource, public service: ISService) { - + contentFormControl = new FormControl('', [Validators.required]); + + contentForm = new FormGroup({ + content : this.contentFormControl + }); + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { + this.contentFormControl.setValue(data.content); + } + + onSubmit():void { + let content = this.contentFormControl.value; + if (content) { + this.service.saveSimpleResourceContent(this.data.id, content).subscribe({ + next: (data: void) => { + this.dialogRef.close(1) + }, + error: error => console.log(error), + complete: () => console.log("Completed") + }); + } } onNoClick(): void { @@ -113,7 +142,6 @@ export class ResContentDialog { selector: 'res-metadata-dialog', templateUrl: 'metadata-dialog.html', styleUrls: ['resources.component.css'] - }) export class ResMetadataDialog { metadataForm = new FormGroup({ @@ -123,7 +151,7 @@ export class ResMetadataDialog { description : new FormControl('', []) }); - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: SimpleResource, public service: ISService) { + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { this.metadataForm.get('id')?.setValue(data.id); this.metadataForm.get('type')?.setValue(data.type); this.metadataForm.get('name')?.setValue(data.name); @@ -153,13 +181,30 @@ export class ResMetadataDialog { selector: 'res-new-dialog', templateUrl: 'new-dialog.html', styleUrls: ['resources.component.css'] - }) export class ResCreateNewDialog { - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public resource: string, public service: ISService) { - - } + newResourceForm = new FormGroup({ + name: new FormControl('', [Validators.required]), + description : new FormControl('', []), + content : new FormControl('', [Validators.required]) + }); + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) {} + onSubmit():void { + let name:string = this.newResourceForm.get('name')?.value!; + let type:string = this.data.id!; + let description:string = this.newResourceForm.get('description')?.value!; + let content:string = this.newResourceForm.get('content')?.value!; + + this.service.addSimpleResource(name, type, description, content).subscribe({ + next: (data: void) => { + this.dialogRef.close(1) + }, + error: error => console.log(error), + complete: () => console.log("Completed") + }); + } onNoClick(): void { this.dialogRef.close(); } -- 2.17.1 From 8ec682096af63b19ec42a2cef4c76e0639b7c644 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Thu, 26 Jan 2023 11:14:41 +0100 Subject: [PATCH 16/43] forms --- .../src/app/resources/content-dialog.html | 4 ++-- .../src/app/resources/metadata-dialog.html | 6 ++---- .../src/app/resources/new-dialog.html | 2 +- .../src/app/resources/resources.component.ts | 16 ++++++---------- 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/frontends/dnet-is-application/src/app/resources/content-dialog.html b/frontends/dnet-is-application/src/app/resources/content-dialog.html index 80aab07f..34484367 100644 --- a/frontends/dnet-is-application/src/app/resources/content-dialog.html +++ b/frontends/dnet-is-application/src/app/resources/content-dialog.html @@ -6,12 +6,12 @@ ID - + Content ({{data.contentType}}) - + This field is required
diff --git a/frontends/dnet-is-application/src/app/resources/metadata-dialog.html b/frontends/dnet-is-application/src/app/resources/metadata-dialog.html index 8d86b8ed..11790198 100644 --- a/frontends/dnet-is-application/src/app/resources/metadata-dialog.html +++ b/frontends/dnet-is-application/src/app/resources/metadata-dialog.html @@ -5,14 +5,12 @@ ID - - This field should not be empty + Type - - This field should not be empty + diff --git a/frontends/dnet-is-application/src/app/resources/new-dialog.html b/frontends/dnet-is-application/src/app/resources/new-dialog.html index 6a799919..3c5934e9 100644 --- a/frontends/dnet-is-application/src/app/resources/new-dialog.html +++ b/frontends/dnet-is-application/src/app/resources/new-dialog.html @@ -16,7 +16,7 @@ Content ({{data.contentType}}) - + This field is required diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.ts b/frontends/dnet-is-application/src/app/resources/resources.component.ts index 9ed5ea6a..76bdd418 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.ts +++ b/frontends/dnet-is-application/src/app/resources/resources.component.ts @@ -110,7 +110,7 @@ export class ResourcesComponent implements OnInit { styleUrls: ['resources.component.css'] }) export class ResContentDialog { - contentFormControl = new FormControl('', [Validators.required]); + contentFormControl = new FormControl(''); contentForm = new FormGroup({ content : this.contentFormControl @@ -145,15 +145,11 @@ export class ResContentDialog { }) export class ResMetadataDialog { metadataForm = new FormGroup({ - id: new FormControl('', [Validators.required]), - type: new FormControl('', [Validators.required]), - name: new FormControl('', [Validators.required]), - description : new FormControl('', []) + name: new FormControl(''), + description : new FormControl('') }); constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { - this.metadataForm.get('id')?.setValue(data.id); - this.metadataForm.get('type')?.setValue(data.type); this.metadataForm.get('name')?.setValue(data.name); if (data.description) { this.metadataForm.get('description')?.setValue(data.description); @@ -184,9 +180,9 @@ export class ResMetadataDialog { }) export class ResCreateNewDialog { newResourceForm = new FormGroup({ - name: new FormControl('', [Validators.required]), - description : new FormControl('', []), - content : new FormControl('', [Validators.required]) + name: new FormControl(''), + description : new FormControl(''), + content : new FormControl('') }); constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) {} -- 2.17.1 From 7235e4ad4e53a930d81471d442b039412bf782cb Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Thu, 26 Jan 2023 12:21:50 +0100 Subject: [PATCH 17/43] error server side --- .../src/app/is-utils.service.spec.ts | 16 ++++++++++++++ .../src/app/is-utils.service.ts | 21 +++++++++++++++++++ .../dnet-is-application/src/app/is.service.ts | 2 -- .../src/app/model/controller.model.ts | 4 ++-- .../src/app/resources/content-dialog.html | 3 +++ .../src/app/resources/metadata-dialog.html | 3 +++ .../src/app/resources/new-dialog.html | 3 +++ .../src/app/resources/resources.component.ts | 14 ++++++------- frontends/dnet-is-application/src/styles.css | 6 ++++++ 9 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 frontends/dnet-is-application/src/app/is-utils.service.spec.ts create mode 100644 frontends/dnet-is-application/src/app/is-utils.service.ts diff --git a/frontends/dnet-is-application/src/app/is-utils.service.spec.ts b/frontends/dnet-is-application/src/app/is-utils.service.spec.ts new file mode 100644 index 00000000..d2561a49 --- /dev/null +++ b/frontends/dnet-is-application/src/app/is-utils.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { IsUtilsService } from './is-utils.service'; + +describe('IsUtilsService', () => { + let service: IsUtilsService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(IsUtilsService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/frontends/dnet-is-application/src/app/is-utils.service.ts b/frontends/dnet-is-application/src/app/is-utils.service.ts new file mode 100644 index 00000000..905a2e50 --- /dev/null +++ b/frontends/dnet-is-application/src/app/is-utils.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { FormGroup } from '@angular/forms'; + +@Injectable({ + providedIn: 'root' +}) +export class IsUtilsService { + + constructor() { } + + prepareFormError(error:any, form:FormGroup): void { + if (error.error && error.error.message) { + form.setErrors({ serverError: error.error.message }) + } else if (error.message) { + form.setErrors({ serverError: error.message }) + } else { + form.setErrors({ serverError: 'Generic server side error' }) + } + } + +} diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts index 4921b206..f792625e 100644 --- a/frontends/dnet-is-application/src/app/is.service.ts +++ b/frontends/dnet-is-application/src/app/is.service.ts @@ -58,8 +58,6 @@ export class ISService { return this.client.post('/ajax/resources/', body, { headers: headers }); } - - deleteSimpleResource(res:SimpleResource):Observable { return this.client.delete('/ajax/resources/' + encodeURIComponent(res.id)); } diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts index 80a686e4..c9172a49 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -9,8 +9,8 @@ export interface ResourceType { export interface KeyValue { k: string; v: string; - } - +} + export interface Module { group: string; name: string; diff --git a/frontends/dnet-is-application/src/app/resources/content-dialog.html b/frontends/dnet-is-application/src/app/resources/content-dialog.html index 34484367..dea62e9d 100644 --- a/frontends/dnet-is-application/src/app/resources/content-dialog.html +++ b/frontends/dnet-is-application/src/app/resources/content-dialog.html @@ -19,6 +19,9 @@
+ + {{ contentForm.errors?.['serverError'] }} +
diff --git a/frontends/dnet-is-application/src/app/resources/metadata-dialog.html b/frontends/dnet-is-application/src/app/resources/metadata-dialog.html index 11790198..c5afdd28 100644 --- a/frontends/dnet-is-application/src/app/resources/metadata-dialog.html +++ b/frontends/dnet-is-application/src/app/resources/metadata-dialog.html @@ -28,6 +28,9 @@
+ + {{ metadataForm.errors?.['serverError'] }} +
diff --git a/frontends/dnet-is-application/src/app/resources/new-dialog.html b/frontends/dnet-is-application/src/app/resources/new-dialog.html index 3c5934e9..c8c66a46 100644 --- a/frontends/dnet-is-application/src/app/resources/new-dialog.html +++ b/frontends/dnet-is-application/src/app/resources/new-dialog.html @@ -25,6 +25,9 @@
+ + {{ newResourceForm.errors?.['serverError'] }} +
diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.ts b/frontends/dnet-is-application/src/app/resources/resources.component.ts index 76bdd418..f1fca58e 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.ts +++ b/frontends/dnet-is-application/src/app/resources/resources.component.ts @@ -1,5 +1,6 @@ import { Component, Inject,AfterViewInit, ViewChild, OnInit } from '@angular/core'; import { ISService } from '../is.service'; +import { IsUtilsService } from '../is-utils.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatSort, Sort } from '@angular/material/sort'; import { ActivatedRoute } from '@angular/router'; @@ -10,7 +11,6 @@ import { ResourceType, SimpleResource } from '../model/controller.model'; import {FormControl, FormGroup, FormGroupDirective, NgForm, Validators} from '@angular/forms'; import { ResourceLoader } from '@angular/compiler'; - @Component({ selector: 'app-resources', templateUrl: './resources.component.html', @@ -116,7 +116,7 @@ export class ResContentDialog { content : this.contentFormControl }); - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService, public utils: IsUtilsService) { this.contentFormControl.setValue(data.content); } @@ -127,7 +127,7 @@ export class ResContentDialog { next: (data: void) => { this.dialogRef.close(1) }, - error: error => console.log(error), + error: error => this.utils.prepareFormError(error, this.contentForm), complete: () => console.log("Completed") }); } @@ -149,7 +149,7 @@ export class ResMetadataDialog { description : new FormControl('') }); - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService, public utils: IsUtilsService) { this.metadataForm.get('name')?.setValue(data.name); if (data.description) { this.metadataForm.get('description')?.setValue(data.description); @@ -163,7 +163,7 @@ export class ResMetadataDialog { next: (data: void) => { this.dialogRef.close(1) }, - error: error => console.log(error), + error: error => this.utils.prepareFormError(error, this.metadataForm), complete: () => console.log("Completed") }); } @@ -185,7 +185,7 @@ export class ResCreateNewDialog { content : new FormControl('') }); - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) {} + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService, public utils: IsUtilsService) {} onSubmit():void { let name:string = this.newResourceForm.get('name')?.value!; @@ -197,7 +197,7 @@ export class ResCreateNewDialog { next: (data: void) => { this.dialogRef.close(1) }, - error: error => console.log(error), + error: error => this.utils.prepareFormError(error, this.newResourceForm), complete: () => console.log("Completed") }); } diff --git a/frontends/dnet-is-application/src/styles.css b/frontends/dnet-is-application/src/styles.css index f08e01a5..56a89aba 100644 --- a/frontends/dnet-is-application/src/styles.css +++ b/frontends/dnet-is-application/src/styles.css @@ -72,4 +72,10 @@ th, td { .badge-info { background-color: cornflowerblue +} + +.mat-mdc-dialog-actions .mat-mdc-form-field-error { + margin-left: 2em !important; + margin-right: 2em !important; + font-size: 0.75em !important; } \ No newline at end of file -- 2.17.1 From e62329b5d9bde3564ca0293c5c710b7347acc3ad Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Thu, 26 Jan 2023 14:56:39 +0100 Subject: [PATCH 18/43] snack errors --- .../src/app/app.component.html | 37 ++++++++----------- .../src/app/app.component.ts | 3 +- .../dnet-is-application/src/app/app.module.ts | 10 +++-- .../src/app/info/info.component.ts | 6 +-- .../src/app/is-utils.service.ts | 34 ++++++++++++----- .../src/app/protocols/protocols.component.ts | 6 +-- .../src/app/resources/resources.component.ts | 31 ++++++---------- .../app/wf-history/wf-history.component.ts | 6 +-- 8 files changed, 68 insertions(+), 65 deletions(-) diff --git a/frontends/dnet-is-application/src/app/app.component.html b/frontends/dnet-is-application/src/app/app.component.html index 2a61e2f8..35186275 100644 --- a/frontends/dnet-is-application/src/app/app.component.html +++ b/frontends/dnet-is-application/src/app/app.component.html @@ -1,26 +1,19 @@ - - - - - - - {{title}} - - -
+ + + + + + + {{title}} + +
-
- - \ No newline at end of file + + \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/app.component.ts b/frontends/dnet-is-application/src/app/app.component.ts index 3ddfee01..71e729ba 100644 --- a/frontends/dnet-is-application/src/app/app.component.ts +++ b/frontends/dnet-is-application/src/app/app.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { TitleStrategy } from '@angular/router'; import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; import { Observable } from 'rxjs'; @@ -21,3 +21,4 @@ export class AppComponent { constructor(private breakpointObserver: BreakpointObserver) {} } + diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 4d2bc0a6..d1023ee5 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -3,7 +3,7 @@ import { BrowserModule } from '@angular/platform-browser'; import { FilterPipe } from './pipes/filter.pipe'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; -import { FormsModule,ReactiveFormsModule } from '@angular/forms'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { HttpClientModule } from '@angular/common/http'; import { InfoComponent } from './info/info.component'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; @@ -13,7 +13,7 @@ import { MatButtonModule } from '@angular/material/button'; import { MatSidenavModule } from '@angular/material/sidenav'; import { MatIconModule } from '@angular/material/icon'; import { MatListModule } from '@angular/material/list'; -import { MatTreeModule} from '@angular/material/tree'; +import { MatTreeModule } from '@angular/material/tree'; import { MainMenuTreeComponent } from './main-menu-tree/main-menu-tree.component'; import { MatBadgeModule } from '@angular/material/badge'; import { MatCardModule } from '@angular/material/card'; @@ -25,8 +25,9 @@ import { MainMenuPanelsComponent } from './main-menu-panels/main-menu-panels.com import { MatExpansionModule } from '@angular/material/expansion'; import { WfDialog, WfHistoryComponent } from './wf-history/wf-history.component'; import { MatDialogModule } from '@angular/material/dialog'; -import {MatSortModule} from '@angular/material/sort'; +import { MatSortModule } from '@angular/material/sort'; import { ResourcesComponent, ResContentDialog, ResCreateNewDialog, ResMetadataDialog } from './resources/resources.component' +import { MatSnackBarModule } from '@angular/material/snack-bar'; @NgModule({ declarations: [ @@ -64,7 +65,8 @@ import { ResourcesComponent, ResContentDialog, ResCreateNewDialog, ResMetadataDi MatExpansionModule, MatDialogModule, MatSortModule, - ReactiveFormsModule + ReactiveFormsModule, + MatSnackBarModule ], providers: [], bootstrap: [AppComponent] diff --git a/frontends/dnet-is-application/src/app/info/info.component.ts b/frontends/dnet-is-application/src/app/info/info.component.ts index c8a5599f..37b1014f 100644 --- a/frontends/dnet-is-application/src/app/info/info.component.ts +++ b/frontends/dnet-is-application/src/app/info/info.component.ts @@ -1,5 +1,6 @@ import { Component } from '@angular/core'; import { ISService } from '../is.service'; +import { ISUtilsService } from '../is-utils.service'; import { MatTableDataSource } from '@angular/material/table'; import { KeyValue, Module } from '../model/controller.model'; @@ -21,7 +22,7 @@ export class InfoComponent { displayedKVColumns: string[] = ['k', 'v']; displayedModuleColumns: string[] = ['group', 'name', 'versions', 'files']; - constructor(public service:ISService) { + constructor(public service:ISService, public utils:ISUtilsService) { this.service.loadInfo().subscribe({ next:(data:any[]) => { data.forEach(section => { @@ -35,8 +36,7 @@ export class InfoComponent { } }) }, - error:error => console.log(error), - complete:()=>console.log("Completed") + error:error => this.utils.snackError(error) }) } diff --git a/frontends/dnet-is-application/src/app/is-utils.service.ts b/frontends/dnet-is-application/src/app/is-utils.service.ts index 905a2e50..434cfe58 100644 --- a/frontends/dnet-is-application/src/app/is-utils.service.ts +++ b/frontends/dnet-is-application/src/app/is-utils.service.ts @@ -1,21 +1,35 @@ -import { Injectable } from '@angular/core'; +import { Inject, Injectable } from '@angular/core'; import { FormGroup } from '@angular/forms'; +import {MatSnackBar} from '@angular/material/snack-bar'; @Injectable({ providedIn: 'root' }) -export class IsUtilsService { +export class ISUtilsService { - constructor() { } + constructor(public snackBar: MatSnackBar) { } prepareFormError(error:any, form:FormGroup): void { - if (error.error && error.error.message) { - form.setErrors({ serverError: error.error.message }) - } else if (error.message) { - form.setErrors({ serverError: error.message }) - } else { - form.setErrors({ serverError: 'Generic server side error' }) - } + form.setErrors({ serverError: this.errorMessage(error) }) } + snackError(error:any) { + this.snackBar.open(this.errorMessage(error), 'ERROR', { + duration: 5000, + }); + } + + alertError(error:any) { + alert(error); + } + + private errorMessage(error:any) { + if (error.error && error.error.message) { + return error.error.message; + } else if (error.message) { + return error.message; + } else { + return 'Generic server side error'; + } + } } diff --git a/frontends/dnet-is-application/src/app/protocols/protocols.component.ts b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts index 76d92f36..4589a9d7 100644 --- a/frontends/dnet-is-application/src/app/protocols/protocols.component.ts +++ b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts @@ -1,5 +1,6 @@ import { Component } from '@angular/core'; import { ISService } from '../is.service'; +import { ISUtilsService } from '../is-utils.service'; import { MatTableDataSource } from '@angular/material/table'; import { Protocol, ProtocolParams } from '../model/controller.model'; @@ -17,7 +18,7 @@ export class ProtocolsComponent { protDatasources:ProtocolDatasource[] = []; colums : string[] = ['name', 'label', 'type', 'optional', 'hasSelFunction']; - constructor(public service:ISService) { + constructor(public service:ISService, public utils:ISUtilsService) { this.service.loadProtocols().subscribe({ next:(data:Protocol[]) => { data.forEach(p => { @@ -27,8 +28,7 @@ export class ProtocolsComponent { }); }) }, - error:error => console.log(error), - complete:() => console.log("Completed") + error:error => this.utils.snackError(error) }) } diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.ts b/frontends/dnet-is-application/src/app/resources/resources.component.ts index f1fca58e..d3f90cbf 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.ts +++ b/frontends/dnet-is-application/src/app/resources/resources.component.ts @@ -1,6 +1,6 @@ import { Component, Inject,AfterViewInit, ViewChild, OnInit } from '@angular/core'; import { ISService } from '../is.service'; -import { IsUtilsService } from '../is-utils.service'; +import { ISUtilsService } from '../is-utils.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatSort, Sort } from '@angular/material/sort'; import { ActivatedRoute } from '@angular/router'; @@ -22,7 +22,7 @@ export class ResourcesComponent implements OnInit { resources:SimpleResource[] = []; searchText:string = ''; - constructor(public service: ISService, public route: ActivatedRoute, public newDialog: MatDialog, public contentDialog: MatDialog, public metadataDialog: MatDialog) { + constructor(public service: ISService, public utils:ISUtilsService, public route: ActivatedRoute, public newDialog: MatDialog, public contentDialog: MatDialog, public metadataDialog: MatDialog) { } ngOnInit() { @@ -30,8 +30,7 @@ export class ResourcesComponent implements OnInit { this.typeId = params['type']; this.service.loadResourceType(this.typeId).subscribe({ next: (data: ResourceType) => this.type = data, - error: error => console.log(error), - complete: () => console.log("Completed") + error: error => this.utils.snackError(error) }); this.reload() }); @@ -41,8 +40,7 @@ export class ResourcesComponent implements OnInit { if (this.typeId) { this.service.loadSimpleResources(this.typeId).subscribe({ next: (data: SimpleResource[]) => this.resources = data, - error: error => console.log(error), - complete: () => console.log("Completed") + error: error => this.utils.snackError(error) }); } } @@ -86,8 +84,7 @@ export class ResourcesComponent implements OnInit { if (result) this.reload(); }); }, - error: error => console.log(error), - complete: () => console.log("Completed") + error: error => this.utils.snackError(error) }); } @@ -95,8 +92,7 @@ export class ResourcesComponent implements OnInit { if (confirm('Are you sure?')) { this.service.deleteSimpleResource(r).subscribe({ next: (data: void) => this.reload(), - error: error => console.log(error), - complete: () => console.log("Completed") + error: error => this.utils.snackError(error) }); } @@ -116,7 +112,7 @@ export class ResContentDialog { content : this.contentFormControl }); - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService, public utils: IsUtilsService) { + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService, public utils: ISUtilsService) { this.contentFormControl.setValue(data.content); } @@ -127,8 +123,7 @@ export class ResContentDialog { next: (data: void) => { this.dialogRef.close(1) }, - error: error => this.utils.prepareFormError(error, this.contentForm), - complete: () => console.log("Completed") + error: error => this.utils.prepareFormError(error, this.contentForm) }); } } @@ -149,7 +144,7 @@ export class ResMetadataDialog { description : new FormControl('') }); - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService, public utils: IsUtilsService) { + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService, public utils: ISUtilsService) { this.metadataForm.get('name')?.setValue(data.name); if (data.description) { this.metadataForm.get('description')?.setValue(data.description); @@ -163,8 +158,7 @@ export class ResMetadataDialog { next: (data: void) => { this.dialogRef.close(1) }, - error: error => this.utils.prepareFormError(error, this.metadataForm), - complete: () => console.log("Completed") + error: error => this.utils.prepareFormError(error, this.metadataForm) }); } @@ -185,7 +179,7 @@ export class ResCreateNewDialog { content : new FormControl('') }); - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService, public utils: IsUtilsService) {} + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService, public utils: ISUtilsService) {} onSubmit():void { let name:string = this.newResourceForm.get('name')?.value!; @@ -197,8 +191,7 @@ export class ResCreateNewDialog { next: (data: void) => { this.dialogRef.close(1) }, - error: error => this.utils.prepareFormError(error, this.newResourceForm), - complete: () => console.log("Completed") + error: error => this.utils.prepareFormError(error, this.newResourceForm) }); } onNoClick(): void { diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts index fa6077e3..7b6d2f6f 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts @@ -1,5 +1,6 @@ import { Component, Inject,AfterViewInit, OnInit, ViewChild } from '@angular/core'; import { ISService } from '../is.service'; +import { ISUtilsService } from '../is-utils.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatSort, Sort } from '@angular/material/sort'; import { WfHistoryEntry } from '../model/controller.model'; @@ -24,7 +25,7 @@ export class WfHistoryComponent implements AfterViewInit , OnInit{ from: number = -1 to: number = -1 - constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { + constructor(public service: ISService, public utils:ISUtilsService, public route: ActivatedRoute, public dialog: MatDialog) { } ngOnInit() { @@ -42,8 +43,7 @@ export class WfHistoryComponent implements AfterViewInit , OnInit{ this.service.loadWfHistory(this.total, this.from, this.to).subscribe({ next: (data: WfHistoryEntry[]) => this.historyDatasource.data = data, - error: error => console.log(error), - complete: () => console.log("Completed") + error: error => this.utils.snackError(error) }) }); } -- 2.17.1 From 448bcb4e86103d48b6ad8b17337aa76a9cf1b42a Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 27 Jan 2023 08:58:33 +0100 Subject: [PATCH 19/43] reimplemented ajax callback --- .../src/app/info/info.component.ts | 10 +- .../src/app/is-utils.service.spec.ts | 16 --- .../src/app/is-utils.service.ts | 35 ----- .../dnet-is-application/src/app/is.service.ts | 134 +++++++++++++----- .../main-menu-panels.component.ts | 2 +- .../main-menu-tree.component.ts | 54 +++---- .../src/app/protocols/protocols.component.ts | 26 ++-- .../src/app/resources/resources.component.ts | 78 +++------- .../app/wf-history/wf-history.component.ts | 8 +- 9 files changed, 162 insertions(+), 201 deletions(-) delete mode 100644 frontends/dnet-is-application/src/app/is-utils.service.spec.ts delete mode 100644 frontends/dnet-is-application/src/app/is-utils.service.ts diff --git a/frontends/dnet-is-application/src/app/info/info.component.ts b/frontends/dnet-is-application/src/app/info/info.component.ts index 37b1014f..bfdf6278 100644 --- a/frontends/dnet-is-application/src/app/info/info.component.ts +++ b/frontends/dnet-is-application/src/app/info/info.component.ts @@ -1,6 +1,5 @@ import { Component } from '@angular/core'; import { ISService } from '../is.service'; -import { ISUtilsService } from '../is-utils.service'; import { MatTableDataSource } from '@angular/material/table'; import { KeyValue, Module } from '../model/controller.model'; @@ -22,9 +21,8 @@ export class InfoComponent { displayedKVColumns: string[] = ['k', 'v']; displayedModuleColumns: string[] = ['group', 'name', 'versions', 'files']; - constructor(public service:ISService, public utils:ISUtilsService) { - this.service.loadInfo().subscribe({ - next:(data:any[]) => { + constructor(public service:ISService) { + this.service.loadInfo((data:any[]) => { data.forEach(section => { if (section['name'] == 'Modules') { this.moduleDatasource.data = section['data']; @@ -35,9 +33,7 @@ export class InfoComponent { }); } }) - }, - error:error => this.utils.snackError(error) - }) + }); } applyFilter(event: Event) { diff --git a/frontends/dnet-is-application/src/app/is-utils.service.spec.ts b/frontends/dnet-is-application/src/app/is-utils.service.spec.ts deleted file mode 100644 index d2561a49..00000000 --- a/frontends/dnet-is-application/src/app/is-utils.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { IsUtilsService } from './is-utils.service'; - -describe('IsUtilsService', () => { - let service: IsUtilsService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(IsUtilsService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/frontends/dnet-is-application/src/app/is-utils.service.ts b/frontends/dnet-is-application/src/app/is-utils.service.ts deleted file mode 100644 index 434cfe58..00000000 --- a/frontends/dnet-is-application/src/app/is-utils.service.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Inject, Injectable } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import {MatSnackBar} from '@angular/material/snack-bar'; - -@Injectable({ - providedIn: 'root' -}) -export class ISUtilsService { - - constructor(public snackBar: MatSnackBar) { } - - prepareFormError(error:any, form:FormGroup): void { - form.setErrors({ serverError: this.errorMessage(error) }) - } - - snackError(error:any) { - this.snackBar.open(this.errorMessage(error), 'ERROR', { - duration: 5000, - }); - } - - alertError(error:any) { - alert(error); - } - - private errorMessage(error:any) { - if (error.error && error.error.message) { - return error.error.message; - } else if (error.message) { - return error.message; - } else { - return 'Generic server side error'; - } - } -} diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts index f792625e..c7e45647 100644 --- a/frontends/dnet-is-application/src/app/is.service.ts +++ b/frontends/dnet-is-application/src/app/is.service.ts @@ -2,74 +2,130 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { ResourceType,Protocol,WfHistoryEntry,SimpleResource } from './model/controller.model'; import { Observable, Observer } from 'rxjs'; +import { FormGroup } from '@angular/forms'; +import { MatSnackBar } from '@angular/material/snack-bar'; @Injectable({ providedIn: 'root' }) export class ISService { - constructor(public client:HttpClient) { } + constructor(public client:HttpClient, public snackBar: MatSnackBar) { } - - loadResourceTypes():Observable { - return this.client.get("/ajax/resourceTypes"); - } - - loadResourceType(id:string):Observable { - return this.client.get("/ajax/resourceTypes/" + encodeURIComponent(id)); - } - - loadInfo():Observable { - return this.client.get("/ajax/info/"); - } - - loadProtocols():Observable { - return this.client.get("/ajax/protocols/"); - } - - loadSimpleResources(type:string):Observable { - return this.client.get("/ajax/resources/" + encodeURIComponent(type)); - } - - loadSimpleResourceContent(id:any):Observable { - const headers = new HttpHeaders().set('Content-Type', 'text/plain; charset=utf-8'); - return this.client.get("/ajax/resources/" + encodeURIComponent(id) + '/content', { - headers, responseType: 'text' as 'json' + loadResourceTypes(onSuccess: Function): void { + this.client.get("/ajax/resourceTypes").subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) }); } - saveSimpleResourceMedatata(res:SimpleResource):Observable { - return this.client.post('/ajax/resources/' + encodeURIComponent(res.id) + '/metadata', res); + loadResourceType(id:string, onSuccess: Function): void { + this.client.get("/ajax/resourceTypes/" + encodeURIComponent(id)).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); } - saveSimpleResourceContent(id:string, content:string):Observable { + loadInfo(onSuccess: Function): void { + this.client.get("/ajax/info/").subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + loadProtocols(onSuccess: Function): void { + this.client.get("/ajax/protocols/").subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + loadSimpleResources(type:string, onSuccess: Function): void { + this.client.get("/ajax/resources/" + encodeURIComponent(type)).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + loadSimpleResourceContent(id:any, onSuccess: Function): void { + const headers = new HttpHeaders().set('Content-Type', 'text/plain; charset=utf-8'); + this.client.get("/ajax/resources/" + encodeURIComponent(id) + '/content', { + headers, responseType: 'text' as 'json' + }).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + saveSimpleResourceMedatata(res:SimpleResource, onSuccess: Function, relatedForm?:FormGroup): void { + this.client.post('/ajax/resources/' + encodeURIComponent(res.id) + '/metadata', res).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error, relatedForm) + }); + } + + saveSimpleResourceContent(id:string, content:string, onSuccess: Function, relatedForm?:FormGroup): void { const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded') let body = new HttpParams().set('content', content); - return this.client.post('/ajax/resources/' + encodeURIComponent(id) + '/content', body, { headers: headers }); + this.client.post('/ajax/resources/' + encodeURIComponent(id) + '/content', body, { headers: headers }).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error, relatedForm) + }); } - addSimpleResource(name:string, type:string, description:string, content:string):Observable { + addSimpleResource(name:string, type:string, description:string, content:string, onSuccess: Function, relatedForm?:FormGroup): void { const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded') let body = new HttpParams() .set('name', name) .set('type', type) .set('description', description) .set('content', content); - return this.client.post('/ajax/resources/', body, { headers: headers }); + this.client.post('/ajax/resources/', body, { headers: headers }).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error, relatedForm) + }); } - deleteSimpleResource(res:SimpleResource):Observable { - return this.client.delete('/ajax/resources/' + encodeURIComponent(res.id)); + deleteSimpleResource(res:SimpleResource, onSuccess: Function): void { + this.client.delete('/ajax/resources/' + encodeURIComponent(res.id)).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); } - loadWfHistory(total?:number, from?:number, to?:number):Observable { + loadWfHistory(total:number, from:number, to:number, onSuccess: Function): void { let params = new HttpParams(); - if (total && total > 0) { params = params.append('total', total); } - if (from && from > 0) { params = params.append('from', from); } - if (to && to > 0) { params = params.append('to', to); } + if (from && from > 0) { params = params.append('from', from); } + if (to && to > 0) { params = params.append('to', to); } - return this.client.get('/ajax/wfs/', {params: params}); + this.client.get('/ajax/wfs/', {params: params}).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); } + private showError(error:any, form?:FormGroup) { + const msg = this.errorMessage(error); + if (form) { + form.setErrors({ serverError: msg }) + } else if (this.snackBar) { + this.snackBar.open(msg, 'ERROR', { + duration: 5000, + }); + } else { + alert(msg); + } + } + + private errorMessage(error:any) { + if (error.error && error.error.message) { + return error.error.message; + } else if (error.message) { + return error.message; + } else { + return 'Generic server side error'; + } + } + } diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts index cb8a0bc2..140245f9 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts @@ -17,6 +17,6 @@ export class MainMenuPanelsComponent { resTypes:ResourceType[] = []; constructor(public service:ISService) { - this.service.loadResourceTypes().subscribe((data:ResourceType[]) => this.resTypes = data); + this.service.loadResourceTypes((data:ResourceType[]) => this.resTypes = data); } } diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts index 107db5f0..08c2d7cc 100644 --- a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts +++ b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts @@ -45,34 +45,34 @@ export class MainMenuTreeComponent { this.isExpandable, this.getChildren); - this.service.loadResourceTypes().subscribe((data:ResourceType[]) => { - let simpleResources: MenuNode[] = [] - let advancedResources: MenuNode[] = [] + this.service.loadResourceTypes((data:ResourceType[]) => { + let simpleResources: MenuNode[] = [] + let advancedResources: MenuNode[] = [] + + data.forEach(resType => { + let item:MenuNode = { + name: resType.name, + type: 'menuitem', + badge: resType.count.toString() + } + if (resType.simple) { + item.route = '/resources/' + resType.id; + simpleResources.push(item) + } else { + item.route = '/adv_resources/' + resType.id; + advancedResources.push(item) + } + }) - data.forEach(resType => { - let item:MenuNode = { - name: resType.name, - type: 'menuitem', - badge: resType.count.toString() - } - if (resType.simple) { - item.route = '/resources/' + resType.id; - simpleResources.push(item) - } else { - item.route = '/adv_resources/' + resType.id; - advancedResources.push(item) - } - }) - - menuData.forEach(m => { - if (m.name=='Simple Resources') { - m.children = simpleResources - } else if (m.name=='Advanced Resources') { - m.children = advancedResources - } - }) - this.dataSource.data = menuData; - }) + menuData.forEach(m => { + if (m.name=='Simple Resources') { + m.children = simpleResources + } else if (m.name=='Advanced Resources') { + m.children = advancedResources + } + }) + this.dataSource.data = menuData; + }); this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable); this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener); diff --git a/frontends/dnet-is-application/src/app/protocols/protocols.component.ts b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts index 4589a9d7..d8388273 100644 --- a/frontends/dnet-is-application/src/app/protocols/protocols.component.ts +++ b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts @@ -1,6 +1,5 @@ import { Component } from '@angular/core'; import { ISService } from '../is.service'; -import { ISUtilsService } from '../is-utils.service'; import { MatTableDataSource } from '@angular/material/table'; import { Protocol, ProtocolParams } from '../model/controller.model'; @@ -15,21 +14,18 @@ export interface ProtocolDatasource { styleUrls: ['./protocols.component.css'] }) export class ProtocolsComponent { - protDatasources:ProtocolDatasource[] = []; - colums : string[] = ['name', 'label', 'type', 'optional', 'hasSelFunction']; + protDatasources: ProtocolDatasource[] = []; + colums: string[] = ['name', 'label', 'type', 'optional', 'hasSelFunction']; - constructor(public service:ISService, public utils:ISUtilsService) { - this.service.loadProtocols().subscribe({ - next:(data:Protocol[]) => { - data.forEach(p => { - this.protDatasources.push({ - protocol : p.id, - datasource : new MatTableDataSource(p.params) - }); - }) - }, - error:error => this.utils.snackError(error) - }) + constructor(public service: ISService) { + this.service.loadProtocols((data: Protocol[]) => + data.forEach(p => { + this.protDatasources.push({ + protocol: p.id, + datasource: new MatTableDataSource(p.params) + }); + }) + ); } } diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.ts b/frontends/dnet-is-application/src/app/resources/resources.component.ts index d3f90cbf..dbc84463 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.ts +++ b/frontends/dnet-is-application/src/app/resources/resources.component.ts @@ -1,10 +1,8 @@ import { Component, Inject,AfterViewInit, ViewChild, OnInit } from '@angular/core'; import { ISService } from '../is.service'; -import { ISUtilsService } from '../is-utils.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatSort, Sort } from '@angular/material/sort'; import { ActivatedRoute } from '@angular/router'; -import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { ResourceType, SimpleResource } from '../model/controller.model'; @@ -22,26 +20,20 @@ export class ResourcesComponent implements OnInit { resources:SimpleResource[] = []; searchText:string = ''; - constructor(public service: ISService, public utils:ISUtilsService, public route: ActivatedRoute, public newDialog: MatDialog, public contentDialog: MatDialog, public metadataDialog: MatDialog) { + constructor(public service: ISService, public route: ActivatedRoute, public newDialog: MatDialog, public contentDialog: MatDialog, public metadataDialog: MatDialog) { } ngOnInit() { this.route.params.subscribe(params => { this.typeId = params['type']; - this.service.loadResourceType(this.typeId).subscribe({ - next: (data: ResourceType) => this.type = data, - error: error => this.utils.snackError(error) - }); + this.service.loadResourceType(this.typeId, (data: ResourceType) => this.type = data); this.reload() }); } reload() { if (this.typeId) { - this.service.loadSimpleResources(this.typeId).subscribe({ - next: (data: SimpleResource[]) => this.resources = data, - error: error => this.utils.snackError(error) - }); + this.service.loadSimpleResources(this.typeId, (data: SimpleResource[]) => this.resources = data); } } @@ -68,34 +60,26 @@ export class ResourcesComponent implements OnInit { } openContentDialog(r:SimpleResource): void { - this.service.loadSimpleResourceContent(r.id).subscribe({ - next: (data: string) => { - - const dialogRef = this.contentDialog.open(ResContentDialog, { - data: { - id: r.id, - contentType: this.type.contentType, - content: data - }, - width: '80%' - }); - - dialogRef.afterClosed().subscribe(result => { - if (result) this.reload(); - }); - }, - error: error => this.utils.snackError(error) + this.service.loadSimpleResourceContent(r.id, (data: string) => { + const dialogRef = this.contentDialog.open(ResContentDialog, { + data: { + id: r.id, + contentType: this.type.contentType, + content: data + }, + width: '80%' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); }); } deleteResource(r:SimpleResource) { if (confirm('Are you sure?')) { - this.service.deleteSimpleResource(r).subscribe({ - next: (data: void) => this.reload(), - error: error => this.utils.snackError(error) - }); + this.service.deleteSimpleResource(r, (data: void) => this.reload()); } - } } @@ -112,19 +96,14 @@ export class ResContentDialog { content : this.contentFormControl }); - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService, public utils: ISUtilsService) { + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { this.contentFormControl.setValue(data.content); } onSubmit():void { let content = this.contentFormControl.value; if (content) { - this.service.saveSimpleResourceContent(this.data.id, content).subscribe({ - next: (data: void) => { - this.dialogRef.close(1) - }, - error: error => this.utils.prepareFormError(error, this.contentForm) - }); + this.service.saveSimpleResourceContent(this.data.id, content, (data: void) => this.dialogRef.close(1), this.contentForm) } } @@ -144,7 +123,7 @@ export class ResMetadataDialog { description : new FormControl('') }); - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService, public utils: ISUtilsService) { + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { this.metadataForm.get('name')?.setValue(data.name); if (data.description) { this.metadataForm.get('description')?.setValue(data.description); @@ -153,13 +132,7 @@ export class ResMetadataDialog { onSubmit():void { const res = Object.assign({}, this.data, this.metadataForm.value); - - this.service.saveSimpleResourceMedatata(res).subscribe({ - next: (data: void) => { - this.dialogRef.close(1) - }, - error: error => this.utils.prepareFormError(error, this.metadataForm) - }); + this.service.saveSimpleResourceMedatata(res, (data: void) => this.dialogRef.close(1), this.metadataForm); } onNoClick(): void { @@ -179,7 +152,7 @@ export class ResCreateNewDialog { content : new FormControl('') }); - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService, public utils: ISUtilsService) {} + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) {} onSubmit():void { let name:string = this.newResourceForm.get('name')?.value!; @@ -187,12 +160,7 @@ export class ResCreateNewDialog { let description:string = this.newResourceForm.get('description')?.value!; let content:string = this.newResourceForm.get('content')?.value!; - this.service.addSimpleResource(name, type, description, content).subscribe({ - next: (data: void) => { - this.dialogRef.close(1) - }, - error: error => this.utils.prepareFormError(error, this.newResourceForm) - }); + this.service.addSimpleResource(name, type, description, content, (data: void) => this.dialogRef.close(1), this.newResourceForm); } onNoClick(): void { this.dialogRef.close(); diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts index 7b6d2f6f..06e5307e 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts @@ -1,6 +1,5 @@ import { Component, Inject,AfterViewInit, OnInit, ViewChild } from '@angular/core'; import { ISService } from '../is.service'; -import { ISUtilsService } from '../is-utils.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatSort, Sort } from '@angular/material/sort'; import { WfHistoryEntry } from '../model/controller.model'; @@ -25,7 +24,7 @@ export class WfHistoryComponent implements AfterViewInit , OnInit{ from: number = -1 to: number = -1 - constructor(public service: ISService, public utils:ISUtilsService, public route: ActivatedRoute, public dialog: MatDialog) { + constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { } ngOnInit() { @@ -41,10 +40,7 @@ export class WfHistoryComponent implements AfterViewInit , OnInit{ if (fromP) { this.from = parseInt(fromP); } if (toP) { this.to = parseInt(toP); } - this.service.loadWfHistory(this.total, this.from, this.to).subscribe({ - next: (data: WfHistoryEntry[]) => this.historyDatasource.data = data, - error: error => this.utils.snackError(error) - }) + this.service.loadWfHistory(this.total, this.from, this.to, (data: WfHistoryEntry[]) => this.historyDatasource.data = data); }); } -- 2.17.1 From 1cb603a83c4a9c105944168f0389fa74acf86b51 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 27 Jan 2023 11:44:30 +0100 Subject: [PATCH 20/43] contexts --- .../src/app/app-routing.module.ts | 14 ++- .../dnet-is-application/src/app/app.module.ts | 9 +- .../src/app/contexts/context-dialog.html | 35 ++++++ .../contexts/context-editor.component.html | 1 + .../src/app/contexts/contexts.component.css | 6 + .../src/app/contexts/contexts.component.html | 45 +++++++ .../app/contexts/contexts.component.spec.ts | 23 ++++ .../src/app/contexts/contexts.component.ts | 116 ++++++++++++++++++ .../src/app/info/info.component.html | 4 +- .../dnet-is-application/src/app/is.service.ts | 59 ++++++--- .../src/app/model/controller.model.ts | 13 ++ .../src/app/resources/resources.component.ts | 2 +- .../vocabularies/vocabularies.component.css | 0 .../vocabularies/vocabularies.component.html | 1 + .../vocabularies.component.spec.ts | 23 ++++ .../vocabularies/vocabularies.component.ts | 19 +++ .../vocabulary-editor.component.html | 0 .../src/app/wf-history/wf-dialog.html | 2 +- .../app/wf-history/wf-history.component.html | 2 +- .../app/wf-history/wf-history.component.ts | 1 - 20 files changed, 345 insertions(+), 30 deletions(-) create mode 100644 frontends/dnet-is-application/src/app/contexts/context-dialog.html create mode 100644 frontends/dnet-is-application/src/app/contexts/context-editor.component.html create mode 100644 frontends/dnet-is-application/src/app/contexts/contexts.component.css create mode 100644 frontends/dnet-is-application/src/app/contexts/contexts.component.html create mode 100644 frontends/dnet-is-application/src/app/contexts/contexts.component.spec.ts create mode 100644 frontends/dnet-is-application/src/app/contexts/contexts.component.ts create mode 100644 frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.css create mode 100644 frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html create mode 100644 frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.spec.ts create mode 100644 frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts create mode 100644 frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html diff --git a/frontends/dnet-is-application/src/app/app-routing.module.ts b/frontends/dnet-is-application/src/app/app-routing.module.ts index 0167562b..75f1944d 100644 --- a/frontends/dnet-is-application/src/app/app-routing.module.ts +++ b/frontends/dnet-is-application/src/app/app-routing.module.ts @@ -4,12 +4,18 @@ import { InfoComponent } from './info/info.component'; import { ProtocolsComponent } from './protocols/protocols.component'; import { WfHistoryComponent } from './wf-history/wf-history.component'; import { ResourcesComponent } from './resources/resources.component'; +import { VocabulariesComponent, VocabularyEditorComponent } from './vocabularies/vocabularies.component'; +import { ContextEditorComponent, ContextsComponent } from './contexts/contexts.component'; const routes: Routes = [ - { path:"info" , component:InfoComponent}, - { path:"adv_resources/protocol" , component:ProtocolsComponent}, - { path:"wf_history" , component:WfHistoryComponent}, - { path:"resources/:type" , component:ResourcesComponent} + { path:"info" , component:InfoComponent }, + { path:"resources/:type" , component:ResourcesComponent }, + { path:"adv_resources/context" , component:ContextsComponent }, + { path:"adv_resources/vocabulary", component:VocabulariesComponent }, + { path:"adv_resources/protocol" , component:ProtocolsComponent }, + { path:"wf_history" , component:WfHistoryComponent }, + { path:"ctx_editor" , component:ContextEditorComponent }, + { path:"voc_editor" , component:VocabularyEditorComponent }, ]; @NgModule({ diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index d1023ee5..d5d1ec44 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -28,6 +28,8 @@ import { MatDialogModule } from '@angular/material/dialog'; import { MatSortModule } from '@angular/material/sort'; import { ResourcesComponent, ResContentDialog, ResCreateNewDialog, ResMetadataDialog } from './resources/resources.component' import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { ContextsComponent, ContextEditorComponent, ContextDialog } from './contexts/contexts.component'; +import { VocabulariesComponent, VocabularyEditorComponent } from './vocabularies/vocabularies.component'; @NgModule({ declarations: [ @@ -42,7 +44,12 @@ import { MatSnackBarModule } from '@angular/material/snack-bar'; ResourcesComponent, ResContentDialog, ResCreateNewDialog, - ResMetadataDialog + ResMetadataDialog, + ContextsComponent, + ContextEditorComponent, + ContextDialog, + VocabulariesComponent, + VocabulariesComponent ], imports: [ BrowserModule, diff --git a/frontends/dnet-is-application/src/app/contexts/context-dialog.html b/frontends/dnet-is-application/src/app/contexts/context-dialog.html new file mode 100644 index 00000000..6a4d7ca0 --- /dev/null +++ b/frontends/dnet-is-application/src/app/contexts/context-dialog.html @@ -0,0 +1,35 @@ +
+ +

New context

+

Edit context

+ +
+ + + ID + + This field is required + + + + Label + + This field is required + + + + Type + + This field is required + +
+ +
+ + + + {{ contextForm.errors?.['serverError'] }} + +
+ + \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/contexts/context-editor.component.html b/frontends/dnet-is-application/src/app/contexts/context-editor.component.html new file mode 100644 index 00000000..35e0c686 --- /dev/null +++ b/frontends/dnet-is-application/src/app/contexts/context-editor.component.html @@ -0,0 +1 @@ +CONTEXT EDITOR \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.css b/frontends/dnet-is-application/src/app/contexts/contexts.component.css new file mode 100644 index 00000000..d5ec5248 --- /dev/null +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.css @@ -0,0 +1,6 @@ +.table-buttons { text-align: right; } +.table-buttons button { + font-size: 0.8em; + padding: 0 !important; + height: 2.5em !important; +} diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.html b/frontends/dnet-is-application/src/app/contexts/contexts.component.html new file mode 100644 index 00000000..b91008d6 --- /dev/null +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.html @@ -0,0 +1,45 @@ +

Contexts

+ + + + + Filter + + + + +
Process Id Status {{element.status}} {{element.status}}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Id + {{element.id}} + Label {{element.label}} Type {{element.type}} + + +
No data matching the filter "{{input.value}}"
diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.spec.ts b/frontends/dnet-is-application/src/app/contexts/contexts.component.spec.ts new file mode 100644 index 00000000..64d5000b --- /dev/null +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ContextsComponent } from './contexts.component'; + +describe('ContextsComponent', () => { + let component: ContextsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ContextsComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ContextsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.ts b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts new file mode 100644 index 00000000..4bef39a6 --- /dev/null +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts @@ -0,0 +1,116 @@ +import { Component, Inject,AfterViewInit, OnInit, ViewChild } from '@angular/core'; +import { ISService } from '../is.service'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatSort, Sort } from '@angular/material/sort'; +import { Context, WfHistoryEntry } from '../model/controller.model'; +import { ActivatedRoute, Params } from '@angular/router'; +import { Observable, combineLatest } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { KeyValue } from '../model/controller.model'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; + +@Component({ + selector: 'app-contexts', + templateUrl: './contexts.component.html', + styleUrls: ['./contexts.component.css'] +}) +export class ContextsComponent implements AfterViewInit ,OnInit { + contextsDatasource: MatTableDataSource = new MatTableDataSource([]); + + colums: string[] = ['id', 'label', 'type', 'buttons']; + + @ViewChild(MatSort) sort: MatSort | undefined + + constructor(public service: ISService, public route: ActivatedRoute, public contextDialog: MatDialog) { + } + + ngOnInit() { + this.reload(); + } + + ngAfterViewInit() { + if(this.sort) this.contextsDatasource.sort = this.sort; + } + + reload() { + this.service.loadContexts((data: Context[]) => this.contextsDatasource.data = data); + } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); + this.contextsDatasource.filter = filterValue; + } + + openNewDialog(): void { + const dialogRef = this.contextDialog.open(ContextDialog, { + data: {}, + width: '80%' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); + } + + openEditDialog(context: Context): void { + const dialogRef = this.contextDialog.open(ContextDialog, { + data: context, + width: '80%' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); + } + + deleteContext(ctx:Context) { + if (confirm('Are you sure?')) { + this.service.deleteContext(ctx.id, (data: void) => this.reload()); + } + } + +} + +@Component({ + selector: 'context-dialog', + templateUrl: 'context-dialog.html', + styleUrls: ['./contexts.component.css'] +}) +export class ContextDialog { + + mode:string = 'new'; + + contextForm = new FormGroup({ + id: new FormControl(''), + label: new FormControl(''), + type: new FormControl(''), + }); + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { + if (data && data.id) { + this.mode = 'update'; + this.contextForm.get('id')?.setValue(data.id); + this.contextForm.get('label')?.setValue(data.label); + this.contextForm.get('type')?.setValue(data.type); + } + } + + onSubmit():void { + const res = Object.assign({}, this.data, this.contextForm.value); + this.service.addContext(res, (data: void) => this.dialogRef.close(1), this.contextForm); + } + + onNoClick(): void { + this.dialogRef.close(); + } +} + +@Component({ + selector: 'app-context-editor', + templateUrl: './context-editor.component.html', + styleUrls: ['./contexts.component.css'] +}) +export class ContextEditorComponent { + +} diff --git a/frontends/dnet-is-application/src/app/info/info.component.html b/frontends/dnet-is-application/src/app/info/info.component.html index c54a31b7..8f905afb 100644 --- a/frontends/dnet-is-application/src/app/info/info.component.html +++ b/frontends/dnet-is-application/src/app/info/info.component.html @@ -24,7 +24,7 @@ - No data matching the filter "{{input.value}}" + No data matching the filter "{{input.value}}" @@ -60,7 +60,7 @@ - No data matching the filter "{{input.value}}" + No data matching the filter "{{input.value}}" \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts index c7e45647..1337330a 100644 --- a/frontends/dnet-is-application/src/app/is.service.ts +++ b/frontends/dnet-is-application/src/app/is.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { ResourceType,Protocol,WfHistoryEntry,SimpleResource } from './model/controller.model'; +import { ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context } from './model/controller.model'; import { Observable, Observer } from 'rxjs'; import { FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -10,7 +10,7 @@ import { MatSnackBar } from '@angular/material/snack-bar'; }) export class ISService { - constructor(public client:HttpClient, public snackBar: MatSnackBar) { } + constructor(public client: HttpClient, public snackBar: MatSnackBar) { } loadResourceTypes(onSuccess: Function): void { this.client.get("/ajax/resourceTypes").subscribe({ @@ -19,7 +19,7 @@ export class ISService { }); } - loadResourceType(id:string, onSuccess: Function): void { + loadResourceType(id: string, onSuccess: Function): void { this.client.get("/ajax/resourceTypes/" + encodeURIComponent(id)).subscribe({ next: data => onSuccess(data), error: error => this.showError(error) @@ -40,14 +40,14 @@ export class ISService { }); } - loadSimpleResources(type:string, onSuccess: Function): void { + loadSimpleResources(type: string, onSuccess: Function): void { this.client.get("/ajax/resources/" + encodeURIComponent(type)).subscribe({ next: data => onSuccess(data), error: error => this.showError(error) }); } - loadSimpleResourceContent(id:any, onSuccess: Function): void { + loadSimpleResourceContent(id: any, onSuccess: Function): void { const headers = new HttpHeaders().set('Content-Type', 'text/plain; charset=utf-8'); this.client.get("/ajax/resources/" + encodeURIComponent(id) + '/content', { headers, responseType: 'text' as 'json' @@ -57,14 +57,14 @@ export class ISService { }); } - saveSimpleResourceMedatata(res:SimpleResource, onSuccess: Function, relatedForm?:FormGroup): void { + saveSimpleResourceMedatata(res: SimpleResource, onSuccess: Function, relatedForm?: FormGroup): void { this.client.post('/ajax/resources/' + encodeURIComponent(res.id) + '/metadata', res).subscribe({ next: data => onSuccess(data), error: error => this.showError(error, relatedForm) }); } - saveSimpleResourceContent(id:string, content:string, onSuccess: Function, relatedForm?:FormGroup): void { + saveSimpleResourceContent(id: string, content: string, onSuccess: Function, relatedForm?: FormGroup): void { const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded') let body = new HttpParams().set('content', content); this.client.post('/ajax/resources/' + encodeURIComponent(id) + '/content', body, { headers: headers }).subscribe({ @@ -73,7 +73,7 @@ export class ISService { }); } - addSimpleResource(name:string, type:string, description:string, content:string, onSuccess: Function, relatedForm?:FormGroup): void { + addSimpleResource(name: string, type: string, description: string, content: string, onSuccess: Function, relatedForm?: FormGroup): void { const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded') let body = new HttpParams() .set('name', name) @@ -82,30 +82,51 @@ export class ISService { .set('content', content); this.client.post('/ajax/resources/', body, { headers: headers }).subscribe({ next: data => onSuccess(data), - error: error => this.showError(error, relatedForm) + error: error => this.showError(error, relatedForm) }); } - deleteSimpleResource(res:SimpleResource, onSuccess: Function): void { - this.client.delete('/ajax/resources/' + encodeURIComponent(res.id)).subscribe({ + deleteSimpleResource(resourceId: string, onSuccess: Function): void { + this.client.delete('/ajax/resources/' + encodeURIComponent(resourceId)).subscribe({ next: data => onSuccess(data), error: error => this.showError(error) }); } - loadWfHistory(total:number, from:number, to:number, onSuccess: Function): void { + loadWfHistory(total: number, from: number, to: number, onSuccess: Function): void { let params = new HttpParams(); if (total && total > 0) { params = params.append('total', total); } - if (from && from > 0) { params = params.append('from', from); } - if (to && to > 0) { params = params.append('to', to); } - - this.client.get('/ajax/wfs/', {params: params}).subscribe({ + if (from && from > 0) { params = params.append('from', from); } + if (to && to > 0) { params = params.append('to', to); } + + this.client.get('/ajax/wfs/', { params: params }).subscribe({ next: data => onSuccess(data), error: error => this.showError(error) }); - } + } - private showError(error:any, form?:FormGroup) { + loadContexts(onSuccess: Function): void { + this.client.get('./ajax/contexts/').subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + addContext(context: Context, onSuccess: Function, relatedForm?: FormGroup): void { + this.client.post('/ajax/contexts/', context).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error, relatedForm) + }); + } + + deleteContext(contextId: string, onSuccess: Function): void { + this.client.delete('/ajax/contexts/' + encodeURIComponent(contextId)).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + private showError(error: any, form?: FormGroup) { const msg = this.errorMessage(error); if (form) { form.setErrors({ serverError: msg }) @@ -118,7 +139,7 @@ export class ISService { } } - private errorMessage(error:any) { + private errorMessage(error: any) { if (error.error && error.error.message) { return error.error.message; } else if (error.message) { diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts index c9172a49..cd339ac7 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -52,3 +52,16 @@ export interface SimpleResource { creationDate?: string, modificationDate?: string } + +export interface ContextParam { + name: string, + value: string +} + +export interface Context { + id: string, + label: string, + parameters: ContextParam[], + nChilds: number, + type: string +} \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.ts b/frontends/dnet-is-application/src/app/resources/resources.component.ts index dbc84463..55529dcf 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.ts +++ b/frontends/dnet-is-application/src/app/resources/resources.component.ts @@ -78,7 +78,7 @@ export class ResourcesComponent implements OnInit { deleteResource(r:SimpleResource) { if (confirm('Are you sure?')) { - this.service.deleteSimpleResource(r, (data: void) => this.reload()); + this.service.deleteSimpleResource(r.id, (data: void) => this.reload()); } } } diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.css b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.css new file mode 100644 index 00000000..e69de29b diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html new file mode 100644 index 00000000..843508fe --- /dev/null +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html @@ -0,0 +1 @@ +

vocabularies works!

diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.spec.ts b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.spec.ts new file mode 100644 index 00000000..ea42b27d --- /dev/null +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { VocabulariesComponent } from './vocabularies.component'; + +describe('VocabulariesComponent', () => { + let component: VocabulariesComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ VocabulariesComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(VocabulariesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts new file mode 100644 index 00000000..c684c0c8 --- /dev/null +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts @@ -0,0 +1,19 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-vocabularies', + templateUrl: './vocabularies.component.html', + styleUrls: ['./vocabularies.component.css'] +}) +export class VocabulariesComponent { + +} + +@Component({ + selector: 'app-vocabulary-editor', + templateUrl: './vocabulary-editor.component.html', + styleUrls: ['./vocabularies.component.css'] +}) +export class VocabularyEditorComponent { + +} diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html b/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html new file mode 100644 index 00000000..e69de29b diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html b/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html index 9e3a7347..8541884a 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html +++ b/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html @@ -29,7 +29,7 @@ - No data matching the filter "{{filterParams.value}}" + No data matching the filter "{{filterParams.value}}" diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html index 547c1c3f..4dd4008b 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html @@ -61,6 +61,6 @@ - No data matching the filter "{{input.value}}" + No data matching the filter "{{input.value}}" \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts index 06e5307e..44efc691 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts @@ -50,7 +50,6 @@ export class WfHistoryComponent implements AfterViewInit , OnInit{ if(this.sort) this.historyDatasource.sort = this.sort; } - applyFilter(event: Event) { const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); this.historyDatasource.filter = filterValue; -- 2.17.1 From f47cd2a8e7876124fe4231f808af63a8c8d6ecb8 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 27 Jan 2023 12:43:15 +0100 Subject: [PATCH 21/43] contexts --- .../src/app/app-routing.module.ts | 4 +- .../dnet-is-application/src/app/app.module.ts | 6 +-- .../src/app/contexts/context-dialog.html | 35 ------------- .../src/app/contexts/context-params.html | 16 ++++++ ...ent.html => context-viewer.component.html} | 0 .../src/app/contexts/contexts.component.html | 10 ++-- .../src/app/contexts/contexts.component.ts | 51 ++++--------------- .../main-menu-panels.component.css | 1 - 8 files changed, 33 insertions(+), 90 deletions(-) delete mode 100644 frontends/dnet-is-application/src/app/contexts/context-dialog.html create mode 100644 frontends/dnet-is-application/src/app/contexts/context-params.html rename frontends/dnet-is-application/src/app/contexts/{context-editor.component.html => context-viewer.component.html} (100%) diff --git a/frontends/dnet-is-application/src/app/app-routing.module.ts b/frontends/dnet-is-application/src/app/app-routing.module.ts index 75f1944d..6cb55229 100644 --- a/frontends/dnet-is-application/src/app/app-routing.module.ts +++ b/frontends/dnet-is-application/src/app/app-routing.module.ts @@ -5,7 +5,7 @@ import { ProtocolsComponent } from './protocols/protocols.component'; import { WfHistoryComponent } from './wf-history/wf-history.component'; import { ResourcesComponent } from './resources/resources.component'; import { VocabulariesComponent, VocabularyEditorComponent } from './vocabularies/vocabularies.component'; -import { ContextEditorComponent, ContextsComponent } from './contexts/contexts.component'; +import { ContextViewerComponent, ContextsComponent } from './contexts/contexts.component'; const routes: Routes = [ { path:"info" , component:InfoComponent }, @@ -14,7 +14,7 @@ const routes: Routes = [ { path:"adv_resources/vocabulary", component:VocabulariesComponent }, { path:"adv_resources/protocol" , component:ProtocolsComponent }, { path:"wf_history" , component:WfHistoryComponent }, - { path:"ctx_editor" , component:ContextEditorComponent }, + { path:"ctx_viewer" , component:ContextViewerComponent }, { path:"voc_editor" , component:VocabularyEditorComponent }, ]; diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index d5d1ec44..346e42a6 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -28,7 +28,7 @@ import { MatDialogModule } from '@angular/material/dialog'; import { MatSortModule } from '@angular/material/sort'; import { ResourcesComponent, ResContentDialog, ResCreateNewDialog, ResMetadataDialog } from './resources/resources.component' import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { ContextsComponent, ContextEditorComponent, ContextDialog } from './contexts/contexts.component'; +import { ContextsComponent, ContextViewerComponent, ContextParamsDialog } from './contexts/contexts.component'; import { VocabulariesComponent, VocabularyEditorComponent } from './vocabularies/vocabularies.component'; @NgModule({ @@ -46,8 +46,8 @@ import { VocabulariesComponent, VocabularyEditorComponent } from './vocabularies ResCreateNewDialog, ResMetadataDialog, ContextsComponent, - ContextEditorComponent, - ContextDialog, + ContextViewerComponent, + ContextParamsDialog, VocabulariesComponent, VocabulariesComponent ], diff --git a/frontends/dnet-is-application/src/app/contexts/context-dialog.html b/frontends/dnet-is-application/src/app/contexts/context-dialog.html deleted file mode 100644 index 6a4d7ca0..00000000 --- a/frontends/dnet-is-application/src/app/contexts/context-dialog.html +++ /dev/null @@ -1,35 +0,0 @@ -
- -

New context

-

Edit context

- -
- - - ID - - This field is required - - - - Label - - This field is required - - - - Type - - This field is required - -
- -
- - - - {{ contextForm.errors?.['serverError'] }} - -
- -
\ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/contexts/context-params.html b/frontends/dnet-is-application/src/app/contexts/context-params.html new file mode 100644 index 00000000..505a7e96 --- /dev/null +++ b/frontends/dnet-is-application/src/app/contexts/context-params.html @@ -0,0 +1,16 @@ +

Parameters

+ +
+

No parameters

+ +
+ + {{p.name}} + + +
+
+ +
+ +
diff --git a/frontends/dnet-is-application/src/app/contexts/context-editor.component.html b/frontends/dnet-is-application/src/app/contexts/context-viewer.component.html similarity index 100% rename from frontends/dnet-is-application/src/app/contexts/context-editor.component.html rename to frontends/dnet-is-application/src/app/contexts/context-viewer.component.html diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.html b/frontends/dnet-is-application/src/app/contexts/contexts.component.html index b91008d6..fa986db5 100644 --- a/frontends/dnet-is-application/src/app/contexts/contexts.component.html +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.html @@ -1,19 +1,16 @@

Contexts

- - Filter - @@ -28,10 +25,9 @@ - + diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.ts b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts index 4bef39a6..31ff650a 100644 --- a/frontends/dnet-is-application/src/app/contexts/contexts.component.ts +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts @@ -41,27 +41,13 @@ export class ContextsComponent implements AfterViewInit ,OnInit { const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); this.contextsDatasource.filter = filterValue; } - - openNewDialog(): void { - const dialogRef = this.contextDialog.open(ContextDialog, { - data: {}, - width: '80%' - }); - - dialogRef.afterClosed().subscribe(result => { - if (result) this.reload(); - }); - } + openEditDialog(context: Context): void { - const dialogRef = this.contextDialog.open(ContextDialog, { - data: context, + const dialogRef = this.contextDialog.open(ContextParamsDialog, { + data: context.parameters, width: '80%' }); - - dialogRef.afterClosed().subscribe(result => { - if (result) this.reload(); - }); } deleteContext(ctx:Context) { @@ -74,31 +60,12 @@ export class ContextsComponent implements AfterViewInit ,OnInit { @Component({ selector: 'context-dialog', - templateUrl: 'context-dialog.html', + templateUrl: 'context-params.html', styleUrls: ['./contexts.component.css'] }) -export class ContextDialog { - - mode:string = 'new'; - - contextForm = new FormGroup({ - id: new FormControl(''), - label: new FormControl(''), - type: new FormControl(''), - }); - - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { - if (data && data.id) { - this.mode = 'update'; - this.contextForm.get('id')?.setValue(data.id); - this.contextForm.get('label')?.setValue(data.label); - this.contextForm.get('type')?.setValue(data.type); - } - } - - onSubmit():void { - const res = Object.assign({}, this.data, this.contextForm.value); - this.service.addContext(res, (data: void) => this.dialogRef.close(1), this.contextForm); +export class ContextParamsDialog { + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { } onNoClick(): void { @@ -108,9 +75,9 @@ export class ContextDialog { @Component({ selector: 'app-context-editor', - templateUrl: './context-editor.component.html', + templateUrl: './context-viewer.component.html', styleUrls: ['./contexts.component.css'] }) -export class ContextEditorComponent { +export class ContextViewerComponent { } diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css index c6d4c582..b0c933e2 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.css @@ -7,7 +7,6 @@ color: #fff; background-color:cornflowerblue; text-align: center; - } .collapse-buttons { text-align: right; } -- 2.17.1 From ea1b5a0b8987aa57c4a4be4a4954c73509045b2f Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 27 Jan 2023 15:00:41 +0100 Subject: [PATCH 22/43] context viewer --- .../contexts/context-viewer.component.html | 45 ++++++++++++++++- .../src/app/contexts/contexts.component.css | 12 +++++ .../src/app/contexts/contexts.component.html | 2 +- .../src/app/contexts/contexts.component.ts | 48 ++++++++++++++----- .../dnet-is-application/src/app/is.service.ts | 19 +++++--- .../src/app/model/controller.model.ts | 13 ++++- 6 files changed, 117 insertions(+), 22 deletions(-) diff --git a/frontends/dnet-is-application/src/app/contexts/context-viewer.component.html b/frontends/dnet-is-application/src/app/contexts/context-viewer.component.html index 35e0c686..d53f6ffc 100644 --- a/frontends/dnet-is-application/src/app/contexts/context-viewer.component.html +++ b/frontends/dnet-is-application/src/app/contexts/context-viewer.component.html @@ -1 +1,44 @@ -CONTEXT EDITOR \ No newline at end of file +

Context Viewer

+ +

+ Context ID: {{context?.id}}
+ Label: {{context?.label}}
+ Type: {{context?.type}}
+

+ +

+ Return to contexts list + + Download +

+ + \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.css b/frontends/dnet-is-application/src/app/contexts/contexts.component.css index d5ec5248..b8d78c73 100644 --- a/frontends/dnet-is-application/src/app/contexts/contexts.component.css +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.css @@ -4,3 +4,15 @@ padding: 0 !important; height: 2.5em !important; } + +.context-node { + padding-top: 1em; +} + +.context-node a { + text-decoration: none; +} + +.context-node a:hover { + text-decoration: underline; +} \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.html b/frontends/dnet-is-application/src/app/contexts/contexts.component.html index fa986db5..34dc5a8c 100644 --- a/frontends/dnet-is-application/src/app/contexts/contexts.component.html +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.html @@ -27,7 +27,7 @@
diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.ts b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts index 31ff650a..94c5b74f 100644 --- a/frontends/dnet-is-application/src/app/contexts/contexts.component.ts +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts @@ -2,12 +2,12 @@ import { Component, Inject,AfterViewInit, OnInit, ViewChild } from '@angular/cor import { ISService } from '../is.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatSort, Sort } from '@angular/material/sort'; -import { Context, WfHistoryEntry } from '../model/controller.model'; +import { Context, ContextNode, WfHistoryEntry } from '../model/controller.model'; import { ActivatedRoute, Params } from '@angular/router'; import { Observable, combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { KeyValue } from '../model/controller.model'; +import { KeyValue, ContextParam } from '../model/controller.model'; import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; @Component({ @@ -22,7 +22,7 @@ export class ContextsComponent implements AfterViewInit ,OnInit { @ViewChild(MatSort) sort: MatSort | undefined - constructor(public service: ISService, public route: ActivatedRoute, public contextDialog: MatDialog) { + constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { } ngOnInit() { @@ -42,20 +42,13 @@ export class ContextsComponent implements AfterViewInit ,OnInit { this.contextsDatasource.filter = filterValue; } - - openEditDialog(context: Context): void { - const dialogRef = this.contextDialog.open(ContextParamsDialog, { + showParamsDialog(context: Context): void { + const dialogRef = this.dialog.open(ContextParamsDialog, { data: context.parameters, width: '80%' }); } - deleteContext(ctx:Context) { - if (confirm('Are you sure?')) { - this.service.deleteContext(ctx.id, (data: void) => this.reload()); - } - } - } @Component({ @@ -78,6 +71,35 @@ export class ContextParamsDialog { templateUrl: './context-viewer.component.html', styleUrls: ['./contexts.component.css'] }) -export class ContextViewerComponent { +export class ContextViewerComponent implements OnInit { + + context?:Context + categories:ContextNode[] = []; + + constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { + } + + ngOnInit() { + this.route.queryParams.subscribe((params) => { + this.service.loadContext(params['id'], (data: Context) => this.context = data); + this.service.loadContextCategories(params['id'], (data:ContextNode[]) => this.categories = data); + }); + } + + populateNode(level:number, node:ContextNode): void { + this.service.loadContextConcepts(level, node.id, (data:ContextNode[]) => { + node.populated = true; + node.childs = data + }); + } + + showParamsDialog(params:ContextParam[] | undefined): void { + if (params) { + this.dialog.open(ContextParamsDialog, { + data: params, + width: '80%' + }); + } + } } diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts index 1337330a..dd0cb800 100644 --- a/frontends/dnet-is-application/src/app/is.service.ts +++ b/frontends/dnet-is-application/src/app/is.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context } from './model/controller.model'; +import { ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode } from './model/controller.model'; import { Observable, Observer } from 'rxjs'; import { FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -112,15 +112,22 @@ export class ISService { }); } - addContext(context: Context, onSuccess: Function, relatedForm?: FormGroup): void { - this.client.post('/ajax/contexts/', context).subscribe({ + loadContext(ctxId:string, onSuccess: Function): void { + this.client.get('./ajax/contexts/' + encodeURIComponent(ctxId)).subscribe({ next: data => onSuccess(data), - error: error => this.showError(error, relatedForm) + error: error => this.showError(error) }); } - deleteContext(contextId: string, onSuccess: Function): void { - this.client.delete('/ajax/contexts/' + encodeURIComponent(contextId)).subscribe({ + loadContextCategories(ctxId:string, onSuccess: Function): void { + this.client.get('./ajax/contexts/' + encodeURIComponent(ctxId) + '/categories').subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + loadContextConcepts(level:number, nodeId:string, onSuccess: Function): void { + this.client.get('./ajax/contexts/' + encodeURIComponent(level) + '/' + encodeURIComponent(nodeId) + '/concepts').subscribe({ next: data => onSuccess(data), error: error => this.showError(error) }); diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts index cd339ac7..1c9084a1 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -64,4 +64,15 @@ export interface Context { parameters: ContextParam[], nChilds: number, type: string -} \ No newline at end of file +} + +export interface ContextNode { + id: string, + label: string, + parameters: ContextParam[], + nChilds: number, + claim: boolean, + parent: string, + populated?: boolean, + childs?: ContextNode[] +} -- 2.17.1 From d93c39275fbf2ba2961fe8aba189662c70832529 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 27 Jan 2023 15:04:51 +0100 Subject: [PATCH 23/43] minor fix --- .../src/app/resources/resources.component.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.ts b/frontends/dnet-is-application/src/app/resources/resources.component.ts index 55529dcf..2844d174 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.ts +++ b/frontends/dnet-is-application/src/app/resources/resources.component.ts @@ -20,7 +20,7 @@ export class ResourcesComponent implements OnInit { resources:SimpleResource[] = []; searchText:string = ''; - constructor(public service: ISService, public route: ActivatedRoute, public newDialog: MatDialog, public contentDialog: MatDialog, public metadataDialog: MatDialog) { + constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { } ngOnInit() { @@ -38,7 +38,7 @@ export class ResourcesComponent implements OnInit { } openNewDialog(): void { - const dialogRef = this.newDialog.open(ResCreateNewDialog, { + const dialogRef = this.dialog.open(ResCreateNewDialog, { data: this.type, width: '80%' }); @@ -49,7 +49,7 @@ export class ResourcesComponent implements OnInit { } openMetadataDialog(r:SimpleResource): void { - const dialogRef = this.metadataDialog.open(ResMetadataDialog, { + const dialogRef = this.dialog.open(ResMetadataDialog, { data: r, width: '80%' }); @@ -61,7 +61,7 @@ export class ResourcesComponent implements OnInit { openContentDialog(r:SimpleResource): void { this.service.loadSimpleResourceContent(r.id, (data: string) => { - const dialogRef = this.contentDialog.open(ResContentDialog, { + const dialogRef = this.dialog.open(ResContentDialog, { data: { id: r.id, contentType: this.type.contentType, -- 2.17.1 From 78ca043213c2c206963469d143541caad5cae571 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Mon, 30 Jan 2023 09:39:27 +0100 Subject: [PATCH 24/43] proxy conf --- frontends/dnet-is-application/src/proxy.conf.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontends/dnet-is-application/src/proxy.conf.json b/frontends/dnet-is-application/src/proxy.conf.json index 247e804d..2ab102c1 100644 --- a/frontends/dnet-is-application/src/proxy.conf.json +++ b/frontends/dnet-is-application/src/proxy.conf.json @@ -2,5 +2,9 @@ "/ajax": { "target": "http://localhost:8280", "secure": false + }, + "/api": { + "target": "http://localhost:8280", + "secure": false } - } \ No newline at end of file +} \ No newline at end of file -- 2.17.1 From 527a80c931f91ebaddc5bfea2ab0b93a4e269337 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Mon, 30 Jan 2023 10:58:34 +0100 Subject: [PATCH 25/43] Vocabularies --- .../dnet-is-application/src/app/app.module.ts | 5 +- ...params.html => context-params-dialog.html} | 0 .../src/app/contexts/contexts.component.css | 6 -- .../src/app/contexts/contexts.component.ts | 2 +- .../dnet-is-application/src/app/is.service.ts | 23 ++++- .../src/app/model/controller.model.ts | 6 ++ .../src/app/vocabularies/voc-dialog.html | 32 +++++++ .../vocabularies/vocabularies.component.html | 45 ++++++++- .../vocabularies/vocabularies.component.ts | 95 ++++++++++++++++++- .../vocabulary-editor.component.html | 1 + frontends/dnet-is-application/src/styles.css | 7 ++ 11 files changed, 209 insertions(+), 13 deletions(-) rename frontends/dnet-is-application/src/app/contexts/{context-params.html => context-params-dialog.html} (100%) create mode 100644 frontends/dnet-is-application/src/app/vocabularies/voc-dialog.html diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 346e42a6..82830491 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -29,7 +29,7 @@ import { MatSortModule } from '@angular/material/sort'; import { ResourcesComponent, ResContentDialog, ResCreateNewDialog, ResMetadataDialog } from './resources/resources.component' import { MatSnackBarModule } from '@angular/material/snack-bar'; import { ContextsComponent, ContextViewerComponent, ContextParamsDialog } from './contexts/contexts.component'; -import { VocabulariesComponent, VocabularyEditorComponent } from './vocabularies/vocabularies.component'; +import { VocabulariesComponent, VocabularyEditorComponent, VocDialog } from './vocabularies/vocabularies.component'; @NgModule({ declarations: [ @@ -49,7 +49,8 @@ import { VocabulariesComponent, VocabularyEditorComponent } from './vocabularies ContextViewerComponent, ContextParamsDialog, VocabulariesComponent, - VocabulariesComponent + VocabularyEditorComponent, + VocDialog ], imports: [ BrowserModule, diff --git a/frontends/dnet-is-application/src/app/contexts/context-params.html b/frontends/dnet-is-application/src/app/contexts/context-params-dialog.html similarity index 100% rename from frontends/dnet-is-application/src/app/contexts/context-params.html rename to frontends/dnet-is-application/src/app/contexts/context-params-dialog.html diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.css b/frontends/dnet-is-application/src/app/contexts/contexts.component.css index b8d78c73..c0c2065c 100644 --- a/frontends/dnet-is-application/src/app/contexts/contexts.component.css +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.css @@ -1,9 +1,3 @@ -.table-buttons { text-align: right; } -.table-buttons button { - font-size: 0.8em; - padding: 0 !important; - height: 2.5em !important; -} .context-node { padding-top: 1em; diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.ts b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts index 94c5b74f..2f26a105 100644 --- a/frontends/dnet-is-application/src/app/contexts/contexts.component.ts +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts @@ -53,7 +53,7 @@ export class ContextsComponent implements AfterViewInit ,OnInit { @Component({ selector: 'context-dialog', - templateUrl: 'context-params.html', + templateUrl: 'context-params-dialog.html', styleUrls: ['./contexts.component.css'] }) export class ContextParamsDialog { diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts index dd0cb800..7a57a86b 100644 --- a/frontends/dnet-is-application/src/app/is.service.ts +++ b/frontends/dnet-is-application/src/app/is.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode } from './model/controller.model'; +import { ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary } from './model/controller.model'; import { Observable, Observer } from 'rxjs'; import { FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -133,6 +133,27 @@ export class ISService { }); } + loadVocabularies(onSuccess: Function): void { + this.client.get('./ajax/vocs/').subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + saveVocabulary(voc:Vocabulary, onSuccess: Function, relatedForm?: FormGroup): void { + this.client.post('./ajax/vocs/', voc).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error, relatedForm) + }); + } + + deleteVocabulary(vocId:string, onSuccess: Function): void { + this.client.delete('./ajax/vocs/' + encodeURIComponent(vocId)).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + private showError(error: any, form?: FormGroup) { const msg = this.errorMessage(error); if (form) { diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts index 1c9084a1..f3b78183 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -76,3 +76,9 @@ export interface ContextNode { populated?: boolean, childs?: ContextNode[] } + +export interface Vocabulary { + id: string, + name: string, + description?: string +} \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/vocabularies/voc-dialog.html b/frontends/dnet-is-application/src/app/vocabularies/voc-dialog.html new file mode 100644 index 00000000..e08a107e --- /dev/null +++ b/frontends/dnet-is-application/src/app/vocabularies/voc-dialog.html @@ -0,0 +1,32 @@ +
+

Edit vocabulary

+

New vocabulary

+ +
+ + ID + + This field is required + + + + Name + + This field is required + + + + Description + + +
+ +
+ + + + {{ vocForm.errors?.['serverError'] }} + +
+ + \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html index 843508fe..0817c813 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html @@ -1 +1,44 @@ -

vocabularies works!

+

Vocabularies

+ + + + + Filter + + + +
Id - {{element.id}} + {{element.id}} Parameters - - + Parameters - +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Id + {{element.id}} + Name {{element.name}} Description {{element.description}} + + +
No data matching the filter "{{input.value}}"
diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts index c684c0c8..1d2076d3 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts @@ -1,4 +1,14 @@ -import { Component } from '@angular/core'; +import { Component, Inject,AfterViewInit, OnInit, ViewChild } from '@angular/core'; +import { ISService } from '../is.service'; +import { MatTableDataSource } from '@angular/material/table'; +import { MatSort, Sort } from '@angular/material/sort'; +import { Vocabulary } from '../model/controller.model'; +import { ActivatedRoute, Params } from '@angular/router'; +import { Observable, combineLatest } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { KeyValue, ContextParam } from '../model/controller.model'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; @Component({ selector: 'app-vocabularies', @@ -6,6 +16,60 @@ import { Component } from '@angular/core'; styleUrls: ['./vocabularies.component.css'] }) export class VocabulariesComponent { + vocsDatasource: MatTableDataSource = new MatTableDataSource([]); + + colums: string[] = ['id', 'name', 'description', 'buttons']; + + @ViewChild(MatSort) sort: MatSort | undefined + + constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { + } + + ngOnInit() { + this.reload(); + } + + ngAfterViewInit() { + if(this.sort) this.vocsDatasource.sort = this.sort; + } + + reload() { + this.service.loadVocabularies((data: Vocabulary[]) => this.vocsDatasource.data = data); + } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); + this.vocsDatasource.filter = filterValue; + } + + newVocabularyDialog(): void { + const dialogRef = this.dialog.open(VocDialog, { + data: { id: '', name: '', description: '' }, + width: '80%' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); + } + + editVocabularyDialog(vocabulary: Vocabulary): void { + const dialogRef = this.dialog.open(VocDialog, { + data: vocabulary, + width: '80%' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); + } + + deleteVocabularyDialog(vocabulary: Vocabulary): void { + if (confirm("Are you sure?")) { + this.service.deleteVocabulary(vocabulary.id , (data:void) => this.reload()); + } + } + } @@ -15,5 +79,32 @@ export class VocabulariesComponent { styleUrls: ['./vocabularies.component.css'] }) export class VocabularyEditorComponent { - } + +@Component({ + selector: 'voc-dialog', + templateUrl: 'voc-dialog.html', + styleUrls: ['vocabularies.component.css'] +}) +export class VocDialog { + vocForm = new FormGroup({ + id: new FormControl(''), + name: new FormControl(''), + description : new FormControl('') + }); + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { + this.vocForm.get('id')?.setValue(data.id); + this.vocForm.get('name')?.setValue(data.name); + this.vocForm.get('description')?.setValue(data.description); + } + + onSubmit():void { + const voc = Object.assign({}, this.data, this.vocForm.value); + this.service.saveVocabulary(voc, (data: void) => this.dialogRef.close(1), this.vocForm); + } + + onNoClick(): void { + this.dialogRef.close(); + } +} \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html b/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html index e69de29b..dd0279ba 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html @@ -0,0 +1 @@ +VOC EDITOR \ No newline at end of file diff --git a/frontends/dnet-is-application/src/styles.css b/frontends/dnet-is-application/src/styles.css index 56a89aba..91fefbac 100644 --- a/frontends/dnet-is-application/src/styles.css +++ b/frontends/dnet-is-application/src/styles.css @@ -10,6 +10,13 @@ table { width: 100%; } +.table-buttons { text-align: right !important; } +.table-buttons button { + font-size: 0.8em !important; + padding: 0 !important; + height: 2.5em !important; +} + .warning { background-color: darkorange; } -- 2.17.1 From e83bd36fc12c1bea43d2c797ea2993f56474f066 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Mon, 30 Jan 2023 12:37:01 +0100 Subject: [PATCH 26/43] vocabulary terms --- .../dnet-is-application/src/app/app.module.ts | 5 +- .../dnet-is-application/src/app/is.service.ts | 36 ++++- .../src/app/model/controller.model.ts | 37 +++-- .../src/app/vocabularies/voc-term-dialog.html | 1 + .../vocabularies/vocabularies.component.html | 2 +- .../vocabularies/vocabularies.component.ts | 130 +++++++++++++++--- .../vocabulary-editor.component.html | 62 ++++++++- 7 files changed, 236 insertions(+), 37 deletions(-) create mode 100644 frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 82830491..f73db797 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -29,7 +29,7 @@ import { MatSortModule } from '@angular/material/sort'; import { ResourcesComponent, ResContentDialog, ResCreateNewDialog, ResMetadataDialog } from './resources/resources.component' import { MatSnackBarModule } from '@angular/material/snack-bar'; import { ContextsComponent, ContextViewerComponent, ContextParamsDialog } from './contexts/contexts.component'; -import { VocabulariesComponent, VocabularyEditorComponent, VocDialog } from './vocabularies/vocabularies.component'; +import { VocabulariesComponent, VocabularyEditorComponent, VocDialog, VocTermDialog } from './vocabularies/vocabularies.component'; @NgModule({ declarations: [ @@ -50,7 +50,8 @@ import { VocabulariesComponent, VocabularyEditorComponent, VocDialog } from './v ContextParamsDialog, VocabulariesComponent, VocabularyEditorComponent, - VocDialog + VocDialog, + VocTermDialog ], imports: [ BrowserModule, diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts index 7a57a86b..4164d44b 100644 --- a/frontends/dnet-is-application/src/app/is.service.ts +++ b/frontends/dnet-is-application/src/app/is.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary } from './model/controller.model'; +import { ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary, VocabularyTerm } from './model/controller.model'; import { Observable, Observer } from 'rxjs'; import { FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -140,13 +140,34 @@ export class ISService { }); } + loadVocabulary(vocId:string, onSuccess: Function): void { + this.client.get('./ajax/vocs/' + encodeURIComponent(vocId)).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + loadVocabularyTerms(vocId:string, onSuccess: Function): void { + this.client.get('./ajax/vocs/' + encodeURIComponent(vocId) + '/terms').subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + saveVocabulary(voc:Vocabulary, onSuccess: Function, relatedForm?: FormGroup): void { this.client.post('./ajax/vocs/', voc).subscribe({ next: data => onSuccess(data), error: error => this.showError(error, relatedForm) }); } - + + saveVocabularyTerm(vocId:string, term:VocabularyTerm, onSuccess: Function, relatedForm?: FormGroup): void { + this.client.post('./ajax/vocs/' + encodeURIComponent(vocId) + '/terms', term).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error, relatedForm) + }); + } + deleteVocabulary(vocId:string, onSuccess: Function): void { this.client.delete('./ajax/vocs/' + encodeURIComponent(vocId)).subscribe({ next: data => onSuccess(data), @@ -154,6 +175,17 @@ export class ISService { }); } + deleteVocabularyTerm(vocId:string, termCode:string, onSuccess: Function): void { + this.client.delete('./ajax/vocs/' + + encodeURIComponent(vocId) + + '/terms/' + + encodeURIComponent(termCode) + ).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + private showError(error: any, form?: FormGroup) { const msg = this.errorMessage(error); if (form) { diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts index f3b78183..d1cbeb29 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -1,9 +1,9 @@ export interface ResourceType { - id:string - name:string - contentType:string - count:number - simple:boolean + id: string + name: string + contentType: string + count: number + simple: boolean } export interface KeyValue { @@ -19,11 +19,11 @@ export interface Module { } export interface ProtocolParams { - name:string - label:string - type:string - optional:boolean - hasSelFunction:boolean + name: string + label: string + type: string + optional: boolean + hasSelFunction: boolean } export interface Protocol { @@ -41,7 +41,7 @@ export interface WfHistoryEntry { dsId?: string, dsName?: string, dsApi?: string, - details: Map + details: Map } export interface SimpleResource { @@ -81,4 +81,17 @@ export interface Vocabulary { id: string, name: string, description?: string -} \ No newline at end of file +} + +export interface VocabularyTermSynonym { + term: string, + encoding: string +} + +export interface VocabularyTerm { + code: string, + vocabulary: string, + name: string, + encoding: string, + synonyms: VocabularyTermSynonym[] +} diff --git a/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html b/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html new file mode 100644 index 00000000..fc06c97f --- /dev/null +++ b/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html @@ -0,0 +1 @@ +XXXXXX diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html index 0817c813..7b5b855d 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html @@ -30,7 +30,7 @@ - + diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts index 1d2076d3..ee4410fc 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts @@ -1,4 +1,4 @@ -import { Component, Inject,AfterViewInit, OnInit, ViewChild } from '@angular/core'; +import { Component, Inject, AfterViewInit, OnInit, ViewChild } from '@angular/core'; import { ISService } from '../is.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatSort, Sort } from '@angular/material/sort'; @@ -7,22 +7,23 @@ import { ActivatedRoute, Params } from '@angular/router'; import { Observable, combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { KeyValue, ContextParam } from '../model/controller.model'; +import { VocabularyTerm } from '../model/controller.model'; import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; +import { EmitterVisitorContext } from '@angular/compiler'; @Component({ selector: 'app-vocabularies', templateUrl: './vocabularies.component.html', styleUrls: ['./vocabularies.component.css'] }) -export class VocabulariesComponent { +export class VocabulariesComponent implements OnInit, AfterViewInit { vocsDatasource: MatTableDataSource = new MatTableDataSource([]); colums: string[] = ['id', 'name', 'description', 'buttons']; @ViewChild(MatSort) sort: MatSort | undefined - constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { + constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { } ngOnInit() { @@ -30,7 +31,7 @@ export class VocabulariesComponent { } ngAfterViewInit() { - if(this.sort) this.vocsDatasource.sort = this.sort; + if (this.sort) this.vocsDatasource.sort = this.sort; } reload() { @@ -41,11 +42,11 @@ export class VocabulariesComponent { const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); this.vocsDatasource.filter = filterValue; } - + newVocabularyDialog(): void { - const dialogRef = this.dialog.open(VocDialog, { - data: { id: '', name: '', description: '' }, - width: '80%' + const dialogRef = this.dialog.open(VocDialog, { + data: { id: '', name: '', description: '' }, + width: '80%' }); dialogRef.afterClosed().subscribe(result => { @@ -64,12 +65,11 @@ export class VocabulariesComponent { }); } - deleteVocabularyDialog(vocabulary: Vocabulary): void { + deleteVocabulary(vocabulary: Vocabulary): void { if (confirm("Are you sure?")) { - this.service.deleteVocabulary(vocabulary.id , (data:void) => this.reload()); + this.service.deleteVocabulary(vocabulary.id, (data: void) => this.reload()); } } - } @@ -78,7 +78,71 @@ export class VocabulariesComponent { templateUrl: './vocabulary-editor.component.html', styleUrls: ['./vocabularies.component.css'] }) -export class VocabularyEditorComponent { +export class VocabularyEditorComponent implements OnInit, AfterViewInit { + + voc?: Vocabulary + + termsDatasource: MatTableDataSource = new MatTableDataSource([]); + colums: string[] = ['code', 'name', 'encoding', 'synonyms', 'buttons']; + + @ViewChild(MatSort) sort: MatSort | undefined + + constructor(public service: ISService, public route: ActivatedRoute, public dialog: MatDialog) { + } + + ngOnInit() { + this.reload(); + } + + ngAfterViewInit() { + if (this.sort) this.termsDatasource.sort = this.sort; + } + + reload() { + this.route.queryParams.subscribe((params) => { + this.service.loadVocabulary(params['id'], (data: Vocabulary) => this.voc = data); + this.service.loadVocabularyTerms(params['id'], (data: VocabularyTerm[]) => this.termsDatasource.data = data); + }); + } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); + this.termsDatasource.filter = filterValue; + } + + newVocabularyTermDialog(): void { + if (this.voc?.id) { + const dialogRef = this.dialog.open(VocTermDialog, { + data: { vocabulary: this.voc.id, code: '', name: '', encoding: '', synonyms: []}, + width: '80%' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); + } + + } + + editVocabularyTermDialog(term: VocabularyTerm): void { + const dialogRef = this.dialog.open(VocTermDialog, { + data: term, + width: '80%' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); + } + + deleteVocabularyTerm(term: VocabularyTerm): void { + if (confirm("Are you sure?") && this.voc?.id && term.code) { + this.service.deleteVocabularyTerm(this.voc.id, term.code, (data: void) => this.reload()); + } + } + + + } @Component({ @@ -88,22 +152,50 @@ export class VocabularyEditorComponent { }) export class VocDialog { vocForm = new FormGroup({ - id: new FormControl(''), - name: new FormControl(''), - description : new FormControl('') + id: new FormControl(''), + name: new FormControl(''), + description: new FormControl('') }); - constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { this.vocForm.get('id')?.setValue(data.id); this.vocForm.get('name')?.setValue(data.name); this.vocForm.get('description')?.setValue(data.description); } - - onSubmit():void { + + onSubmit(): void { const voc = Object.assign({}, this.data, this.vocForm.value); this.service.saveVocabulary(voc, (data: void) => this.dialogRef.close(1), this.vocForm); } + onNoClick(): void { + this.dialogRef.close(); + } +} + +@Component({ + selector: 'voc-term-dialog', + templateUrl: 'voc-term-dialog.html', + styleUrls: ['vocabularies.component.css'] +}) +export class VocTermDialog { + termForm = new FormGroup({ + code: new FormControl(''), + name: new FormControl(''), + encoding: new FormControl('') + }); + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { + this.termForm.get('code')?.setValue(data.id); + this.termForm.get('name')?.setValue(data.name); + this.termForm.get('encoding')?.setValue(data.encoding); + } + + onSubmit(): void { + const term = Object.assign({}, this.data, this.termForm.value); + this.service.saveVocabularyTerm(term.vocabulary, term, (data: void) => this.dialogRef.close(1), this.termForm); + } + onNoClick(): void { this.dialogRef.close(); } diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html b/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html index dd0279ba..918b70dc 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html @@ -1 +1,61 @@ -VOC EDITOR \ No newline at end of file +

Vocabulary Editor

+ +

+ Vocabulary ID: {{voc?.id}}
+ Vocabulary Name: {{voc?.name}}
+ Description: {{voc?.description}} +

+ +

+ return to vocabulary list + + Download +

+ + + Filter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Code {{element.code}} Name {{element.name}} Encoding {{element.encoding}} Description + + {{s.term}} + + + + +
No data matching the filter "{{input.value}}"
-- 2.17.1 From 4cf13df0abe718932339090e9db1e0c7aaf73754 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Mon, 30 Jan 2023 14:58:42 +0100 Subject: [PATCH 27/43] partial implementatiom of add/edit vocabulary term --- .../src/app/vocabularies/voc-term-dialog.html | 78 ++++++++++++++++++- .../vocabularies/vocabularies.component.ts | 30 ++++++- .../vocabulary-editor.component.html | 37 +++++---- 3 files changed, 124 insertions(+), 21 deletions(-) diff --git a/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html b/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html index fc06c97f..708cce10 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html +++ b/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html @@ -1 +1,77 @@ -XXXXXX +
+

Edit term

+

New term

+ +
+ + Code + + This field is required + + + + Name + + This field is required + + + + Encoding + + + + *** TO COMPLETE *** + + + + + + + + + + + + + + + + + + + + + + + + + +
SynonymEncoding
0 synonym(s)
{{s.term}}{{s.encoding}} + +
+ + New term + + + + + New encoding + + + + +
+ + +
+ +
+ + + + {{ termForm.errors?.['serverError'] }} + +
+ +
\ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts index ee4410fc..22621aa0 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts @@ -2,7 +2,7 @@ import { Component, Inject, AfterViewInit, OnInit, ViewChild } from '@angular/co import { ISService } from '../is.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatSort, Sort } from '@angular/material/sort'; -import { Vocabulary } from '../model/controller.model'; +import { Vocabulary, VocabularyTermSynonym } from '../model/controller.model'; import { ActivatedRoute, Params } from '@angular/router'; import { Observable, combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -113,7 +113,7 @@ export class VocabularyEditorComponent implements OnInit, AfterViewInit { newVocabularyTermDialog(): void { if (this.voc?.id) { const dialogRef = this.dialog.open(VocTermDialog, { - data: { vocabulary: this.voc.id, code: '', name: '', encoding: '', synonyms: []}, + data: { vocabulary: this.voc.id, code: '', name: '', encoding: 'OPENAIRE', synonyms: []}, width: '80%' }); @@ -179,21 +179,43 @@ export class VocDialog { styleUrls: ['vocabularies.component.css'] }) export class VocTermDialog { + termForm = new FormGroup({ code: new FormControl(''), name: new FormControl(''), encoding: new FormControl('') }); + synonyms:VocabularyTermSynonym[] = []; + tmpSynonym:VocabularyTermSynonym = { term: '', encoding: 'OPENAIRE' }; + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { - this.termForm.get('code')?.setValue(data.id); + this.termForm.get('code')?.setValue(data.code); this.termForm.get('name')?.setValue(data.name); this.termForm.get('encoding')?.setValue(data.encoding); + this.synonyms = data.synonyms; } onSubmit(): void { + let oldCode = this.data.code; + let voc = this.data.vocabulary; + const term = Object.assign({}, this.data, this.termForm.value); - this.service.saveVocabularyTerm(term.vocabulary, term, (data: void) => this.dialogRef.close(1), this.termForm); + + this.service.saveVocabularyTerm(voc, term, (data: void) => { + if (oldCode && oldCode != term.code) { + this.service.deleteVocabularyTerm(voc, oldCode, (data: void) => this.dialogRef.close(1)) + } else { this.dialogRef.close(1) } + }, this.termForm); + } + + removeSynonym(pos:number) { + this.synonyms.splice(pos, 1); + } + + addSynonym() { + this.synonyms.push(Object.assign({}, this.tmpSynonym)); + this.tmpSynonym = { term: '', encoding: 'OPENAIRE' }; } onNoClick(): void { diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html b/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html index 918b70dc..c921898a 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html @@ -1,15 +1,15 @@

Vocabulary Editor

- Vocabulary ID: {{voc?.id}}
- Vocabulary Name: {{voc?.name}}
- Description: {{voc?.description}} + Vocabulary ID: {{voc?.id}}
+ Vocabulary Name: {{voc?.name}}
+ Description: {{voc?.description}}

- return to vocabulary list - - Download + return to vocabulary list + + Download

@@ -20,34 +20,39 @@ - + - + - + - + @@ -58,4 +63,4 @@ -
Code Code + {{element.code}} Name Name + {{element.name}} Encoding + Encoding {{element.encoding}} Description + Description - - {{s.term}} - + 0 synonym(s) + + {{s.term}} + - - + +
No data matching the filter "{{input.value}}"
+ \ No newline at end of file -- 2.17.1 From a5b318a065cc0c8b1558bebdf329e39a88c391d6 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Tue, 31 Jan 2023 10:19:19 +0100 Subject: [PATCH 28/43] vocabulary editor --- .../src/app/app.component.spec.ts | 74 --------------- .../app/contexts/contexts.component.spec.ts | 23 ----- .../src/app/info/info.component.spec.ts | 23 ----- .../src/app/is.service.spec.ts | 16 ---- .../main-menu-panels.component.spec.ts | 23 ----- .../main-menu-tree.component.spec.ts | 32 ------- .../app/protocols/protocols.component.spec.ts | 23 ----- .../app/resources/resources.component.spec.ts | 23 ----- .../src/app/vocabularies/voc-term-dialog.html | 90 +++++++++++++++---- .../vocabularies.component.spec.ts | 23 ----- .../vocabularies/vocabularies.component.ts | 43 +++++++-- .../wf-history/wf-history.component.spec.ts | 23 ----- 12 files changed, 109 insertions(+), 307 deletions(-) delete mode 100644 frontends/dnet-is-application/src/app/app.component.spec.ts delete mode 100644 frontends/dnet-is-application/src/app/contexts/contexts.component.spec.ts delete mode 100644 frontends/dnet-is-application/src/app/info/info.component.spec.ts delete mode 100644 frontends/dnet-is-application/src/app/is.service.spec.ts delete mode 100644 frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.spec.ts delete mode 100644 frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.spec.ts delete mode 100644 frontends/dnet-is-application/src/app/protocols/protocols.component.spec.ts delete mode 100644 frontends/dnet-is-application/src/app/resources/resources.component.spec.ts delete mode 100644 frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.spec.ts delete mode 100644 frontends/dnet-is-application/src/app/wf-history/wf-history.component.spec.ts diff --git a/frontends/dnet-is-application/src/app/app.component.spec.ts b/frontends/dnet-is-application/src/app/app.component.spec.ts deleted file mode 100644 index 56222f55..00000000 --- a/frontends/dnet-is-application/src/app/app.component.spec.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { RouterTestingModule } from '@angular/router/testing'; -import { LayoutModule } from '@angular/cdk/layout'; -import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatListModule } from '@angular/material/list'; -import { MatSidenavModule } from '@angular/material/sidenav'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { AppComponent } from './app.component'; - -describe('AppComponent', () => { - - let component: AppComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [AppComponent], - imports: [ - NoopAnimationsModule, - LayoutModule, - MatButtonModule, - MatIconModule, - MatListModule, - MatSidenavModule, - MatToolbarModule, - ] - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AppComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(component).toBeTruthy(); - }); - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - RouterTestingModule - ], - declarations: [ - AppComponent - ], - }).compileComponents(); - }); - - it('should create the app', () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); - }); - - it(`should have as title 'dnet-is-application'`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('dnet-is-application'); - }); - - it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('.content span')?.textContent).toContain('dnet-is-application app is running!'); - }); -}); - - - diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.spec.ts b/frontends/dnet-is-application/src/app/contexts/contexts.component.spec.ts deleted file mode 100644 index 64d5000b..00000000 --- a/frontends/dnet-is-application/src/app/contexts/contexts.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ContextsComponent } from './contexts.component'; - -describe('ContextsComponent', () => { - let component: ContextsComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ ContextsComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ContextsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontends/dnet-is-application/src/app/info/info.component.spec.ts b/frontends/dnet-is-application/src/app/info/info.component.spec.ts deleted file mode 100644 index 93617f1e..00000000 --- a/frontends/dnet-is-application/src/app/info/info.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { InfoComponent } from './info.component'; - -describe('InfoComponent', () => { - let component: InfoComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ InfoComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(InfoComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontends/dnet-is-application/src/app/is.service.spec.ts b/frontends/dnet-is-application/src/app/is.service.spec.ts deleted file mode 100644 index ed56fec7..00000000 --- a/frontends/dnet-is-application/src/app/is.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { ISService } from './is.service'; - -describe('ISService', () => { - let service: ISService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(ISService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.spec.ts b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.spec.ts deleted file mode 100644 index a984d6a9..00000000 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { MainMenuPanelsComponent } from './main-menu-panels.component'; - -describe('MainMenuPanelsComponent', () => { - let component: MainMenuPanelsComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ MainMenuPanelsComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(MainMenuPanelsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.spec.ts b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.spec.ts deleted file mode 100644 index 72d4c764..00000000 --- a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.spec.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatTreeModule } from '@angular/material/tree'; - -import { MainMenuTreeComponent } from './main-menu-tree.component'; - -describe('MainMenuTreeComponent', () => { - let component: MainMenuTreeComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ MainMenuTreeComponent ], - imports: [ - MatButtonModule, - MatIconModule, - MatTreeModule, - ] - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(MainMenuTreeComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontends/dnet-is-application/src/app/protocols/protocols.component.spec.ts b/frontends/dnet-is-application/src/app/protocols/protocols.component.spec.ts deleted file mode 100644 index 341b9b31..00000000 --- a/frontends/dnet-is-application/src/app/protocols/protocols.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ProtocolsComponent } from './protocols.component'; - -describe('ProtocolsComponent', () => { - let component: ProtocolsComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ ProtocolsComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ProtocolsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.spec.ts b/frontends/dnet-is-application/src/app/resources/resources.component.spec.ts deleted file mode 100644 index 636bc3d8..00000000 --- a/frontends/dnet-is-application/src/app/resources/resources.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ResourcesComponent } from './resources.component'; - -describe('ResourcesComponent', () => { - let component: ResourcesComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ ResourcesComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ResourcesComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html b/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html index 708cce10..16c483ff 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html +++ b/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html @@ -20,13 +20,68 @@
- *** TO COMPLETE *** - - +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Term{{element.term}} + + New term + + + Encoding{{element.encoding}} + + New encoding + + + + + + +
No synonyms
+ +
@@ -74,4 +134,4 @@
- \ No newline at end of file + diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.spec.ts b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.spec.ts deleted file mode 100644 index ea42b27d..00000000 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { VocabulariesComponent } from './vocabularies.component'; - -describe('VocabulariesComponent', () => { - let component: VocabulariesComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ VocabulariesComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(VocabulariesComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts index 22621aa0..52349409 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts @@ -1,6 +1,6 @@ import { Component, Inject, AfterViewInit, OnInit, ViewChild } from '@angular/core'; import { ISService } from '../is.service'; -import { MatTableDataSource } from '@angular/material/table'; +import { MatTable, MatTableDataSource } from '@angular/material/table'; import { MatSort, Sort } from '@angular/material/sort'; import { Vocabulary, VocabularyTermSynonym } from '../model/controller.model'; import { ActivatedRoute, Params } from '@angular/router'; @@ -183,24 +183,35 @@ export class VocTermDialog { termForm = new FormGroup({ code: new FormControl(''), name: new FormControl(''), - encoding: new FormControl('') + encoding: new FormControl('OPENAIRE'), + tmpSynonymTerm: new FormControl(''), + tmpSynonymEncoding: new FormControl('OPENAIRE') }); - synonyms:VocabularyTermSynonym[] = []; - tmpSynonym:VocabularyTermSynonym = { term: '', encoding: 'OPENAIRE' }; + synonymsDatasource: MatTableDataSource = new MatTableDataSource([]); + synonymColums: string[] = ['term', 'encoding', 'buttons']; + @ViewChild(MatTable) synonymsTable: MatTable | undefined; constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { this.termForm.get('code')?.setValue(data.code); this.termForm.get('name')?.setValue(data.name); this.termForm.get('encoding')?.setValue(data.encoding); - this.synonyms = data.synonyms; + this.synonymsDatasource.data = data.synonyms; } onSubmit(): void { + console.log('SUBMIT'); + let oldCode = this.data.code; let voc = this.data.vocabulary; - const term = Object.assign({}, this.data, this.termForm.value); + let term:VocabularyTerm = { + code : this.termForm.get('code')?.value!, + name : this.termForm.get('name')?.value!, + encoding : this.termForm.get('encoding')?.value!, + synonyms: this.synonymsDatasource.data, + vocabulary: voc + } this.service.saveVocabularyTerm(voc, term, (data: void) => { if (oldCode && oldCode != term.code) { @@ -210,12 +221,26 @@ export class VocTermDialog { } removeSynonym(pos:number) { - this.synonyms.splice(pos, 1); + this.synonymsDatasource.data.splice(pos, 1); + this.synonymsTable?.renderRows(); + } + + isNewSynonymValid(): boolean { + if (!this.termForm.get('tmpSynonymTerm')) return false; + if (!this.termForm.get('tmpSynonymEncoding')) return false; + if (this.termForm.get('tmpSynonymTerm')?.value?.trim().length == 0) return false; + if (this.termForm.get('tmpSynonymEncoding')?.value?.trim().length == 0) return false; + return true; } addSynonym() { - this.synonyms.push(Object.assign({}, this.tmpSynonym)); - this.tmpSynonym = { term: '', encoding: 'OPENAIRE' }; + this.synonymsDatasource.data.push({ + term: this.termForm.get('tmpSynonymTerm')?.value!, + encoding: this.termForm.get('tmpSynonymEncoding')?.value! + }); + this.termForm.get('tmpSynonymTerm')?.setValue(''); + this.termForm.get('tmpSynonymEncoding')?.setValue('OPENAIRE'); + this.synonymsTable?.renderRows(); } onNoClick(): void { diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.spec.ts b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.spec.ts deleted file mode 100644 index 203ed650..00000000 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { WfHistoryComponent } from './wf-history.component'; - -describe('WfHistoryComponent', () => { - let component: WfHistoryComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ WfHistoryComponent ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WfHistoryComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); -- 2.17.1 From 23a3f2546e25533bc865bc2af8f2de9e5944995b Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Tue, 31 Jan 2023 11:05:11 +0100 Subject: [PATCH 29/43] dsm setup --- .../src/app/app-routing.module.ts | 5 + .../dnet-is-application/src/app/app.module.ts | 9 +- .../src/app/dsm/dsm-add-api.component.html | 1 + .../src/app/dsm/dsm-api.component.html | 1 + .../src/app/dsm/dsm-results.component.html | 1 + .../src/app/dsm/dsm-search.component.html | 1 + .../src/app/dsm/dsm.component.css | 0 .../src/app/dsm/dsm.component.ts | 37 ++++++ .../main-menu-panels.component.html | 2 +- .../main-menu-tree.component.css | 4 - .../main-menu-tree.component.html | 40 ------ .../main-menu-tree.component.ts | 114 ------------------ .../src/app/main-menu-tree/menu-data.ts | 24 ---- 13 files changed, 53 insertions(+), 186 deletions(-) create mode 100644 frontends/dnet-is-application/src/app/dsm/dsm-add-api.component.html create mode 100644 frontends/dnet-is-application/src/app/dsm/dsm-api.component.html create mode 100644 frontends/dnet-is-application/src/app/dsm/dsm-results.component.html create mode 100644 frontends/dnet-is-application/src/app/dsm/dsm-search.component.html create mode 100644 frontends/dnet-is-application/src/app/dsm/dsm.component.css create mode 100644 frontends/dnet-is-application/src/app/dsm/dsm.component.ts delete mode 100644 frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.css delete mode 100644 frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.html delete mode 100644 frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts delete mode 100644 frontends/dnet-is-application/src/app/main-menu-tree/menu-data.ts diff --git a/frontends/dnet-is-application/src/app/app-routing.module.ts b/frontends/dnet-is-application/src/app/app-routing.module.ts index 6cb55229..f943a72f 100644 --- a/frontends/dnet-is-application/src/app/app-routing.module.ts +++ b/frontends/dnet-is-application/src/app/app-routing.module.ts @@ -6,6 +6,7 @@ import { WfHistoryComponent } from './wf-history/wf-history.component'; import { ResourcesComponent } from './resources/resources.component'; import { VocabulariesComponent, VocabularyEditorComponent } from './vocabularies/vocabularies.component'; import { ContextViewerComponent, ContextsComponent } from './contexts/contexts.component'; +import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiComponent } from './dsm/dsm.component'; const routes: Routes = [ { path:"info" , component:InfoComponent }, @@ -16,6 +17,10 @@ const routes: Routes = [ { path:"wf_history" , component:WfHistoryComponent }, { path:"ctx_viewer" , component:ContextViewerComponent }, { path:"voc_editor" , component:VocabularyEditorComponent }, + { path:"dsm/search" , component:DsmSearchComponent }, + { path:"dsm/results/:page/:size" , component:DsmResultsComponent }, + { path:"dsm/addApi" , component:DsmAddApiComponent }, + { path:"dsm/api" , component:DsmApiComponent } ]; @NgModule({ diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index f73db797..02253e0c 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -14,7 +14,6 @@ import { MatSidenavModule } from '@angular/material/sidenav'; import { MatIconModule } from '@angular/material/icon'; import { MatListModule } from '@angular/material/list'; import { MatTreeModule } from '@angular/material/tree'; -import { MainMenuTreeComponent } from './main-menu-tree/main-menu-tree.component'; import { MatBadgeModule } from '@angular/material/badge'; import { MatCardModule } from '@angular/material/card'; import { MatFormFieldModule } from '@angular/material/form-field'; @@ -30,13 +29,13 @@ import { ResourcesComponent, ResContentDialog, ResCreateNewDialog, ResMetadataDi import { MatSnackBarModule } from '@angular/material/snack-bar'; import { ContextsComponent, ContextViewerComponent, ContextParamsDialog } from './contexts/contexts.component'; import { VocabulariesComponent, VocabularyEditorComponent, VocDialog, VocTermDialog } from './vocabularies/vocabularies.component'; +import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiComponent } from './dsm/dsm.component'; @NgModule({ declarations: [ AppComponent, FilterPipe, MainMenuPanelsComponent, - MainMenuTreeComponent, InfoComponent, ProtocolsComponent, WfHistoryComponent, @@ -51,7 +50,11 @@ import { VocabulariesComponent, VocabularyEditorComponent, VocDialog, VocTermDia VocabulariesComponent, VocabularyEditorComponent, VocDialog, - VocTermDialog + VocTermDialog, + DsmSearchComponent, + DsmResultsComponent, + DsmApiComponent, + DsmAddApiComponent ], imports: [ BrowserModule, diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.component.html new file mode 100644 index 00000000..8c0318ce --- /dev/null +++ b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.component.html @@ -0,0 +1 @@ +

dsm search

diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-api.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-api.component.html new file mode 100644 index 00000000..8c0318ce --- /dev/null +++ b/frontends/dnet-is-application/src/app/dsm/dsm-api.component.html @@ -0,0 +1 @@ +

dsm search

diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html new file mode 100644 index 00000000..8c0318ce --- /dev/null +++ b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html @@ -0,0 +1 @@ +

dsm search

diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html new file mode 100644 index 00000000..8c0318ce --- /dev/null +++ b/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html @@ -0,0 +1 @@ +

dsm search

diff --git a/frontends/dnet-is-application/src/app/dsm/dsm.component.css b/frontends/dnet-is-application/src/app/dsm/dsm.component.css new file mode 100644 index 00000000..e69de29b diff --git a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts new file mode 100644 index 00000000..14e8440d --- /dev/null +++ b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts @@ -0,0 +1,37 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-dsm-search', + templateUrl: './dsm-search.component.html', + styleUrls: ['./dsm.component.css'] +}) +export class DsmSearchComponent { + +} + +@Component({ + selector: 'app-dsm-results', + templateUrl: './dsm-results.component.html', + styleUrls: ['./dsm.component.css'] +}) +export class DsmResultsComponent { + +} + +@Component({ + selector: 'app-dsm-api', + templateUrl: './dsm-api.component.html', + styleUrls: ['./dsm.component.css'] +}) +export class DsmApiComponent { + +} + +@Component({ + selector: 'app-dsm-add-api', + templateUrl: './dsm-add-api.component.html', + styleUrls: ['./dsm.component.css'] +}) +export class DsmAddApiComponent { + +} diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html index c09e72f0..795242d9 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html @@ -15,7 +15,7 @@ Datasources diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.css b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.css deleted file mode 100644 index bcf84cd4..00000000 --- a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.css +++ /dev/null @@ -1,4 +0,0 @@ -.type-icon { - color: #757575; - margin-right: 5px; -} diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.html b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.html deleted file mode 100644 index a84203f7..00000000 --- a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - {{ node.type === 'menuitem' ? 'description' : 'folder' }} - -
- {{node.name}} - {{node.name}} -
-
- {{node.name}} - {{node.name}} -
-
- - - - - {{ node.type ==='menuitem' ? 'description' : 'folder' }} - -
- {{node.name}} - {{node.name}} -
-
- {{node.name}} - {{node.name}} -
-
-
diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts b/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts deleted file mode 100644 index 08c2d7cc..00000000 --- a/frontends/dnet-is-application/src/app/main-menu-tree/main-menu-tree.component.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { Component } from '@angular/core'; -import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree'; -import { FlatTreeControl } from '@angular/cdk/tree'; -import { menuData } from './menu-data'; -import { ResourceType } from '../model/controller.model'; -import { ISService } from '../is.service'; - -export interface MenuNode { - name: string; - type: string; - route?: string; - badge?: string; - children?: MenuNode[]; -} - -export interface FlatTreeNode { - name: string; - type: string; - level: number; - route?: string; - badge?: string; - expandable: boolean; -} - -@Component({ - selector: 'app-main-menu-tree', - templateUrl: './main-menu-tree.component.html', - styleUrls: ['./main-menu-tree.component.css'] -}) -export class MainMenuTreeComponent { - - /** The TreeControl controls the expand/collapse state of tree nodes. */ - treeControl: FlatTreeControl; - - /** The TreeFlattener is used to generate the flat list of items from hierarchical data. */ - treeFlattener: MatTreeFlattener; - - /** The MatTreeFlatDataSource connects the control and flattener to provide data. */ - dataSource: MatTreeFlatDataSource; - - constructor(public service:ISService) { - this.treeFlattener = new MatTreeFlattener( - this.transformer, - this.getLevel, - this.isExpandable, - this.getChildren); - - this.service.loadResourceTypes((data:ResourceType[]) => { - let simpleResources: MenuNode[] = [] - let advancedResources: MenuNode[] = [] - - data.forEach(resType => { - let item:MenuNode = { - name: resType.name, - type: 'menuitem', - badge: resType.count.toString() - } - if (resType.simple) { - item.route = '/resources/' + resType.id; - simpleResources.push(item) - } else { - item.route = '/adv_resources/' + resType.id; - advancedResources.push(item) - } - }) - - menuData.forEach(m => { - if (m.name=='Simple Resources') { - m.children = simpleResources - } else if (m.name=='Advanced Resources') { - m.children = advancedResources - } - }) - this.dataSource.data = menuData; - }); - - this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable); - this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener); - this.dataSource.data = menuData; - - } - - /** Transform the data to something the tree can read. */ - transformer(node: MenuNode, level: number): FlatTreeNode { - return { - name: node.name, - type: node.type, - route: node.route, - badge: node.badge, - level, - expandable: !!node.children - }; - } - - /** Get the level of the node */ - getLevel(node: FlatTreeNode): number { - return node.level; - } - - /** Get whether the node is expanded or not. */ - isExpandable(node: FlatTreeNode): boolean { - return node.expandable; - } - - /** Get whether the node has children or not. */ - hasChild(index: number, node: FlatTreeNode): boolean { - return node.expandable; - } - - /** Get the children for the node. */ - getChildren(node: MenuNode): MenuNode[] | null | undefined { - return node.children; - } -} diff --git a/frontends/dnet-is-application/src/app/main-menu-tree/menu-data.ts b/frontends/dnet-is-application/src/app/main-menu-tree/menu-data.ts deleted file mode 100644 index fe939c0c..00000000 --- a/frontends/dnet-is-application/src/app/main-menu-tree/menu-data.ts +++ /dev/null @@ -1,24 +0,0 @@ -export const menuData = [ - { name: 'Home', type: 'menuitem' }, - { - name: 'Datasources', - type: 'menu', - children: [ - { name: 'Search', type: 'menuitem' } - ] - }, - { - name: 'Simple Resources', - type: 'menu', - children: [] - }, - { - name: 'Advanced Resources', - type: 'menu', - children: [] - }, - { name: 'Workflow History', type: 'menuitem' }, - { name: 'Container Info', type: 'menuitem', route: 'info' }, - { name: 'API Documentation', type: 'menuitem' } - -]; -- 2.17.1 From e3e597ee31078938c990398da12ec44fed8ec5af Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Tue, 31 Jan 2023 12:36:51 +0100 Subject: [PATCH 30/43] dsm search page --- .../dnet-is-application/src/app/app.module.ts | 5 +- .../src/app/dsm/dsm-browse-dialog.html | 36 +++++++++ .../src/app/dsm/dsm-search.component.html | 18 ++++- .../src/app/dsm/dsm.component.ts | 77 ++++++++++++++++++- .../dnet-is-application/src/app/is.service.ts | 16 +++- .../src/app/model/controller.model.ts | 7 ++ frontends/dnet-is-application/src/styles.css | 6 +- 7 files changed, 157 insertions(+), 8 deletions(-) create mode 100644 frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 02253e0c..882a6f33 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -29,7 +29,7 @@ import { ResourcesComponent, ResContentDialog, ResCreateNewDialog, ResMetadataDi import { MatSnackBarModule } from '@angular/material/snack-bar'; import { ContextsComponent, ContextViewerComponent, ContextParamsDialog } from './contexts/contexts.component'; import { VocabulariesComponent, VocabularyEditorComponent, VocDialog, VocTermDialog } from './vocabularies/vocabularies.component'; -import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiComponent } from './dsm/dsm.component'; +import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiComponent, DsmBrowseDialog } from './dsm/dsm.component'; @NgModule({ declarations: [ @@ -54,7 +54,8 @@ import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiComp DsmSearchComponent, DsmResultsComponent, DsmApiComponent, - DsmAddApiComponent + DsmAddApiComponent, + DsmBrowseDialog ], imports: [ BrowserModule, diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html b/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html new file mode 100644 index 00000000..0c0d3131 --- /dev/null +++ b/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html @@ -0,0 +1,36 @@ +

{{data.label}}

+ +
+ + Filter + + + + + + + + + + + + + + + + + + + + + + +
Name + {{element.name}} + # datasources {{element.total}}
No data matching the filter "{{input.value}}"
+ +
+ +
+ +
diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html index 8c0318ce..9d2b170c 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html @@ -1 +1,17 @@ -

dsm search

+

Datasource Manager: Search

+ +
+ + Search... + + +
+ +
+

Or browse using:

+ +
diff --git a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts index 14e8440d..3428d691 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts +++ b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts @@ -1,11 +1,47 @@ -import { Component } from '@angular/core'; +import { Component, Inject, AfterViewInit, OnInit, ViewChild } from '@angular/core'; +import { BrowseTerm, KeyValue } from '../model/controller.model'; +import { ISService } from '../is.service'; +import { ActivatedRoute, Params } from '@angular/router'; +import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { MatTable, MatTableDataSource } from '@angular/material/table'; +import { MatSort, Sort } from '@angular/material/sort'; +import { Vocabulary, VocabularyTermSynonym } from '../model/controller.model'; +import { Observable, combineLatest } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { VocabularyTerm } from '../model/controller.model'; +import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; +import { EmitterVisitorContext } from '@angular/compiler'; +import { Router } from '@angular/router'; + @Component({ selector: 'app-dsm-search', templateUrl: './dsm-search.component.html', styleUrls: ['./dsm.component.css'] }) -export class DsmSearchComponent { +export class DsmSearchComponent implements OnInit { + searchText:string = ''; + browsableFields:KeyValue[] = []; + + constructor(public service: ISService, public route: ActivatedRoute, public router: Router, public dialog: MatDialog) { + } + + ngOnInit() { + this.service.dsmBrowsableFields((data: KeyValue[]) => this.browsableFields = data); + } + + search() { + this.router.navigate(['/dsm/results/0/100'], { + queryParams: { value: this.searchText } + }); + } + + browseField(field:string, label:string) { + const dialogRef = this.dialog.open(DsmBrowseDialog, { + data: { field: field, label: label }, + width: '80%' + }); + } } @@ -15,7 +51,6 @@ export class DsmSearchComponent { styleUrls: ['./dsm.component.css'] }) export class DsmResultsComponent { - } @Component({ @@ -35,3 +70,39 @@ export class DsmApiComponent { export class DsmAddApiComponent { } + + + + +@Component({ + selector: 'dsm-browse-dialog', + templateUrl: 'dsm-browse-dialog.html', + styleUrls: ['./dsm.component.css'] +}) +export class DsmBrowseDialog implements OnInit{ + + datasource: MatTableDataSource = new MatTableDataSource([]); + colums: string[] = ['name', 'total']; + + @ViewChild(MatSort) sort: MatSort | undefined + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { + } + + ngOnInit(): void { + this.service.dsmBrowse(this.data.field, (res:BrowseTerm[]) => this.datasource.data = res); + } + + ngAfterViewInit() { + if (this.sort) this.datasource.sort = this.sort; + } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value.trim().toLowerCase(); + this.datasource.filter = filterValue; + } + + onNoClick(): void { + this.dialogRef.close(); + } +} \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts index 4164d44b..1b523ea4 100644 --- a/frontends/dnet-is-application/src/app/is.service.ts +++ b/frontends/dnet-is-application/src/app/is.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary, VocabularyTerm } from './model/controller.model'; +import { ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary, VocabularyTerm, KeyValue, BrowseTerm } from './model/controller.model'; import { Observable, Observer } from 'rxjs'; import { FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -186,6 +186,20 @@ export class ISService { }); } + dsmBrowsableFields(onSuccess: Function) { + this.client.get('./ajax/dsm/browsableFields').subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + dsmBrowse(field:string, onSuccess: Function) { + this.client.get('./ajax/dsm/browse/' + encodeURIComponent(field)).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + private showError(error: any, form?: FormGroup) { const msg = this.errorMessage(error); if (form) { diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts index d1cbeb29..5a312013 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -11,6 +11,13 @@ export interface KeyValue { v: string; } + +export interface BrowseTerm { + term: string, + name: string, + total: number +} + export interface Module { group: string; name: string; diff --git a/frontends/dnet-is-application/src/styles.css b/frontends/dnet-is-application/src/styles.css index 91fefbac..5b998665 100644 --- a/frontends/dnet-is-application/src/styles.css +++ b/frontends/dnet-is-application/src/styles.css @@ -30,11 +30,15 @@ a, a:not([href]) { -webkit-user-select: none; -moz-user-select: none; user-select: none; - text-decoration: underline; + text-decoration: none; text-underline-offset: 3px; color: #336699; } +a:hover, a:not([href]):hover { + text-decoration: underline; +} + table { table-layout: fixed !important; } -- 2.17.1 From 6f291aa006608af0c494fbc6869276794fa5b719 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Tue, 31 Jan 2023 15:02:51 +0100 Subject: [PATCH 31/43] dsm results pagination --- .../dnet-is-application/src/app/app.module.ts | 4 +- .../src/app/dsm/dsm-browse-dialog.html | 2 +- .../src/app/dsm/dsm-results.component.html | 16 ++++- .../src/app/dsm/dsm-search.component.html | 1 + .../src/app/dsm/dsm.component.ts | 58 +++++++++++++++++-- .../dnet-is-application/src/app/is.service.ts | 16 ++++- .../src/app/model/controller.model.ts | 44 ++++++++++++++ 7 files changed, 133 insertions(+), 8 deletions(-) diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 882a6f33..d285bd2b 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -30,6 +30,7 @@ import { MatSnackBarModule } from '@angular/material/snack-bar'; import { ContextsComponent, ContextViewerComponent, ContextParamsDialog } from './contexts/contexts.component'; import { VocabulariesComponent, VocabularyEditorComponent, VocDialog, VocTermDialog } from './vocabularies/vocabularies.component'; import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiComponent, DsmBrowseDialog } from './dsm/dsm.component'; +import { MatPaginatorModule } from '@angular/material/paginator'; @NgModule({ declarations: [ @@ -79,7 +80,8 @@ import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiComp MatDialogModule, MatSortModule, ReactiveFormsModule, - MatSnackBarModule + MatSnackBarModule, + MatPaginatorModule ], providers: [], bootstrap: [AppComponent] diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html b/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html index 0c0d3131..6376fe3d 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html @@ -11,7 +11,7 @@ Name - {{element.name}} + {{element.name}} diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html index 8c0318ce..feced00b 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html @@ -1 +1,15 @@ -

dsm search

+

Datasource Manager: Results

+ + + + +
+ {{ds.name}} + +
\ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html index 9d2b170c..5e133c45 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html @@ -15,3 +15,4 @@ + diff --git a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts index 3428d691..fbf6335f 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts +++ b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts @@ -1,5 +1,5 @@ import { Component, Inject, AfterViewInit, OnInit, ViewChild } from '@angular/core'; -import { BrowseTerm, KeyValue } from '../model/controller.model'; +import { BrowseTerm, Datasource, KeyValue } from '../model/controller.model'; import { ISService } from '../is.service'; import { ActivatedRoute, Params } from '@angular/router'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; @@ -8,10 +8,11 @@ import { MatSort, Sort } from '@angular/material/sort'; import { Vocabulary, VocabularyTermSynonym } from '../model/controller.model'; import { Observable, combineLatest } from 'rxjs'; import { map } from 'rxjs/operators'; -import { VocabularyTerm } from '../model/controller.model'; +import { Page } from '../model/controller.model'; import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; import { EmitterVisitorContext } from '@angular/compiler'; import { Router } from '@angular/router'; +import { PageEvent } from '@angular/material/paginator'; @Component({ @@ -31,7 +32,7 @@ export class DsmSearchComponent implements OnInit { } search() { - this.router.navigate(['/dsm/results/0/100'], { + this.router.navigate(['/dsm/results/0/50'], { queryParams: { value: this.searchText } }); } @@ -50,7 +51,56 @@ export class DsmSearchComponent implements OnInit { templateUrl: './dsm-results.component.html', styleUrls: ['./dsm.component.css'] }) -export class DsmResultsComponent { +export class DsmResultsComponent implements OnInit { + results:Datasource[] = []; + nResults:number = 0; + currPage:number = 0; + nPages:number = 0; + pageSize:number = 0; + field?:string; + value:string = ''; + + constructor(public service: ISService, public route: ActivatedRoute, public router: Router, public dialog: MatDialog) { + } + + ngOnInit(): void { + combineLatest([ this.route.params, this.route.queryParams ], + (params: Params, queryParams: Params) => ({ params, queryParams }) + ).subscribe((res: { params: Params; queryParams: Params }) => { + const { params, queryParams} = res; + this.currPage = parseInt(params['page']); + this.pageSize = parseInt(params['size']); + this.field = queryParams['field']; + this.value = queryParams['value']; + + if (this.field) { + this.service.dsmSearchByField(this.field, this.value, this.currPage, this.pageSize, (page:Page) => { + this.results = page.content; + this.nResults = page.totalElements; + this.nPages = page.totalPages; + }); + } else { + this.service.dsmSearch(this.value, this.currPage, this.pageSize, (page:Page) => { + this.results = page.content; + this.nResults = page.totalElements; + this.nPages = page.totalPages; + }); + } + }); + } + + changePage(event: PageEvent) { + console.log(event.pageIndex); + + let path = '/dsm/results/' + event.pageIndex + '/' + event.pageSize; + let qp = this.field ? + { field: this.field, value: this.value } : + { value: this.value }; + + this.router.navigate([path], { + queryParams: qp + }); + } } @Component({ diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts index 1b523ea4..00be5f51 100644 --- a/frontends/dnet-is-application/src/app/is.service.ts +++ b/frontends/dnet-is-application/src/app/is.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary, VocabularyTerm, KeyValue, BrowseTerm } from './model/controller.model'; +import { Page, ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary, VocabularyTerm, KeyValue, BrowseTerm, Datasource } from './model/controller.model'; import { Observable, Observer } from 'rxjs'; import { FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -200,6 +200,20 @@ export class ISService { }); } + dsmSearchByField(field:string, value:string, page:number, pageSize:number, onSuccess: Function) { + this.client.get>('./ajax/dsm/searchByField/' + encodeURIComponent(field) + '/' + page + '/' + pageSize + '?value=' + encodeURIComponent(value)).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + + dsmSearch(value:string, page:number, pageSize:number, onSuccess: Function) { + this.client.get>('./ajax/dsm/search/' + page + '/' + pageSize + '?value=' + encodeURIComponent(value)).subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + private showError(error: any, form?: FormGroup) { const msg = this.errorMessage(error); if (form) { diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts index 5a312013..62cf73c5 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -102,3 +102,47 @@ export interface VocabularyTerm { encoding: string, synonyms: VocabularyTermSynonym[] } + +export interface Api { + id: string, + protocol: string, + compliance: string, + active: boolean, + aggrDate: string, + aggrTotal: number +} + +export interface Organization { + name:string, + country:string +} + + +export interface Datasource { + id: string, + name: string, + otherName?: string, + nsprefix: string, + websiteUrl?: string, + type: string, + consenttermsofuse?: boolean, + fulltextdownload?: boolean, + collectedFrom: string, + organizations: Organization[], + apis: Api[] +} + +export interface Page { + content: T[], + last: boolean, + first: boolean, + totalPages: number, + totalElements: number, + numberOfElements: number, + size: number, + number: number, + empty:boolean, + pageable?:any, + sort?:any +} + -- 2.17.1 From 7baa6dcbdebe396ea41b00b0dc44ad3ba5cc7bcf Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Wed, 1 Feb 2023 09:33:22 +0100 Subject: [PATCH 32/43] paginations --- .../src/app/dsm/dsm-results.component.html | 18 +++++++++++++++++- .../src/app/dsm/dsm.component.ts | 2 -- .../src/app/model/controller.model.ts | 8 +------- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html index feced00b..5d8fcd86 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html @@ -1,5 +1,11 @@

Datasource Manager: Results

+

+ Searching for {{field}} = "{{value}}" + Searching for "{{value}}" + Returning all the datasources +

+ +
{{ds.name}} -
\ No newline at end of file + + + + \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts index fbf6335f..71a6a7d7 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts +++ b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts @@ -90,8 +90,6 @@ export class DsmResultsComponent implements OnInit { } changePage(event: PageEvent) { - console.log(event.pageIndex); - let path = '/dsm/results/' + event.pageIndex + '/' + event.pageSize; let qp = this.field ? { field: this.field, value: this.value } : diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/model/controller.model.ts index 62cf73c5..c7de0524 100644 --- a/frontends/dnet-is-application/src/app/model/controller.model.ts +++ b/frontends/dnet-is-application/src/app/model/controller.model.ts @@ -134,15 +134,9 @@ export interface Datasource { export interface Page { content: T[], - last: boolean, - first: boolean, totalPages: number, totalElements: number, - numberOfElements: number, size: number, - number: number, - empty:boolean, - pageable?:any, - sort?:any + number: number } -- 2.17.1 From 1c7869076f0e8de956dae06b7248aae7d1607ed6 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Wed, 1 Feb 2023 09:58:36 +0100 Subject: [PATCH 33/43] cleaning --- .../dnet-is-application/src/app/app.component.ts | 1 - .../src/app/contexts/contexts.component.ts | 9 +++------ .../src/app/dsm/dsm.component.ts | 14 +++++--------- .../src/app/info/info.component.ts | 2 +- .../app/{model/controller.model.ts => is.model.ts} | 0 .../dnet-is-application/src/app/is.service.ts | 3 +-- .../main-menu-panels/main-menu-panels.component.ts | 6 +++--- .../src/app/protocols/protocols.component.ts | 2 +- .../src/app/resources/resources.component.ts | 10 +++------- .../src/app/vocabularies/vocabularies.component.ts | 13 +++++-------- .../src/app/wf-history/wf-history.component.ts | 9 ++++----- 11 files changed, 26 insertions(+), 43 deletions(-) rename frontends/dnet-is-application/src/app/{model/controller.model.ts => is.model.ts} (100%) diff --git a/frontends/dnet-is-application/src/app/app.component.ts b/frontends/dnet-is-application/src/app/app.component.ts index 71e729ba..1a02c86c 100644 --- a/frontends/dnet-is-application/src/app/app.component.ts +++ b/frontends/dnet-is-application/src/app/app.component.ts @@ -1,5 +1,4 @@ import { Component, inject } from '@angular/core'; -import { TitleStrategy } from '@angular/router'; import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; import { Observable } from 'rxjs'; import { map, shareReplay } from 'rxjs/operators'; diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.ts b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts index 2f26a105..37188d2a 100644 --- a/frontends/dnet-is-application/src/app/contexts/contexts.component.ts +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts @@ -1,14 +1,11 @@ import { Component, Inject,AfterViewInit, OnInit, ViewChild } from '@angular/core'; import { ISService } from '../is.service'; import { MatTableDataSource } from '@angular/material/table'; -import { MatSort, Sort } from '@angular/material/sort'; -import { Context, ContextNode, WfHistoryEntry } from '../model/controller.model'; +import { MatSort } from '@angular/material/sort'; +import { Context, ContextNode } from '../is.model'; import { ActivatedRoute, Params } from '@angular/router'; -import { Observable, combineLatest } from 'rxjs'; -import { map } from 'rxjs/operators'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { KeyValue, ContextParam } from '../model/controller.model'; -import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; +import { ContextParam } from '../is.model'; @Component({ selector: 'app-contexts', diff --git a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts index 71a6a7d7..90832a45 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts +++ b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts @@ -1,16 +1,12 @@ -import { Component, Inject, AfterViewInit, OnInit, ViewChild } from '@angular/core'; -import { BrowseTerm, Datasource, KeyValue } from '../model/controller.model'; +import { Component, Inject, OnInit, ViewChild } from '@angular/core'; +import { BrowseTerm, Datasource, KeyValue } from '../is.model'; import { ISService } from '../is.service'; import { ActivatedRoute, Params } from '@angular/router'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { MatTable, MatTableDataSource } from '@angular/material/table'; +import { MatTableDataSource } from '@angular/material/table'; import { MatSort, Sort } from '@angular/material/sort'; -import { Vocabulary, VocabularyTermSynonym } from '../model/controller.model'; -import { Observable, combineLatest } from 'rxjs'; -import { map } from 'rxjs/operators'; -import { Page } from '../model/controller.model'; -import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; -import { EmitterVisitorContext } from '@angular/compiler'; +import { combineLatest } from 'rxjs'; +import { Page } from '../is.model'; import { Router } from '@angular/router'; import { PageEvent } from '@angular/material/paginator'; diff --git a/frontends/dnet-is-application/src/app/info/info.component.ts b/frontends/dnet-is-application/src/app/info/info.component.ts index bfdf6278..37fa4280 100644 --- a/frontends/dnet-is-application/src/app/info/info.component.ts +++ b/frontends/dnet-is-application/src/app/info/info.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; import { ISService } from '../is.service'; import { MatTableDataSource } from '@angular/material/table'; -import { KeyValue, Module } from '../model/controller.model'; +import { Module } from '../is.model'; export interface KeyValueDatasource { name: string; diff --git a/frontends/dnet-is-application/src/app/model/controller.model.ts b/frontends/dnet-is-application/src/app/is.model.ts similarity index 100% rename from frontends/dnet-is-application/src/app/model/controller.model.ts rename to frontends/dnet-is-application/src/app/is.model.ts diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/is.service.ts index 00be5f51..c04a34e0 100644 --- a/frontends/dnet-is-application/src/app/is.service.ts +++ b/frontends/dnet-is-application/src/app/is.service.ts @@ -1,7 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { Page, ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary, VocabularyTerm, KeyValue, BrowseTerm, Datasource } from './model/controller.model'; -import { Observable, Observer } from 'rxjs'; +import { Page, ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary, VocabularyTerm, KeyValue, BrowseTerm, Datasource } from './is.model'; import { FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material/snack-bar'; diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts index 140245f9..06ca8953 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts @@ -1,7 +1,7 @@ -import {Component, ViewChild, ViewEncapsulation} from '@angular/core'; -import { ResourceType } from '../model/controller.model'; +import { Component, ViewChild } from '@angular/core'; +import { ResourceType } from '../is.model'; import { ISService } from '../is.service'; -import {MatAccordion} from '@angular/material/expansion'; +import { MatAccordion } from '@angular/material/expansion'; @Component({ diff --git a/frontends/dnet-is-application/src/app/protocols/protocols.component.ts b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts index d8388273..675a0fb6 100644 --- a/frontends/dnet-is-application/src/app/protocols/protocols.component.ts +++ b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; import { ISService } from '../is.service'; import { MatTableDataSource } from '@angular/material/table'; -import { Protocol, ProtocolParams } from '../model/controller.model'; +import { Protocol, ProtocolParams } from '../is.model'; export interface ProtocolDatasource { protocol: string; diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.ts b/frontends/dnet-is-application/src/app/resources/resources.component.ts index 2844d174..c499e88d 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.ts +++ b/frontends/dnet-is-application/src/app/resources/resources.component.ts @@ -1,13 +1,9 @@ -import { Component, Inject,AfterViewInit, ViewChild, OnInit } from '@angular/core'; +import { Component, Inject, OnInit } from '@angular/core'; import { ISService } from '../is.service'; -import { MatTableDataSource } from '@angular/material/table'; -import { MatSort, Sort } from '@angular/material/sort'; import { ActivatedRoute } from '@angular/router'; -import { map } from 'rxjs/operators'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { ResourceType, SimpleResource } from '../model/controller.model'; -import {FormControl, FormGroup, FormGroupDirective, NgForm, Validators} from '@angular/forms'; -import { ResourceLoader } from '@angular/compiler'; +import { ResourceType, SimpleResource } from '../is.model'; +import { FormControl, FormGroup } from '@angular/forms'; @Component({ selector: 'app-resources', diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts index 52349409..042678f9 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts @@ -1,15 +1,12 @@ import { Component, Inject, AfterViewInit, OnInit, ViewChild } from '@angular/core'; import { ISService } from '../is.service'; import { MatTable, MatTableDataSource } from '@angular/material/table'; -import { MatSort, Sort } from '@angular/material/sort'; -import { Vocabulary, VocabularyTermSynonym } from '../model/controller.model'; -import { ActivatedRoute, Params } from '@angular/router'; -import { Observable, combineLatest } from 'rxjs'; -import { map } from 'rxjs/operators'; +import { MatSort } from '@angular/material/sort'; +import { Vocabulary, VocabularyTermSynonym } from '../is.model'; +import { ActivatedRoute } from '@angular/router'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { VocabularyTerm } from '../model/controller.model'; -import { FormControl, FormGroup, FormGroupDirective, NgForm, Validators } from '@angular/forms'; -import { EmitterVisitorContext } from '@angular/compiler'; +import { VocabularyTerm } from '../is.model'; +import { FormControl, FormGroup } from '@angular/forms'; @Component({ selector: 'app-vocabularies', diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts index 44efc691..bad0b50a 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts @@ -1,13 +1,12 @@ import { Component, Inject,AfterViewInit, OnInit, ViewChild } from '@angular/core'; import { ISService } from '../is.service'; import { MatTableDataSource } from '@angular/material/table'; -import { MatSort, Sort } from '@angular/material/sort'; -import { WfHistoryEntry } from '../model/controller.model'; +import { MatSort } from '@angular/material/sort'; +import { WfHistoryEntry } from '../is.model'; import { ActivatedRoute, Params } from '@angular/router'; -import { Observable, combineLatest } from 'rxjs'; -import { map } from 'rxjs/operators'; +import { combineLatest } from 'rxjs'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { KeyValue } from '../model/controller.model'; +import { KeyValue } from '../is.model'; @Component({ selector: 'app-wf-history', -- 2.17.1 From f429138a1ff9a310db9d479fc064803efb498e5a Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Wed, 1 Feb 2023 11:25:36 +0100 Subject: [PATCH 34/43] dsm results --- .../src/app/dsm/dsm-add-api.component.html | 2 +- .../src/app/dsm/dsm-api.component.html | 2 +- .../src/app/dsm/dsm-results.component.html | 82 +++++++++++++++++- .../src/app/dsm/dsm.component.css | 18 ++++ .../src/app/dsm/dsm.component.ts | 3 +- .../src/assets/images/flags/-.gif | Bin 0 -> 807 bytes .../src/assets/images/flags/AD.gif | Bin 0 -> 947 bytes .../src/assets/images/flags/AE.gif | Bin 0 -> 898 bytes .../src/assets/images/flags/AF.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/AG.gif | Bin 0 -> 949 bytes .../src/assets/images/flags/AI.gif | Bin 0 -> 967 bytes .../src/assets/images/flags/AL.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/AM.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/AN.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/AO.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/AQ.gif | Bin 0 -> 990 bytes .../src/assets/images/flags/AR.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/AS.gif | Bin 0 -> 1050 bytes .../src/assets/images/flags/AT.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/AU.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/AW.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/AX.gif | Bin 0 -> 570 bytes .../src/assets/images/flags/AZ.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/BA.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/BB.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/BD.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/BE.gif | Bin 0 -> 1003 bytes .../src/assets/images/flags/BF.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/BG.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/BH.gif | Bin 0 -> 998 bytes .../src/assets/images/flags/BI.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/BJ.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/BL.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/BM.gif | Bin 0 -> 1000 bytes .../src/assets/images/flags/BN.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/BO.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/BQ.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/BR.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/BS.gif | Bin 0 -> 1004 bytes .../src/assets/images/flags/BT.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/BV.gif | Bin 0 -> 934 bytes .../src/assets/images/flags/BW.gif | Bin 0 -> 999 bytes .../src/assets/images/flags/BY.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/BZ.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/CA.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/CC.gif | Bin 0 -> 188 bytes .../src/assets/images/flags/CD.gif | Bin 0 -> 908 bytes .../src/assets/images/flags/CF.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/CG.gif | Bin 0 -> 1001 bytes .../src/assets/images/flags/CH.gif | Bin 0 -> 998 bytes .../src/assets/images/flags/CI.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/CK.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/CL.gif | Bin 0 -> 211 bytes .../src/assets/images/flags/CM.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/CN.gif | Bin 0 -> 579 bytes .../src/assets/images/flags/CO.gif | Bin 0 -> 999 bytes .../src/assets/images/flags/CR.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/CS.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/CU.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/CV.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/CW.gif | Bin 0 -> 120 bytes .../src/assets/images/flags/CX.gif | Bin 0 -> 328 bytes .../src/assets/images/flags/CY.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/CZ.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/DE.gif | Bin 0 -> 1003 bytes .../src/assets/images/flags/DJ.gif | Bin 0 -> 915 bytes .../src/assets/images/flags/DK.gif | Bin 0 -> 1001 bytes .../src/assets/images/flags/DM.gif | Bin 0 -> 960 bytes .../src/assets/images/flags/DO.gif | Bin 0 -> 936 bytes .../src/assets/images/flags/DZ.gif | Bin 0 -> 1001 bytes .../src/assets/images/flags/EC.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/EE.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/EG.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/EH.gif | Bin 0 -> 193 bytes .../src/assets/images/flags/ER.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/ES.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/ET.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/EU.gif | Bin 0 -> 900 bytes .../src/assets/images/flags/FI.gif | Bin 0 -> 1004 bytes .../src/assets/images/flags/FJ.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/FK.gif | Bin 0 -> 926 bytes .../src/assets/images/flags/FM.gif | Bin 0 -> 911 bytes .../src/assets/images/flags/FO.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/FR.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/GA.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/GB.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/GD.gif | Bin 0 -> 959 bytes .../src/assets/images/flags/GE.gif | Bin 0 -> 581 bytes .../src/assets/images/flags/GF.gif | Bin 0 -> 322 bytes .../src/assets/images/flags/GG.gif | Bin 0 -> 202 bytes .../src/assets/images/flags/GH.gif | Bin 0 -> 911 bytes .../src/assets/images/flags/GI.gif | Bin 0 -> 1004 bytes .../src/assets/images/flags/GL.gif | Bin 0 -> 1003 bytes .../src/assets/images/flags/GM.gif | Bin 0 -> 897 bytes .../src/assets/images/flags/GN.gif | Bin 0 -> 902 bytes .../src/assets/images/flags/GP.gif | Bin 0 -> 997 bytes .../src/assets/images/flags/GQ.gif | Bin 0 -> 929 bytes .../src/assets/images/flags/GR.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/GS.gif | Bin 0 -> 309 bytes .../src/assets/images/flags/GT.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/GU.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/GW.gif | Bin 0 -> 913 bytes .../src/assets/images/flags/GY.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/HK.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/HM.gif | Bin 0 -> 937 bytes .../src/assets/images/flags/HN.gif | Bin 0 -> 896 bytes .../src/assets/images/flags/HR.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/HT.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/HU.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/ID.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/IE.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/IL.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/IM.gif | Bin 0 -> 862 bytes .../src/assets/images/flags/IN.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/IO.gif | Bin 0 -> 1070 bytes .../src/assets/images/flags/IQ.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/IR.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/IS.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/IT.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/JE.gif | Bin 0 -> 937 bytes .../src/assets/images/flags/JM.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/JO.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/JP.gif | Bin 0 -> 596 bytes .../src/assets/images/flags/KE.gif | Bin 0 -> 1003 bytes .../src/assets/images/flags/KG.gif | Bin 0 -> 1004 bytes .../src/assets/images/flags/KH.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/KI.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/KM.gif | Bin 0 -> 940 bytes .../src/assets/images/flags/KN.gif | Bin 0 -> 971 bytes .../src/assets/images/flags/KO.gif | Bin 0 -> 311 bytes .../src/assets/images/flags/KP.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/KR.gif | Bin 0 -> 1004 bytes .../src/assets/images/flags/KW.gif | Bin 0 -> 915 bytes .../src/assets/images/flags/KY.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/KZ.gif | Bin 0 -> 1004 bytes .../src/assets/images/flags/LA.gif | Bin 0 -> 893 bytes .../src/assets/images/flags/LB.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/LC.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/LI.gif | Bin 0 -> 897 bytes .../src/assets/images/flags/LK.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/LR.gif | Bin 0 -> 917 bytes .../src/assets/images/flags/LS.gif | Bin 0 -> 925 bytes .../src/assets/images/flags/LT.gif | Bin 0 -> 631 bytes .../src/assets/images/flags/LU.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/LV.gif | Bin 0 -> 999 bytes .../src/assets/images/flags/LY.gif | Bin 0 -> 576 bytes .../src/assets/images/flags/MA.gif | Bin 0 -> 1139 bytes .../src/assets/images/flags/MC.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/MD.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/ME.gif | Bin 0 -> 324 bytes .../src/assets/images/flags/MF.gif | Bin 0 -> 101 bytes .../src/assets/images/flags/MG.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/MH.gif | Bin 0 -> 968 bytes .../src/assets/images/flags/MK.gif | Bin 0 -> 971 bytes .../src/assets/images/flags/MKD.gif | Bin 0 -> 971 bytes .../src/assets/images/flags/ML.gif | Bin 0 -> 902 bytes .../src/assets/images/flags/MM.gif | Bin 0 -> 919 bytes .../src/assets/images/flags/MN.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/MO.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/MP.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/MQ.gif | Bin 0 -> 961 bytes .../src/assets/images/flags/MR.gif | Bin 0 -> 897 bytes .../src/assets/images/flags/MS.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/MT.gif | Bin 0 -> 855 bytes .../src/assets/images/flags/MU.gif | Bin 0 -> 892 bytes .../src/assets/images/flags/MV.gif | Bin 0 -> 914 bytes .../src/assets/images/flags/MW.gif | Bin 0 -> 893 bytes .../src/assets/images/flags/MX.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/MY.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/MZ.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/NA.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/NC.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/NE.gif | Bin 0 -> 904 bytes .../src/assets/images/flags/NF.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/NG.gif | Bin 0 -> 898 bytes .../src/assets/images/flags/NI.gif | Bin 0 -> 901 bytes .../src/assets/images/flags/NL.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/NO.gif | Bin 0 -> 1004 bytes .../src/assets/images/flags/NP.gif | Bin 0 -> 563 bytes .../src/assets/images/flags/NR.gif | Bin 0 -> 1003 bytes .../src/assets/images/flags/NU.gif | Bin 0 -> 289 bytes .../src/assets/images/flags/NZ.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/OC.gif | Bin 0 -> 181 bytes .../src/assets/images/flags/OM.gif | Bin 0 -> 1004 bytes .../src/assets/images/flags/PA.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/PE.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/PF.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/PG.gif | Bin 0 -> 947 bytes .../src/assets/images/flags/PH.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/PK.gif | Bin 0 -> 1004 bytes .../src/assets/images/flags/PL.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/PM.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/PN.gif | Bin 0 -> 547 bytes .../src/assets/images/flags/PR.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/PS.gif | Bin 0 -> 902 bytes .../src/assets/images/flags/PT.gif | Bin 0 -> 1000 bytes .../src/assets/images/flags/PW.gif | Bin 0 -> 855 bytes .../src/assets/images/flags/PY.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/QA.gif | Bin 0 -> 596 bytes .../src/assets/images/flags/RE.gif | Bin 0 -> 863 bytes .../src/assets/images/flags/RO.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/RS.gif | Bin 0 -> 535 bytes .../src/assets/images/flags/RU.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/RW.gif | Bin 0 -> 929 bytes .../src/assets/images/flags/SA.gif | Bin 0 -> 1004 bytes .../src/assets/images/flags/SB.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/SC.gif | Bin 0 -> 977 bytes .../src/assets/images/flags/SD.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/SE.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/SG.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/SH.gif | Bin 0 -> 511 bytes .../src/assets/images/flags/SI.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/SJ.gif | Bin 0 -> 197 bytes .../src/assets/images/flags/SK.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/SL.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/SM.gif | Bin 0 -> 871 bytes .../src/assets/images/flags/SN.gif | Bin 0 -> 923 bytes .../src/assets/images/flags/SO.gif | Bin 0 -> 998 bytes .../src/assets/images/flags/SR.gif | Bin 0 -> 842 bytes .../src/assets/images/flags/SS.gif | Bin 0 -> 312 bytes .../src/assets/images/flags/ST.gif | Bin 0 -> 946 bytes .../src/assets/images/flags/SV.gif | Bin 0 -> 901 bytes .../src/assets/images/flags/SX.gif | Bin 0 -> 317 bytes .../src/assets/images/flags/SY.gif | Bin 0 -> 907 bytes .../src/assets/images/flags/SZ.gif | Bin 0 -> 924 bytes .../src/assets/images/flags/TC.gif | Bin 0 -> 1004 bytes .../src/assets/images/flags/TD.gif | Bin 0 -> 902 bytes .../src/assets/images/flags/TF.gif | Bin 0 -> 863 bytes .../src/assets/images/flags/TG.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/TH.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/TJ.gif | Bin 0 -> 907 bytes .../src/assets/images/flags/TK.gif | Bin 0 -> 543 bytes .../src/assets/images/flags/TL.gif | Bin 0 -> 182 bytes .../src/assets/images/flags/TM.gif | Bin 0 -> 927 bytes .../src/assets/images/flags/TN.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/TO.gif | Bin 0 -> 591 bytes .../src/assets/images/flags/TP.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/TR.gif | Bin 0 -> 995 bytes .../src/assets/images/flags/TT.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/TV.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/TW.gif | Bin 0 -> 587 bytes .../src/assets/images/flags/TZ.gif | Bin 0 -> 1005 bytes .../src/assets/images/flags/UA.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/UG.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/UK.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/UM.gif | Bin 0 -> 925 bytes .../src/assets/images/flags/UNKNOWN.gif | Bin 0 -> 1145 bytes .../src/assets/images/flags/US.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/UY.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/UZ.gif | Bin 0 -> 920 bytes .../src/assets/images/flags/VA.gif | Bin 0 -> 1004 bytes .../src/assets/images/flags/VC.gif | Bin 0 -> 938 bytes .../src/assets/images/flags/VE.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/VG.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/VI.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/VN.gif | Bin 0 -> 999 bytes .../src/assets/images/flags/VU.gif | Bin 0 -> 964 bytes .../src/assets/images/flags/WF.gif | Bin 0 -> 336 bytes .../src/assets/images/flags/WS.gif | Bin 0 -> 994 bytes .../src/assets/images/flags/XK.gif | Bin 0 -> 311 bytes .../src/assets/images/flags/YE.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/YT.gif | Bin 0 -> 472 bytes .../src/assets/images/flags/YU.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/ZA.gif | Bin 0 -> 1006 bytes .../src/assets/images/flags/ZM.gif | Bin 0 -> 926 bytes .../src/assets/images/flags/ZR.gif | Bin 0 -> 924 bytes .../src/assets/images/flags/ZW.gif | Bin 0 -> 1006 bytes frontends/dnet-is-application/src/styles.css | 5 ++ 268 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 frontends/dnet-is-application/src/assets/images/flags/-.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AD.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AF.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AG.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AI.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AL.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AN.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AO.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AQ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AS.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AT.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AU.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AW.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AX.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/AZ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BA.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BB.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BD.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BF.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BG.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BH.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BI.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BJ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BL.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BN.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BO.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BQ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BS.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BT.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BV.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BW.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BY.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/BZ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CA.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CC.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CD.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CF.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CG.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CH.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CI.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CK.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CL.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CN.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CO.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CS.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CU.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CV.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CW.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CX.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CY.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/CZ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/DE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/DJ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/DK.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/DM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/DO.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/DZ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/EC.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/EE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/EG.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/EH.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/ER.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/ES.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/ET.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/EU.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/FI.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/FJ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/FK.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/FM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/FO.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/FR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GA.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GB.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GD.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GF.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GG.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GH.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GI.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GL.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GN.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GP.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GQ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GS.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GT.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GU.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GW.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/GY.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/HK.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/HM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/HN.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/HR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/HT.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/HU.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/ID.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/IE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/IL.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/IM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/IN.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/IO.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/IQ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/IR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/IS.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/IT.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/JE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/JM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/JO.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/JP.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/KE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/KG.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/KH.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/KI.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/KM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/KN.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/KO.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/KP.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/KR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/KW.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/KY.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/KZ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/LA.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/LB.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/LC.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/LI.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/LK.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/LR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/LS.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/LT.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/LU.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/LV.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/LY.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MA.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MC.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MD.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/ME.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MF.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MG.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MH.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MK.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MKD.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/ML.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MN.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MO.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MP.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MQ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MS.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MT.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MU.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MV.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MW.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MX.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MY.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/MZ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/NA.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/NC.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/NE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/NF.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/NG.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/NI.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/NL.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/NO.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/NP.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/NR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/NU.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/NZ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/OC.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/OM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PA.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PF.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PG.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PH.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PK.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PL.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PN.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PS.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PT.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PW.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/PY.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/QA.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/RE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/RO.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/RS.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/RU.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/RW.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SA.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SB.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SC.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SD.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SG.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SH.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SI.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SJ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SK.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SL.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SN.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SO.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SS.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/ST.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SV.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SX.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SY.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/SZ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TC.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TD.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TF.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TG.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TH.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TJ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TK.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TL.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TN.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TO.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TP.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TT.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TV.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TW.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/TZ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/UA.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/UG.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/UK.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/UM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/UNKNOWN.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/US.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/UY.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/UZ.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/VA.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/VC.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/VE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/VG.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/VI.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/VN.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/VU.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/WF.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/WS.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/XK.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/YE.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/YT.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/YU.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/ZA.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/ZM.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/ZR.gif create mode 100644 frontends/dnet-is-application/src/assets/images/flags/ZW.gif diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.component.html index 8c0318ce..dee08cb9 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.component.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.component.html @@ -1 +1 @@ -

dsm search

+

dsm add api

diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-api.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-api.component.html index 8c0318ce..892171d7 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-api.component.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-api.component.html @@ -1 +1 @@ -

dsm search

+

dsm api page

diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html index 5d8fcd86..2668a6c1 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html @@ -6,6 +6,11 @@ Returning all the datasources

+ + Filter in current page (Total: {{(results | searchFilter: filterText).length}}) + + + + + + {{r.name}} + {{r.otherName}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Id{{r.id}}
Type{{r.type}}
Namespace Prefix{{r.nsprefix}}
Collected From{{r.collectedFrom}}
URL{{r.websiteUrl}}
Organization(s) + + {{o.name}} + {{o.country}} +
+
+
APIs + +

+ {{a.id}} + {{a.protocol}} + {{a.compliance}} + active + not active + +
+ Last aggregation: + {{a.aggrDate}} + (total: {{a.aggrTotal}}) +
+

+
+ add api +
Consent Terms of UseYES
Fulltext DownloadYES
+
+
+ + + + + + -
- {{ds.name}} -
$SG$?1#&qV1UVQPfsC>}9E=?2*{*LX+am&E zT+JxkqW}~Kg0ek2Fop$;;R0g>z!)(wMh1j|ObRkF0&P)dtNfyqI6Z^%1Oo>P12YQ?gEaubSsW+; literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/AD.gif b/frontends/dnet-is-application/src/assets/images/flags/AD.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b35b81f92dcc650f9b2990675801eaf35737848 GIT binary patch literal 947 zcmYLIe`r%z7(FlfXj3V!eYeD?t+^5H*RI}~Cpd8UddD$!>02QAkEN}*0*1*?5qEMhp1IK#zRzwWn6HRx4 zC{EXSkh%%IMZ)}ADc8z%4afn@;3?<@n$g^?*3OCMwHArbSXtrCid9WS0pWwV1JMG3 zdpX=lp{alm$F)}@2|c6u4U_={rd0UxQ3K2Xzhvu7T`RMwsWj z7ow%?TrIj_oj1K53#*+h+75Br6kQ9VgNZY!_+Cp%UxwnJPGBFOcXXzB)HBbDgNvtn z_4;MC^f$m;sJ)9mq_{Mhlp2DtI0|xrPXT*9te$Bo4hPBqNfnE!VHm=K zV6q837pNArU6<(o5atw|L|ap>&+@pGyGz0Oz6#0&Sf(lTdU@JMwggeqtR)z zHQk9KYDrpPRjmjjY=~thzENJXKq>$|AZhRuc5gw%sXwBucg0|HR-Ah@hCeypE6%!i z>Z>d47Eu30sb?5FYYm^tuUz$%`A_~;fxgO$x^sIQexIOCTX$VNnGO6KySBYN=!qQa zn;on<*mEEfuJ6^{q4AItag$zFWg6D=<=LUiJ;CI>%f1R<;Oyk)pxeD+VtUMZ>E*7nfSdV8_|1A>bk A@Bjb+ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/AE.gif b/frontends/dnet-is-application/src/assets/images/flags/AE.gif new file mode 100644 index 0000000000000000000000000000000000000000..57c05512dbe45497b3863569858076f51647c4f3 GIT binary patch literal 898 zcmYjQO-NKx6#m}uCMPn|du4byE)peVkP;(Mb75tZPHBTkv=AC?QW=IEY4LL7Pq{D< zG98*~rJ2~Iy%Fm27Wdruo$q|-JNI6yc9oPi zW+5HF0NEnT_hi{EhiK!JLxZ7hSNW7vuD8gMPmzE>khI7?yF5kVt4Ol0e!HyPXOWYC zl7Y?ua0_?@{03AT`hgh0Kx?TI(dS@a>3p=ScQM<__WV%kheQRz4T#-hJpt?!!ic=+ zU*=7eVDG zll-s%o01llnJMS-jcDAI7=gaDp3ts};`5h*dav7!sE3Sa?k^gTLozpN3*Fl*7m%w*{&jPxDDilQoAvoCpYzR0662>tS zN-CGyLZuh6Eu;)x2OI~r{I~*W2Xj|egWSt?H{mBxcp91xMyYmB81Xvrng!~k${W)( zmf|@F$<#*pNW<`ASYtItV;=9f{jgv)B&W->-nZ}2Sb`B|r&967_&(Fg=OEDnyXO57 zUPWwjQET+_lWZ#jDMfbb=woInX3~%%xBhMWw=pKnaQ1Y$?UavR0`W=q!s*0DR)kD1S9uUx&lW9LqWXa)vL1_lcT)&y38 zECE4pLD>>nArB$NN=3;~N&Oam(=JnsPD_gx3#TbgM)^i=Gu@1Gj2ycht*Wd&r+Ws> z5AdJsA22&0d~ta2%;2EuLE-blqZdcVEsjfFmYTITD{)?8?%G^=1^M}l=YRh3`Ni88 z*KS|Cbp6toA75U)d2!~#nQuS8MMgzlxOhPzgI797!n)pEAdXc&O~9m3UO!uM@1b3m zSz_+RlD;`Y&T-5h37pR13|3Z_&!0a#a^&!n$CvhPo1~~9yMAubwiT_lx!zIEqBW_e zhZZGvmIv)zQf+N%YGkOtZ_f?`H4$H1#neEZ$rWyEdV(fb2W+2{vu$qv_JtK!cK1C! zJ$ujcrsJD>-rd}o9_P1j-NYx?4?Mkf^uV0>-LukmEhwwZ3cR_0%BxGOADmorYR9b8 z`&RpTI!TKOJi2wk$I~q+FyP1c@BjY&`}OPB&!0cPef#$1%a>QLUOj#K^vRPaj~+dG z`0(MSOP9`_J9qZ%*;A)Z9X@>6-{0TE!^6qR$;QUU!otGL%*@2Z#K6EnUteEOPftrr zOG86LQBhG=R#sYCT0%mCpP!$XmzRf!hm(_&m6es5nHd{t9n(rIDUGkE6)|EdPgd(2%2{JeB$l)wrc1GN=;v0vANxw~`QBcvn*0Z;7bYJt+8JOn& z(jFv7L7xhx3Mpty9x82v515neB%v-GS2OvoooLApOT`TCf6M2?Tny&3;5Ik~$7n{n zkR;7nywUIZatSo$no|)3JYd^|P6Z4b?O6z*Pua&U%G{f(-(tt3X*OdD!d3;f6dh4$ z&<~GIngy)899@VV*8P#m`A%kbfbZ9N*CdZHegMTsq$EIHc?>z&$S2aAnH)#}$q7cY zNk~BM@!{^U=K+U5Yr@~P7R<&snh-vth^+?8dd6zN5~8l=i6KB}q#-c>7sqFg4;*O@ zldCF^fin>UFvC&8k#gHesX4A#3z`Az3vz)@110}v9YhGQ{|!^$$C$y=%>sW96;-g) zpn~ex2Qb+R){+o=1P#l!X-=mBQr4Tmk96D|8?b4MYg#uxEevqlBJ7;hr{fDHHce51 z$!Kb)#TIB<63=Km$Ssw=37L2=t_@noRc^7d}}ol)gAD zJGaZK-^7KAcPq;MCp^j}NJ{C3VJW{?*-~GxBwn4)TcS43*Bf~Sy@izlqc1`lloF*l zuxh64RH3BZ^)0>GTkoZzcy(lNo?NuDtpEL_SxK`pSU76TQfce{$Y!jwq@iqKe}rSC?X`B@GmR`R zMZ(sVXmo@wlwd*ghm1}mWYS872?u6tdxH`tkwb9^dch z`}y%6@AWqZdizFN!QfB8WaKlKbIC!z++pwP5aeJ$xtq+NrL9&WcWp^N$1~0R@lC~K zq~$Qrx#;T0MUzoDK9Q?VP~f z1N#o}7GmQCYgBw1XA>8pItuEDs76^;fZH*>egj-ujiWb?SRAZ|j6##f20%17xO@v>fjUaMx&N1n zUse31qOKyL_S)1KR2Hh%-&WDCVn;7y$M$SimlkHRp@8g@ZUOCJcXUfrx zLz2^;JlsV9(#X|%x8{aaBZHnqm8K|M>07Tpb^JsNN`-qVJ+ z>z4-hqZgn^>^}rov`#_yJgjSV{$E@fh ztDTS1A3kTF&3~|Egg@Oh$Q`X5PAzn>?`BUuKIkM(4ULTL(;HYYaz`H=$gY_i(jgM6 z+^MCRX5)<4_q+4Gs|N@Cy~WC0gVAzma^`l++G|;h|I5s>qvvEced2yUeVFxKb3X4L qj#a*jrVcYUp;U37{P|nQq3#yvx~1{!OP#xad~$o`(LI9!ulx(UTuI0P literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/AL.gif b/frontends/dnet-is-application/src/assets/images/flags/AL.gif new file mode 100644 index 0000000000000000000000000000000000000000..96be1ade01df5b9008c2b401a6b5d21ff6d6a23b GIT binary patch literal 1005 zcmZ?wbhEHb6k_0E_|5;z_ zmv;gu=Pq8}8v+8|TwE?dH39_^*1RiFIQCDsit<iE34f`MiCMc&mA2e*xUVab9?3F^wi1epO@DYC#PmLwO4L#N3E^@`})4~^nByt z@!#M7pTGYqQ_~sx`u_p~KKc0k4GjDf5b({<@12j&OE0hAfq_2*0@hksd<+P<;^wx& z%IcDv+q=NP*8u^093Aia`hE)!Z_?L)6CS?8&hA%S+{?(wl}=87Q&Num`?r~zCaJ6c zN=f;Vn)*L0>ql1B+tkz*9v<5R14Go*qu(Gl; zGcyAt4jh4_1o+Z^fnf@R4#)^lo?zfO#lXlRAa)x*q9$C>REX=J|Gog^#Ylaz=!k;Ic|)~3nu_zS^e?$uz4EZX7V7mS z%;!aP;AcO#Gf@FA3evyvavtR6+%G0{TteiKio!)By|ZS<_f3p;SX&(SbbaIOa3MV8 zOK`xGApb|v5g&82J~J?!VP-zZ%6fs7^$aKHSzg|20s=QABreIyK2%hEBCl{&U;mw{ z=_dn&Qx+Bv%}lSFm|Svl`sL>K$Ier(WyR5{o;NO^$aMJe*^FX`=b5PSXvQhLW2wZ`MsB9B)~y#H?r{kbvp z#ma~?3=H)Q4Ck1cLB3^WJha{HRD33|{8ThJ)-9~+)}fHdbhJy%AZA0r zL?;DV)ACJMHePP!k+&>nI9hmFt=GXgYL&~(qSn(hO!FUXuncxPBihGtTJFII2BqkIuwhdcE6>=N{MX+-R}zwAsu9j>|8*t-0bj=U~9z7XiDU2kdwh zwEJn?{-+5CpJyC>6}|Y-sskri?LTqt`8%e@O@jRgggUl~b!}Ieb6S4F9<7Dv)%v&V z%s6B?eV=;yG{ea|4JK~W?_O`a@viy&<0jMhnoZs5xbmXif@4lA&Rb8~;?|&YC_*rs7Tz~xh)wf>@*Q`Hw{P?EL zo3C8Ga`oz!8^;bjzkcc4(}#CmRL(l8JPx(^nIHVVApF7ElZRy(4k)u8Q|CCU!g)ZQ z^SFt`7Av*)aZcaj-L6MCe982`c5v^@o7cWReY8qbbcKfKYd_PC)*9>GEcXXEpGyk6 zR+fE!=k|a9{{8v$=hv@aKY#xG{{8!>PoLhsd-wF|(C%M@ z7tWnKclPYrGiT16I(6#!@#FjV@87d$&+gs3H*DCjeEIUZbLUQ(GNr!09vF|{_#7oj z2m!^PEQ|~cGZ}P1dO&%Cf#Wm-BZrK~1_ei-89JGq4(xo=CfUCfj7(ni%Qw!@^A%!w z(Jf(`e(8jz3r9eM1CwCN&L-DW3^rx2wg?Keo)XaxW!a_Bw4|d&m|M*yVSy7{zk)*v z$C*MG4ptrkp)E5mCUgk#S{Gap$XL?cE21A}qtW=Nyc;o-mH;$B8Z{!K~wo|^hU zE9+ZUmIx=OmV$z%fq}o9TU0K%fWN=LkB^V1r>BR9 zhnt(5larH`m6e5sg^7uYv9YlMFzod8_4M>~b#=A0v@|p{)YaA1)YKFe6=h{*rKP1M zBqW4{gm`&*IXO95Sy`ExnSoIWj?z(r*bq?s$->CMFpEJ4qydyC7&uNdFmlLvY*28N zwVF`Sxmm4CK+dx4hruJ3Ziz;#wur{dYNrJyG_t;EY+B+aVa!zTQ23dxXOg6D#GDNi zUA(3n#j_X%8Z-D#R?zo&5V7!4r zPlv|DbQe~e@;3r2lqd8raGxfi;c=m%v6;1&N%U8O!vcAMsYb373?4GFa>y{WIvnAc z|W~c literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/AQ.gif b/frontends/dnet-is-application/src/assets/images/flags/AQ.gif new file mode 100644 index 0000000000000000000000000000000000000000..46efd18ba52920e06fd8682c5b803957ebfd2158 GIT binary patch literal 990 zcmYLIUuauZ9R8BFNsV`1JU51z1ic+$Qwd$xKa$ljV$EhPX^C6F31Qr>Nz7bqBfIYI zp}MAa(ZvTh7`6{G%9zr*u4F@n>Vvngxm1~K4;S$vj#L&&q=FBEl~#`Dv;!}k%kQ4^ zo$vd8-#PcCmk$N^4?7^>Z$PjljRi-fHzAm_$zxZ2ZY5fr@18USTQ*cQ1he8N@z7+& z?~WP^KL76VI}2XHlJ)PJ3Kc7YMTrzDkpq`}?(t~xi|&HqXj6R7cz2=VbI0%8@;b~} z-;+wbIPb7!BSphuRzjUq#)8*jVV@O;MTz!Z3Ka~$Gaf21i8!DJ7qdMuaf}F9N+f5(E*H#!wr9_%`q+a;cJYw6?B@>M2mEM2Bm1 zRHR7+q_O2AAgK{3xS?SGiE3k1R9^>90g0-3QbZOw0i<{yNMI#uRmb2Q0fyns_CwNf zglH)Q7336%3^@uWjWV{P!n-#B5okc;=Kg;uey6xk(O@~ypo``}MX;c;O5vfX^J&yw z+k3fmasuTw5S~A(fCploTY7{0(;tete$I)q*cf2**AVT3-T+}+ouz5i4nrK&08?h7 ztm|Z(=LMLyyfM6y&~8ubWRUa6>98y=n13B&xAbS2B;25G2JbBuQT z_DrmA`CO~5uV@^7WfvZY-EO~F zs+D)ze8)ZsYJGWg>(T7J@4svLu+1}R`=t~Pzt`e7KfOb~a_v0qGac`IZcH^@w|m2x zufM#0eqL^OY4Ys+YfbGxe70lht3UFB^?rKBGkv?*bo$l$kEJUIAGLUc$tu?OTEER( mpR$ZgOO-`obKvs5QHkCCiro`S<_#-+#aU{C)rN)4LBJl@^^5O|4g6d`5N2IkjaM)RvslSaL=( ztzK*CS?y)#bXHu@Uwch==^4WfH}sdCHCcDfeB%xCHJ8*Yr`YX$=(y*J-TEuG>n=I( zdg#9IiSx!Q7Lzs@H_tWiULJ7#ox{96A!k0>Pv0DR@}0+u<56cmh3tRmzHooQmMi|7 zF8QrJlX&%)|JpPDYfhzH{}XxOq1S@l=H=a?+pdIcx)^)(dF+v=Y1e*b-TV`~|6cCx z|GBsSWnTFfw)%L^wV!FHUPWy>pRn(C(VhQAcm5S#|Cx98b?TlQ6}NtsUHg`Q`bFg2 zO?9`v$1UDjfBQ$_p*!hokF-Dh-+b$9{`T|TkN-DbdeeO6UCr_PeUJb3KKwoD@!#&7 zpL%b8?7sAJ=F`6)zkGf2{DsfPvpyTn1a3Tc^Uj@%SFW5nfBx?M`@eqwzH;^InX_ka z+`hGA_xi&}_pDhr`S#sI$4_kEvNeDCQqhKbxur{V=g$i|bLQ0Z=g-cZIo;aKzF=P1 z&mdR!0e zqK%?H91ok0dT{ZH>D5>WE)Jmb zZZbdTZQ&4l#~~x&FlniG8<(oomW)fv?vu1)g>G19REjSs-@z*OP9=|bfr_PQOee7H$#{)W?i_3k{$u;G5eBE*TyzY<5EiK z>**9irFz&ZL3ExH%T2}z`ygRv+cioJW5Y0N4J9iNr76cI*+Z-8ne(pmgZ~fDhyU|? zec(BM!r6SJ%LG-h4d8bfrSE9Y=97Nlv#T*7XhcCDTFd&~T;ixh-a;8K#kd9jC>?P| zaFNeAtx^%=ttK`|WtMofl0@r>ar3;5^1GsxSCC6sT1zGuSYfJOv|F>?bk^AvwTGmc zh|e8M+N^R3MVxGIHG=vmyp)vhAh{%qmpJZZm2_E%_BBbHS*a+|o&+w688=0Hd9;?1 zzGTrTgKj0Gc0U^P_z?iB6UOdTN? zD-~HZz;LIG_;NztlB5NWv-|Lhzzx)6wXcU0Y>r$96|>Q-+H{K-ooaoIOIEZZN}EVf z3%aAUSBQPmlte*k;!;HEx~mM3iVqrV2gP)NuiVC=`K#c+$+8Q>@_qm$2Zvqx2Aa+Ib05w2vXp#D~eChwp%*z3? zlPtK@{r5l}f^-20mAd!B9NhH)*_r~-y)&_xP80WaUIpE5HWi;`QrG6vM60IX*15hj zrx2}bobk4Ne5WQ&Y!E62`^>&Ya)&5{AskR;0sh*36{XXxAX0H_UG}Ke8-Zw4W#HS; z;U{3IaK^b?Jq}Wu{D**X^(L-mZqvN>|E<@cV9^fkPgFd-4euHorp|tKWwO^mB)&FW znX&9&&NURj>3-c19&1ds&pJLe9Jrnzx%nEk7_EBFBThdvJwbFhFg#8J2@qz7FIc#&oos7ve2G1puduGyw$7rJV> zxz);*ZrrrBvYX~?OBCXq19;?c7PI*clHaHxprD!dA9UY)@!Y*P@3U8428*xM#eirK z0LM8zJS37+EQarnscG%I{-DoqG?@ay;P%eWoWn6SJ4@N^R*IUi*$9#xw^~i(g+!q|qbYddPg3o^)AFoYFK$DV;DJghb+6M?)&CXuQ&bDM^d`e2{;_-&k(>Fw-b&=?6X6B?& zsL#qmb8<{V;jCCZBNp59^T~V>k(cL}$$T=|kWjb_!vPp}NTmxhnX9CjDlGg3!+MD% zq*Ml#N{3t?QmKL})wV+6Q>nfb7Je)!@K#n%mf!GHRq5pLW_7hstu`wZ!TS2unwn*` zdg^xd9)frq8UhFsYHV~P$Zk`UTcdGlG`lS=c7i~4I^)R5BuW0HD3if}>-E^!7&1l9y?3vl=B8F+ zLlukNuP&eH(JoN;p2tDr76xJ~DesdsN1PknK`Q#CZNHKwK$4{c-gb&z|wMYwhMxQ+omBw_*dj&U}^UCJmic}pS zSJ?3M&DDn30&M H89?#}c4}M; literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/AU.gif b/frontends/dnet-is-application/src/assets/images/flags/AU.gif new file mode 100644 index 0000000000000000000000000000000000000000..6b3c09bdcad99e8d940aba02b95f9becaa26e47f GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5)!nP!|b<syangb%MNnnU2n41B2!I28#?0mm3-`Q&p{1Q?EBQU9F|nZeh9B$Y_qX zcB_@udIN)Adxxzirc;cJ`VEbG?Cm$3o6j;co95)S#m082i_11U`-RrlGd(?bdwA@0 zbK7ETJIB#+k&n+FU*Em{{`>s{_IY`22n;&l+}snVPMziv=u%Sa zwy~QPpLp2VW%cXQq9cBOA5xNkq^Ga*_nYGF^`g3ZcXsyk-X37gf@64;z!?IHKUo+V z80ItRfK-6;1Ovxu21X7Uj|~b3*(A+kb}=k;Un=U*w&#Vw^Rx1eoMxp`4hJSTv8vT+ zbQ(3e$vH6bXFQs6GKi6d%}Jy%Db+_-RD~rd!GJNCl~YVbGI5e?udKah1xHDPQ!@i! zu$)UqA?uMvwiY4_1z&Vb;t}+yaj{}Ne0s5yIn!AM>sYvH5v-e`id5T|n60`72MZ-S_bWGC?LGRscGanAXFjxUzB1?XkEzF=FTL@5 z>9wD0Zv9$$?aPK+-_sTzPg`_6ZQ-%>g~!tu9nV~HDs#!noaJY;m!8U6ax!c2vBK3C z^H!WLTz#Q@mOT$!_daaf_ptZqi~eIT zr=EE~{VdSNi*qi0?c0BU?&U9wuK()ae|PbXpHq%Jnt0&u;_E*eR~=b#`_JstFIV0D zxAM-P<+pw=yYXZG`L|21ep!6w)AAeNr*1tp@%XbXkN-Pl)+bF^-n8TLSZhP&LH4D#P+xXzs+FOrHS8ndyd%Sh)zM`26W}Us> zyW_x$n~x@JuUK|+Qv1fN?yY%Un{%h`t5|fZt$t2+*NT!&H>OS5TswDf+x{m@*PWks z*+@!BIP! z%jCi%Mh;$1Rlgkv3L8%dHS+M3C@oOv<`q@&*s@}yvWKt+lQ74JFE1Iy#MHdjOj!8X zT}ac5C2pn>1EaWvvde;wiHna5s{8kFxCEshoFJ*`G^e7lxm`dlu@X+IVG55;iCl^okoL?kizbPVZp-Z=frc=oZ0ma6OH(L@PKkJjTD|vP1rm(x;Jae{WX&w#+YXA_mkfi_s literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/AX.gif b/frontends/dnet-is-application/src/assets/images/flags/AX.gif new file mode 100644 index 0000000000000000000000000000000000000000..5e6503898e3fa43015b78eb320268808388ed762 GIT binary patch literal 570 zcmZ?wbhEHb6k_0Ec*ek>oV}4ZW>so$GK0^$kGp06%#c<{oAAunSSW6-P~?_dst!l@ znF+$M!0h1WoRq5WR6w^1yb@JLa0nJt-#-D*igmBAYtt z!#1AlB8Gn^a2?#K&JeVm!G9HN*uoo!Bp8C1J+W7Q7bztaznUR$F;3 zYpSgx^Xkn`yxa~u%tdvLtgRGw9CY9obU)@UqimvKaQvJgyW1swC2>g$<4d9=2<`8gba$y=_sG5p2E=E&eVX@&PpvqB-469P)E Ly=;seEDY8F*n5&` literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/AZ.gif b/frontends/dnet-is-application/src/assets/images/flags/AZ.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8827a82fc8b08793f8ef8aa0e84383ea3c4c0f6 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5m36nO8EutTs&e+bVC_6VG~r%y z-m|#$>#=Fq(hHwt7hf%Jcp+o3he7=egG4>E);U(43#>Y4ICanRnp_hwzae3BNlS0s(*>W92Djr?R0@z5#lmyz#ox6D6|3D2#4=DN&N)0U9EKF)moTfUt&2)3>b#j~F7O)_|f1bbJY`=gx0cLfk zeyx_a1&Rq>_8K7!+F>j~#U=%l11%DSU6R#<$_>1;b>o}tb0_%fhqC8Q^eUbb`04(Q z6L~@B*DpP@e%VPw)&mA?hi%1<*@$0ul|AdBblzM2T!_KFB)eTfCda}pF2vd#iL|_w z;`}Jf^H*iiqa3dzagGnNy`Sd$KPd|MR2lZ9IPgtr$j6$fPYrROJG1{xC_Gvi@vFb^ zT20cosa22H%sIVj^=)5`v!Rw3V(h<^hMY?Cc~=$xwI%&?XYQ}5Rp<424_M2c^3tE} zpz|c%`$mfQrBt8yB@s`GBM-)VKQ4Ff;2>iovk;er#DoOKW_Df{uS;7rFDv@YvvTZm$(*#*b-EVkn$OGm zXPYD+n&9Zn;j_T9^2Hv(8yyp6Ow+kEt5P~9Gq`uYQz%lt&_B;K?G%HM@`-cv9BV!t zX}s*VV5&~|3ZIuktX(4d@jG%>E@JIIpk$G8U`C;HyMT)KEEPi|77zYL>#QRa5|xkl WEBnmRsB}{4;Fn`dmgeDLum%90mm@9! literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/BA.gif b/frontends/dnet-is-application/src/assets/images/flags/BA.gif new file mode 100644 index 0000000000000000000000000000000000000000..3fc70eadb82e86ba289c35c5d40f1ece2adad3cd GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5^xN1zOJ})J%e63gI*bfj2EMRIkQ0}vq1%`Q8lYkCA&!tr)f2>RU@xO zEstR?mwKpxZHs_SqmWI5s6&T@Q;V!;pNK)6qVFVmk4|}y4tdvRb^ks^hf-zdGX1D| ziuU>(-vAs_IT#5^2lB8m^3Y*e0xCIR>y=%0cD$g3)cjdZ*fbT8Bns;DYhf7VMj{a z-i*%uX>Gf*x(~#Z&a0euq<;3v>Zu1C=bY$Ub!+p4vTma>3?JlNQZN>~HhGw9RBnllH;2fg2YDomt9w zaTWW*Ht{EW6|ZcP-!)tA-3k4>d(3}bb$W2n?%yr1cV|8S-3j=4J>c8*@C7|Kizc`% zpXPOXd)%dc=?B)uo!*&#abNbCc?@UfGn`$(cxEB%*+rb!R`T9hEpU6i$h}PxmsUzV z+$#I}fcB>ore9B6J=|;Y zs^JhZdfMH`;-NHQrE&TtRlC-v2Lc*TIR!-6LjocLp7F`~)N*`Wp(wyLQB+n-g2QlG z<4oUK-}anzbWWHosify|!NBR@G@W##r<^IwZ3kpkjC>9-JaS>wiIQ88$n3$!-Kc5i cvEjhNmTo!bRUL^Np80dLuq8|La4=W{00s9k!2kdN literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/BB.gif b/frontends/dnet-is-application/src/assets/images/flags/BB.gif new file mode 100644 index 0000000000000000000000000000000000000000..c37a61fa1e484fc2263b653c727fb41593349380 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5s;jPT=El=jU}76Y+6!$Z>MWc5%vy2y2ax?T(IY zEGe2NBT>0EJej|ef>&B z#Sk^MSPhK?Q`1@lg90tBBwgJ!J-rMAgKPtXEG?~A6O%#i+Auw=aKtP|HTTMVfZ+Q5mxVRaSk^Lzt^HNjiW@Rl>QjXNtNwKmn z{P)?bx{#s1ly&bquG{BCW=&L!373fQXQ(e`EXrW-YvO7y=e>W{;_f-SGn*JrZeVCE zW<0Q(`S2Q+lj~XcEoZIGXO0VDKE8qT@LJAwvpM%J<36@tWYrA8^E)ISpHa+B5;(t8 zzNK8`{0_ygYB6^Q-nUovZ=W#Tuu$va8H*neoj%`nONx{!%uxLI-2dTuw|_4JzCR53 z{2<`YDbLfpT)G?dpI;4pcRS?O^{A;`R*tr^@sZjUx!S;(1;_9xfinaYf3h$#FwAGr z0jU7x2?mbS42&Ey9vc)K`D8;nG8beDDp(hObFffsJ|WyF>%;SL(!om#wnZ=gNIp>F zn4-nx{^Y@>)<$*n;%i$9OCGcfY5TG4JK*$?i^;k2#0JGB8B9W2fqfiPKDeIdW30I{ zMexgu-X`_nNgo6v61xRO*j_!bJn}MVF>BB?mjj9$yoJS-xb7HEUM4K#B{75Jqo7;D zG)WaZffvPWXO|hy)Dw9b$lT_jpz4rO@IXCak;f#1$P0v5K^2&}U%KWnhqDU^ZZ8)@NolVr4aC zm{;)Q{9x zv{O`bQ`7L!FpV?S^3u`^(9`wPwMeiq2r|&}(6WfPFb*>|2{*Azx3h?~aLRTvi!d_^ zG_s1da?5jb%5d^3@p4LYa?5t}%=h#y@pa2`vyQa($no$m^Y_g43@8uqDfICx_6sZz z3@8n7OLGe-2?(zWk86yJYlw@ih)iisNo`Hd=*YEvkXV}@VaB*D#B3|Beyu6nM1kMWy-4+qKE+TSM zLgKcp?0rSW7iwxxwY6XB>whve{cL6R+0O2llhZ#hum8Tj!1w~k+bBVW5K#Qd!pOid zkwFJ!7AQ|JaGYXb|DFA0nMQza`e zEIit$z@#|GqN(MSq(k|eFOkWqM|l-&SgHgTshkjZta$N3vBl#IkAmF-jxz^09Feds z{l;Ro#lyE>-Xw%$N|H(!gHiFPKZZ+A1kP5lh?ybK;nL2=p77>}=9CqJD#m6BCW;CL z9KxKO84 z#Y6?aQDq z??Vro$epm)y6kIlH`?uBki)a|;EVCTFY}`AW`;k_kDaEgGS66RfvL`NOZ}DBhPVA3 z*Vr1bvp3!7Xtu@4VyBz+b{DICo_4$4Z4Y=kJc{x=>hJPAKIn9a$Axg8E71WjQX+1~ z1;0p(dYuvTASL2%Quy=qn5XG6Ptu~#TIgMKwchS%^&r@DpPSw3K#%9~p*LfKU!+7o zPL4`TP0h;6N=;2oNlA%|i;Ikm3=a5V<>lq#;^O4wWMyS#W@ZLPA~-Tf3DQD9@h1x-1H%jk9gsFqo?zfO!NABN z?Ieozr*Cv6G48}uEZA$*{=2Ql|E2z4)vdMNdC^NSS zxGi{+>3qD`!M&4BhUrto;U<3dK9`5a?tM~?OiYqNUy_fsvZ+NV%zUJNPRfXhQBcZh z0edsAYS;mfpr`!O#>p&vPFFI5nD~`~_H=A~;w5jAw2#9^Mdi{`8I=Hs83v0xr`o0- z$Prw@F-etyOXkG{hlOmyT2+S%PAXk+P-U22v*U(ha~rQ}(1(hPO-C1GH#0IaSOWm| C86Z{w literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/BF.gif b/frontends/dnet-is-application/src/assets/images/flags/BF.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b4b1d480471a3f63ebe0229a6b592bbc5773e69 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5xc$I2SZ%AUZ^8PCa^%FCO~ zE07@|lqw{WEh3R6AzLh~Sgt5vATJ#utyZa~UZ$>;q^uaPsNbxwmae9esbSh-s-3T+ zm93>)psQD;XHa5bH`&gr%gVUI*rM6Oq{_r;vXfPlmD@Bor!FV2nO?qgeBJuoJSTg4 zO!V-d|Pq^wNgN#`=C(KjkLG^;VSZ?!XO(bmpZ;0s|8 zjARyz;vi&Ja|rBmi=N>hJuM((UR?g-RIMrr$2R@S<-GF_$X=N*aI~KF zg1zE4F@`hJ>?e5{cJQ$7mzTI_WqQHR;;@y;D_^%O9!@*$t>1g(Uu*MDnj`q|2AotD;J3yaTo zc3+*Gb{H8wu($i+=Jv?Z@voQHVQcGOzP_(LJzscu{POqz=;QMzAmC46;P=45Zvg?9 z-P}F|1bhk){~8zfG&1r>O3LTd)ZbZIzz79L>?lDv1QdU=FfuUAVbB371?33_j?)Z` z95Nmo6dVncKWN-a@w_m{B=N$Yjh~+js5BS_GG%ta%jrR ziSx`-Ppp}^IsJl?XAjG#g(?ds$y=nY@ade)96P zOA%b5;wdQaSjUk0sD*Q)vPTb(pwfq9+}u1I0tYrOY3C3#iCJ*rqT_;I89p8!j}HqD zb%>fIeNg!5*nB`pK!C^Mf&){#h*8=K1I8p~wnkwQ9*qqOPHn;lSzB%h9y-j*#g;71 I!@*z;0DMaN@c;k- literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/BG.gif b/frontends/dnet-is-application/src/assets/images/flags/BG.gif new file mode 100644 index 0000000000000000000000000000000000000000..a620896acd88c803d8f051db0b5d53da9ee896d7 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5(Ic!sHGi$U;2 z3;!Oogk?_Avm9b(I3>(;3v98@Ugw{)CLnutK;|;Pg4N;Wo8oG>q&Drya%@qs&(ZX2 zH%VFMma^D2d8SA4`p}9^(P`8CuiUuw?bnyj-#Xw_GPdWce~HQ zUN1s@K1T(NIAuMo7TH?N<>=R|h%gXZ0 zWTiJKDZVw<->9a%M@!?Ax#?aVt>XrICyfmrT3K8&Gx_P}^vBcfsf*J~Pq%+T{{Mmk zz6JRG2oCu7@86$4e}4V?_4DV?@87?F`}XbAr%&(Ry?g%r`I9G49zJ|{NUM+xK^3p5YPMNRRs=9O zGZiaXOkikdWa5_KS#WWI1Fy6>%cdEMDku8otV=#bJbdiRBk7R9A+qoh3p=-voXd&^ z$7XIJHHR$%GnkIDvkJ>NEGSTHZWmN_D!HLB;p8MG|2C6Crz0FfszHlX8jD;ONa%*G z@L5^J$~|2_@j%7PO{(1oY;rD4u-tsiSJtk9>FdSfc0ZZM{7X{|7cc9bV_VPiQ?mK^ OIT;JKWN97_25SI1RyNB3 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/BH.gif b/frontends/dnet-is-application/src/assets/images/flags/BH.gif new file mode 100644 index 0000000000000000000000000000000000000000..6da72149f2bcdac94b76bf2abb0edbafe287771a GIT binary patch literal 998 zcmZ?wbhEHb6k_0E_|5P((1_JBb^OzXt|> z4G8!W5b!N9@UpM(8GrxdzP_J|i%;d{J*ufWo|}8TwDe+a?eUtL7jx#E?drNQdGhar z2fyy!du->-RD=YP98e+_WAR}`}Y0*_3P`GFTa4~*RSv1 zy?gQE#l3s?Zrr$W>C&aMXV0EEabn%NbrU8`sI9H7si^@*4LFKM30j4K;!hSv28J#M z9gqc}Ji)+mn1PW)#$$tmqf4j4i^|}%1Dw2q1}y;-n?1!EJNRsOFh4)j%_peU;9#iC zIZdC5Tf!@$y;nj|M6E(Y@Gys{ei(~XL4iX5Y-MSc0*QxA9aHq8=WwWOU_Us=EJZJc zW22M1ux`vE0l^c;`aOQ2xZ|Ayulv8Y?GN#qYyaROG4YL>4U%z_X|xH z*~eyRRF#~btYnwP!Q;}=C}Zp$5pi_YR(3u~CU#M+5O-b?X^(X^GmV}c=abUqS!E_6 Hz+epkX$>Nu literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/BI.gif b/frontends/dnet-is-application/src/assets/images/flags/BI.gif new file mode 100644 index 0000000000000000000000000000000000000000..b91c9e318150baffa5c916b0b0f61b555a6c0b8b GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5K zS599zcks-S4?jPx+_&QNjZ@D)KfU|rmO+JrSGUFbgR5*B)KiuOTzGbJ*1{Rq`C5M6 zR%t5&GFAqrFAq#x98j|*qi}B0gZH;>iq)Ko46;`T<}M4Xn3p+eM|01jmYrAEWtODM zxO4jV8oN~M`n8!S&-W}?9$CC3Zt{`3DTf>C7Ul1}v0C1j%OXS3twzVY$snM^B&f?Q zda7OgOsC*h>*Tp^$@4rim-=Kc_luw8R=g&>Y<*1S#<=>eDfOFETXtsk>@7(s4_$F! zu5XKB+)Rgt#d+s1op}4^>CwXn&Ky7T_~w<>g%Mk;Q+HIR++H^2@QV3|md?FVUv&1^ z(L+)G_s*TUz|ZCKxruV24@@#4k#^XJc=J$vTNnd8Tg@7}$;zP=t9 zt>EY#CGdrS;!hSv28MYIIv_=$Ji)+mnt_o+#$$uRLD9KVUlUV~@hLeK9gsN0tTBnB zQD;Vh)PrY!GtIJ(T<~;un8d5hl%L@sxbV^fy{K&m1XDbjc=-)j9w{&#auN37SQBGe z;OW}Q=TybeZ zFXwYmXsMSNyF^k>!6fGg?P8`OwO;*8sdx8DhO_4{>)ZTx# zx^v&|=U=aPAANrO2|RI};rMZe(wKV;+dM-5^3q@+S+Rr71t{(Z&Op-p`r1?)O5F&);=Ab z!+LrLbag*kSsgbpIB8^f(aiLmiOFeWznq+|T3P*cbGvPC_t44drg=3J7@T6AT=u z7#KNZJT@pCWMVVpXjrJ^E~4r>$!2Dfs<(I}n_fr7#v~R#HJ1q%6N6Z}r|UDR*CbqA zo}=KkJpTDt&gOQF()EI|m0}&&J8>flGWQiHS0)Txj9p;^MGiC{Dky z*n6s!qR($L`8v&eIXf~3-ybbh(!4ZLhD G4AubKFAxj> literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/BL.gif b/frontends/dnet-is-application/src/assets/images/flags/BL.gif new file mode 100644 index 0000000000000000000000000000000000000000..75a234551e5625c7f4173b4dcabdc05a9a20b5b4 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5wtfF#6RrRo<;u1~G;|2ydw6%{I7@XD8T4!N#*TUkC zkbS4 z=d3Is<7s8(=a!Zq$B&;reE9gGL&vUPzkUAv<#XpQ-Mjbj*s+uE-+#D$`_8Yw|IS^$ zeB$icW2aBQeE06>-@jjf{`~y?`~Am{uid)!^x3mZm(E|jc<%J+6DLm|d-LYi!-w~8 z+_-l7^vQeo?%uq4Re$wY2u? z=p5G5JD{rz^xH`z!(#>p=S)ma8ykPNv-|4g^xo0&s+HAuH@DmNb{A}H9y&Sw^z!=U z>-*Hr?UkqJFMt2RXyI000092jxn2plEI4*|uWEQ|~cQy6qWMu74J1IK9wMh+Q|4GNCT zY)TCsh7V3I_O$=yGI5jYS(!#Qxsn7%=HnBcC)fO#nRL`=jt!G!hQq=~t-R`!Rlfe1 zytGH!rhp|(Vq;TFr;L}HqZZQ(pV`(WS2%bcE;_=-Z!*Ot%SC0v9Lv%hJ%TqL9bxB? z$WSTV!rY-?TX~N|K-r*`gOgk1j04lr6BC?j9xULz?5fbo%`4zD;bP0gK83b#D-=Jo zc02I#35jedXg;~f#fI&sj|sVUv(hiXqwO(R(Nvd!IsjN4U4xPSa&+Xsn|(ACc?IGO5@7*(q*~nHAbq*6DMt3bMu7n z1-ph986_LNcRgA#WwGz|Ye(76dWMztI2+qVcJ{NJoL9KG zuJQ6-(3HK)_RP?|U8|9|Hn@M@K!34F8*w@;fi@Q+D?5h_L7Rxtk)wUN$!ZV+tH& zqXgALK=CIFBLhP}gAT|*+@;UJGpkO@PhBMYah(*%!`Ma#~~HwygG zNn&W3$inQ>WApIRF+X`nCQXx~DH^h;S}oJmv`5R^9v=-|mr zdg?t#Rxe@Ci-m3p3ynhhI3k0Vo}Ojhn6zcb#I_y>^YBS7b0R+SE7;iZ&EQlH;1*VN Yn=@rRt2e%W`S$wt8+iqVv**qoIKlepwf_4bPTD%WUw-?4_z`g6F!Rw9tjAAET)8Iu z@Ui`wbGA>PyTvCcpFZoKndNlo5W|7}4Ey&p96ZRpYZvq3!>k7nvK~CZdGaLhnKJ?> zPY4}5E^+mW?2Q|WCr`>hdZd5nj{dV}rh9f9R94Erd24t5y2Z6?7H3YIPMfCj{=L)3 zk8b__T34?+?AvGk`LpliC!Sxv_<#N!@Zm$?yLSO^-UPgU9e(|KU`mR5b(PWAuUWTl zrOcV*@%nYy{rkn=zD@u7WqxL6YE4ary}g~IqeFCb)ZU#8Zm!Z_zns2!QsCegfuCR2 zxx1Roo8Vah>!BwxqaiTZ1&r86<==+xHrZ0%?!6k_wTG;u`E0^WX`Oa zhil`OOzqp_ENUmfc*VEI21WKCu(ay^zxc)VSYO%(o#xlSzzGgkl?qoXP@ZpdAwrzqdRxr zym&Eb!i2{UAO8IL^VO?YFJHbqfByWbQ>Qj<+O%lVqVDeQtgNiKxHw~DV?8}RU0q#m zZEXz=4MjyoVElsPd6d8s0*XIb7#SEAGU$NhKzV|J<1_;!hm6Mt1xHoWl0OkeEbVNZ zDt>D!44aP&G;+!Ho)miO*{+*tu%bXPxqX5XlVRknBM%&#Idbncd^mWJO+d+!MQX>C zV}Xob-5h@eFTCIu*YKOb;WOdnsaZ}nzizBNoYAku!l%$EsNotc%F*WnyVvRZwHrrGwaeMyow?K} ze|=!i@_@JnRtZIJiMcKs-BI_2QMs_g{fOex;l^ z&UW@J=cP*$SFS3YI%RP3l;OjN7MCuWT)krU{JF!QKWCd0m02|((1PJ-Y6_` zR_GB?b?Z<_eB{z2rXRB*Vj)xO0d6iH9*qeL7+HDc>~anSBr>ry^6+seG$c5-@W|Q} Sa3ne&VrFMcmgeDLum%7%z9(z| literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/BQ.gif b/frontends/dnet-is-application/src/assets/images/flags/BQ.gif new file mode 100644 index 0000000000000000000000000000000000000000..14694620511a9ed439131377a4f0424bcf28c182 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5Z{L4EefH|c&ATT~p4q$a z;E$hwUcP$!{Kf05*KS_Ea$V7727~b`CiB&-7VB8eS99B~<#XOD;Ji)3eY0ZFVa34h zG7b}z12(7zZqN+fs^T@htH%9-KIShJm4;f#Do8^95GcGeE?_ zah8+w8ZYk+0f8%mg6Bj;E=fpC5fpqVD|=5~{)wXE6?yr&l9KQA^>66vzBV%YWNP}* z!eW!Y-Y+Mo-9|<~TwMORxjlDuJZ5eE-{1dVK)}y{fd9e4@BIDW`1$<~5C0Y({wpr- zWnA3%)YSi3S${J#&#qf{X5G4rn>XLyyZ8L&%`Z-$zI*7<^2w9G-n{wm@#DXbAAh=e z^W)8%SN8A!|Ki1u@8AFZ`}gP1pI^Uz{rvg!+qZ9@K7D%k?%k_bubw`A`sB%zhYug# zxN+m!wQH9yUAl1L!nt$j&YnGc=FFK>r%nN*4;+o71UVs~_>+Z^fngeh4oEX7PcU$t zW?Z_uV(K1KY*sE}?U6KLVy&rE zPCqNA={v_|;~`fcDYGn=SBxSr{O4JhJiD^7Ih}vLU0olCiok;aWsfNuu0=;U1Q$BC zi#ZBute7xSX|jfA)fJ7vg$!*Xyem{DG%|Cr@^ElYVql!8$S!3Qu)#q=KuXP~H;t=TM!qO*iA^jVd~C_m IJRA(x0AdGNH2?qr literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/BR.gif b/frontends/dnet-is-application/src/assets/images/flags/BR.gif new file mode 100644 index 0000000000000000000000000000000000000000..361fe5e37a352c5f31693ae73da6ed5e0ad3dabb GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5qaiy zLdC$A$o6e4mN|++4NCqMu4yfCl@s}$a|N7ogxrgTJ<7C0D|JFEjUy@?^QHvWEtUdM|Q2~nocn6g0`LcX@|%opH^y(&9C7@e|!#J7kT^SW8y=tUfTa zY=uYRB8$r9PMZ$ToqIGTcdB7n7eh{~ZS@r2$@}bT=UPwNrC%_Oxp$RGX}9UN%K=OF z+Ld?dt~}~Ed8yZ-o2h3WX6!v%)i}{;I*@yzV!<}vc^eJ39gSGMUtrl5#~Dkdwj5T! z_So;*)4)Y*WH#+KJaX3R&`F6qk39AtbvksE;rJ=mN6)lBeRcZwGwa+r-YZuX9zL|V zdd2MdGlzfwydFGsdiB!n-8;{JfBpad4fyue@9jI^Z{Gqwehm2bE&Rv#IAHvO<9U?8 z5(0`pSr{1@7Bc97J%LaS@AZxYRIbo7|_#GXu%Lf>k*b^;IUVOB;%|SsoV8V}2>=&kKR%xrOvNjjO;`U0!PX;zC9ybc!yoG(kbpOf{wtr+}3 z(t576-4Z4D_4@IzOjF-#`R_IeKW349*DUU$Q^7a4(jQjw$KCRu`B(oAsQndC^)ws{l8P&9!of{k#t_G=)GAlVxME?nc%8hiEWQ!>aL`AJkShWukOFZHf3LA z%?bD91%BD9qAGS~bY0G9KP9iEX`8&pJ!hwV^t8PGEAk2o+PbXER&YIk>2T$m%g4_F ze*RL=UIdAWF*G-^o;<~It4|=Wc)g`2YD6@a41L*KYye zz6Cse=JV-u$j49N1_t_$jt)HB%uI}o2KxGGsi|36St%(gadB~xk&)ry;Q;{w9v&WU zZf+J97Ft?b>gwu>ii#2v5<)^kf`Wp)yu4goT%4SotgNiSI0eV;C_x|u6o0ZXGBC_# z&;h9fuiHL-9>ILv5h zY-VqqrDp2HaD;QRqDz;AWs}NDAyp=ASE&yif)aWur`A+netLR=K^zNLz!Q&2s(wkw zW+XDR`^(!`J>&2>vSPwCUk09qftQc*$vafPI3l=%Lujc_`?firkDr~BcWnH0Wuo#2 z!G+$eUM3rho}Qed6SBmmvB`D8Wp*VWla2sI=XPdky@&+~4hf>{iXKZ61Ro#kle5aX QFoW@N>%r@6%uEc{0J&}=RsaA1 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/BT.gif b/frontends/dnet-is-application/src/assets/images/flags/BT.gif new file mode 100644 index 0000000000000000000000000000000000000000..0e6442013ce873654bc14e0dfbdc4e398ad484d1 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5$i`bJbm%X)w35btysU|=B-}NgR&vj}N@6mqVj%2QLGbJWu3!a}NKdV&o z?h5tG3)RofRbNu4cyqb_n;oX>I<)Ssv$(s~V#h?IN1GiF&$d21$NI%ikKNPk-W>>d zyFcK<3b#*3!#^Gk|9Ud+>#4Y>dm?|HOZjm&<;&^RU*|JEpGy6GA?x?WtZj4R_N=Vj zzN+)g1oo4YMUPAnJ3C$GV88Ua8S;lG$)B66vwyPT<4q3NRye%a;c;fM^N~eCJ7@S^ zKDBMz`UShUuRAqO`}w(9J62EmwBF}nEbrX5s>7@2ub4aIdsD!PJ==HW1nx}re0b*Q zwPOcwo;rHmQs9P%;sHnbC6>}_92D0(DQ|OA+u@&$&SvEoKY(W!>)i){rjXEZ&SQu}y%)BWkq z_hz&{U)XnPX6KCs6Q8V}bz)}sWfR`RK6=Of3@(M5o(VF(9%=Qb(EmlI=bxg0_l+r^ zS~Fg^Wx{`acW!=l zCnaGYjfOC6@WM>B*9MKHGsDrpJ%+)`;^VDhMa zvL#TtfNheB4PVBoBDV>R4m~1@QO#}-x|Dg=1WXipd0xi7ZpQ=5DQ!Im1o;+aEEHky qmhI`Z%nSpzWN97_25SJRv}h*) literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/BV.gif b/frontends/dnet-is-application/src/assets/images/flags/BV.gif new file mode 100644 index 0000000000000000000000000000000000000000..47faddbdb4cf2332303e4822b4f51028770e7e88 GIT binary patch literal 934 zcmYLIUr19?9R6n4TxGG&sj;-=RuC0ttF)HAWQo<7GSVj*b#1;{|aUTjUWXw37qe184@Z)#B^ZmZx_dDmvu{zKG zmNh8GFJQhv3iLd--XyK)mGupG%m<0ic(S~C#EcJ?pL!gKzAQhLXd2*|M4%^WM*FS! z9cy{9`Tm1BmI%hD&D(>OClXE3q&d((zf>~y={4Sw&g(BLPmEac!OG@@#jlJd0?{PY zUT8pJ2BUv~UZ>5!MViTjsNhKp2vXz$)vbiWv#V*t9FOsZAGYz1l9&109%4eSAAV5d)!_0VpTbwjO|ZB;s|2&x63Y>)`|$8M6mx% z#^|EzY2X47$j}aoPT&mCCj3AE!@i=vZa7?>srq8A5m-3`Kr28>6l zN^st|RJYLj1WcX&A?W2N6GF3J)Y|x45>S+jP5g->dki+a^h1kXbu6LVefH?#*s>Ly zS6xvuqqWxxclc&*W;a19bI6W^*_d=oZk)8_vGM4NBD?4LXsYJzy?tvX$LdsHY-wqQ z^gN@4X73-}DElY-rV5t1AIL Kc(~Gz1AhT)bSuFC literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/BW.gif b/frontends/dnet-is-application/src/assets/images/flags/BW.gif new file mode 100644 index 0000000000000000000000000000000000000000..849349a95e2b470d1db1663f899a2733119f23fb GIT binary patch literal 999 zcmZ?wbhEHb6k_0E_|5rI1)>zT}F<{B!1W&sfYoZ9VU_ z!?G(b>+dV#jCOw|M#flI8o0m+h@sbEIVXzUp;HD_0$; zS$nu;+qw3g=O-VzJ?;42uI;CD`sPjCb8*q77xhcGExY<^@}6@u4_#e<_tVC^pH^Oe zzU1tKO?N+Sxcz?F`A5@sonC$U+0F-_^yZw=pL^C|?irIs7cCZ^Q_t;oSaaKU@%g}A zFT(b{_FsR)efrL@Eq9Vne)V5?#ADK?u+`_2cik_#@~`yj|GeYx3QvD3zxucQ^6!$< zA1jZ)Y`gil_3Dq#4F?@yKc_iF5N@yM&GkzE~kBXVt*>lhb8IpPXIKCxs^E z0Itaj)_G4ZJY?<=RP~!DQyJ{?V3vN=DxZy$Qn_asWnP#dDSWK^fPjF4Qia1umu?A7 fmzo<5jt`DcQ1;$bu`!8-gI`ilA|}^Bfx#L8LVrXS literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/BY.gif b/frontends/dnet-is-application/src/assets/images/flags/BY.gif new file mode 100644 index 0000000000000000000000000000000000000000..6712ad1139d4fbb3bdcad5b247d0e1932a66664c GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5+?Q=)xP7BLlJ-r`h&0#phzj}x14YIAii%eh6wb@bKT=b>tgil4TYHwQ>;xH^cl!D-_4RM)>%TQMePe2R z%D~{gmDODfi*qI>pY7~^IXQiGa{A%s_TA0xw!PgWN5_XwPCLxZetLPma&tRuZT-vF z_rJgYD^JfC9v;8^{eJ}nyz}w-84&Q%&+kWI;P=45F988>0|Jh?x_$}|{}>(hH7@RH zRMd}@l+UTDzcMp_XJxJP^?jC=@vXGgpw-p%?P=fzb+%-cbTy2q^w!VPs&K z$DjjJ1j-W(9H$u=Ib=LGC^+gRU18YtC8JMV!*x!Ip z?6W!P#O5dG-1*~z;0n#)Mx)>kjg3rgy|RuS|9Co-KQO2%m}Q(oLli=vZ2865H-tFwv)SR&c}Gl*#_$ zwmqf=GaRaBxzuGFM%3D-uL|$qo<8?j>&7O{w22{gdkU89EM8nGm$cBQdrQWGIe}dp zV&?3~SW>N+-ey$1X7!rY^M9v=oo*<-Go$ybnZ_9#y)*U(=k(ROJ#5bV+Fy+id>!d~ z!`*Iqa_GYVx1EV$cOv|bB!*pz3qDhn_9HpsYI*j*^w?X~dH;&i-{q$~%TBzXlX$-> z_h(7Qn}XD*C7G|1B9B+*eyT6|Uzzu@BKKW+&YRkzZ%t)?8_Ry@rCzBk{@7gkt*ic5 zW5vt<*1wZF{!eKAKBen_ckB5u-$T(srvf}S#fP1*F8p-t&@XF~YpxELTosWksvZswKh@+Y0G-TgL_|@NkdBUWtyZ3zCfACv#+o8_B<6CzBsc1f1+;Do) z+E0@&PMUmj;+m%`XP=%qr>A5^qy&+b7sn+Upo(d+P&=A%&BL( zW*wWDKP&C%*Im1xtev&1`{bG9&Hcs8Hc!mXH;oMUC{DB7u&83kn(hTt8)lYTt!irn zMlLv#M+xj9p!k!8k%3_WgAPah|$uM+;-hoiJ!i#44fz9(QrmUUp{=`oGj}p6`l(!yw^1a zFX>4CD_|f6kvgvwB%Q55pO0mNOEpr({^q%5h#( z;q4aZnxY{1$XxNVvEpe{)eQ!U@0|5F87VKA3l6|@7}!|H*Q?JcJ1QDix)0jICJI6~psJ-bPa`j#Zb^Pqwmf=`6U& z^ynOmJd^*98OlzAiCCk_wG4g;e<(>ShSuU}~DD-L6sSxKQov68C^N0USyj zdM4Qfvn_qmlyH#SJksd_<0fYXA;ny?1Sv-5Gc)Amg#srEGqyX(@?1068PdTp-?oL# RWzwf-Z9L5zc-dGOtN|iB*Qq7#JQnWy+eWC1>)p9e|%3fY8FmI#G-kp+n4v73aFYy2We~5X=q~cE&77$+t zM1bsMV6|MJAe59j&&e=UK#S+>&xnpK9VY`{sWk^qcYdH~DI%iE?s=u-4vU!Uf)7u2 UvbendIz?M@+jWTw872m60Ku?1wEzGB literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/CD.gif b/frontends/dnet-is-application/src/assets/images/flags/CD.gif new file mode 100644 index 0000000000000000000000000000000000000000..86b95ff5b619534be59608644efadc74de1c8b5f GIT binary patch literal 908 zcmYjQZ%7ki9DZ)xoYkQ5zOt?q$(quKC2N_KNnnoth{|CjBKG05W6c;kO*jH6X;uoO zBqT#tm@FvDFsctmAFSPdGg9b-goK8~mK70$45hdCZhh#-`{8~s&+mDj-*b0Ik0058 zptT52`~pN-VCb?nG7f zj2cb?0v7}YFSpHJ0jvR<*(q?oqmgF*e;A!G;+B9x;SSQd=5NK80x%5Q#h)Iu$bsS)`Sw=Mm zOatjzN~|P!Z28lR$fV;jgWEFUj_v|A@QqA!pAp17pq6KN0G*SXoEIlx2A&1S{9g=T z7(Oy&88jwIECxn-48RgYF+;|@Mn=ld^0g39psyew=ps=3PwN~S0pp*TG#{f1%{FlS zLwNVX$b#@uw>*Nm7SN_?zQ-{|Hw=>Jse@p7i_@% literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/CF.gif b/frontends/dnet-is-application/src/assets/images/flags/CF.gif new file mode 100644 index 0000000000000000000000000000000000000000..ddc219cde9f7f4f3f0946c6ad62b9c71c912de44 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|52?>PRq(#oRzh3&Yb0! zFW-Ik?9I)a_ix;|_v+PqYn!~Z^m#%ONzPs!m#^G9c=E!L(-(K0JpADGvp1jKa;6FS z%n4$QVq^?s(T4s+2`rp=o~mR(68Swcye&; z;@G$aaVbkuvQ}grI)3Q+o9EYVUpsQ*$otRlpTB;7>Dr}Tdv|eVup1Q{7OgG}TNKD0 z%fJ`Mte2@4I>RS&R)B1VkY$~|S&^ovCQ(%XN; zb;97v71Nim+|tr?JUva4lA<3xxPLuI@pY~Kx88uyT>)KIBDLCFH9A~-GrU#@nr?`) zJHxo`l3D35kcYvM4%%!FMt1o{(d)NV^4*L-%d%od*{x-fB*je{rmOn*H525ef;?G#fukLu3R~P z{`~Ug%Yji0j_OeYJp>egvM@3*EMm|BNr3VM1IK9wMh+Q|4GIU@vY&L^Xn1%)$%$3M zra_^xiM5gM*@cS+i&`3;8#pF(7%V*0%EKgF@Irv;NGD@63#UV3QX><;JWJcJmIcCU z0n?ZyS3SuLR`Z?nio>TVl|x8TQ$y6N#PcYZvU`V!;0YCueo4cKH;zY6_;btKSH0Mw zD8RudX%M&L!QvAa<)y8Qu0%LFFA&iRo@WubXu04LJKsey8-rN84j9Jm%6T~H=s9K2 o$}JNFh1t%CH)friV%V&9cCN?d4@Vk5AM=$qV@sCi;b5=^0H-BHQ~&?~ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/CG.gif b/frontends/dnet-is-application/src/assets/images/flags/CG.gif new file mode 100644 index 0000000000000000000000000000000000000000..8096c949433dca93ebaef00b50838df9ecdd594b GIT binary patch literal 1001 zcmZ?wbhEHb6k_0E_|5zIG66Yi&&PoVQ z5R|{5Ab(z7a+aj}Wp%|RiUv3Iwbp4_+_kW{V_~$z$nlYb<0D6_!`9Y^tvz0NxLtG$ zcoz`xHX!^{c-*(RxUX@MPa{))rlkBxN&AwT@hcV2Hk?<8-~DWUMQ5-}I#-+VHC|JCaDL)qJRW$!;xeDp%?(G#_&ueF~(*M9j<|K)4_ zx9?3q|FHY|%jw4-x8uhdjvZq-af0#qamEuTn2#M}K7E??)G5~E$63#uVLx%4^V~VE z3m17WT;RQSS>W;&fyo+)@$3oa z^QTxZoMFFwj_b+=-j~bu->f!$zs~CG7N_sq-G1)$`n4zE^9H+LyL^A`_FpV5y+%=S zowD*)HMJcY8oRW#_Uh;y*3&znt9#PO@R)(YITMr9#>N-SOuxD~UA40M?&)^h-tM83 z(@!6-U;e&N-P~Szdj9hF{}t%}DD8X6o0ZXGBETr=zvTF+k=Ed%`GfCEj0@# zH6N37ZU4n_Wx^xpR#x4%iiu6BZIaF%f9?oIC>?2K(`zZIOlo$Qbn0Q^+@M_0a$4MV zhsnxC%Df8hP2a9eRNm0cBH_M8XJ%9LnfWfBA1_oYPjKQmAZ0|0LYEyn-= literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/CH.gif b/frontends/dnet-is-application/src/assets/images/flags/CH.gif new file mode 100644 index 0000000000000000000000000000000000000000..894a333e8ff692313ee3f6a09db3f5c7315b63b4 GIT binary patch literal 998 zcmZ?wbhEHb6k_0E_|Cv^^~%-b$BrL7bZFD&%~!5odGO%=-Me?ro;`E=*wM%L?*4lJ z_QT5;$0`d?A3n5Elzpo-?kO&spmpFw<()RJ`P5dfv%&hmGM)PwO4_CfB^| zb~>6Zu`xRDJ%l=}Z+h#YLyOF+ULp*Lq z`tJ30UhHi3Dk=0rxX+1T&--yfSEK#6`8wZ;4Z0p3@FY3>c3kl5w5Zb&e$P@O?(@`8K7IW7@!h+3Z{ECl{rdHb z7cZVZefsd>!+ZDc-MDe%+O=y}u3Wiv>C(lE7cX46aPHi>v%okwbLP~kQ%8;**|TTQ z&Ye3qZQ8V9!-nO{mrt28rMtVkzP_Ge6i^%jIv^83d4YlBG=nCmjK>CrgPxPU1b!AB zJ;u%@pi?06Fv(A*akA3S4~tmag-y~ULO3QivCCL9san3;bhLv*vs1wIWP%c#uvHa{ zlN5^@7cYM(pU9&kr{nxu6;E*84EURXb!MybRT*JJsHzzi(n0UaxMbBnK sgCe&yYf1~lOvdJm%8e`nt`in89_dmJTgJ2VvLC35`&tZ$&q^n!DOTBhxV7fv2Ib@=noPhWq1dGqo0gQxe; zo;`Es=>ChRj@-C(_Wa2s&mZ2YH)A*x&Uhw@?Mw{U`6Qt;$zoSCB`>B+PVp4FlB00F zNaIeW!NwG=hYgl@>aCx(JHGDo{4h1}aZny#J!jn`EO;`&t(~>Lm1A6F`o`& zJ{!Y(CXVlP9DlbX_xU8@D_IJ21EntIsw|6CdRS+%JIDA~iS@Bk>yMKHUQZ7GvpD6? zlGK08GrliO{k}Nu-@1}BM-SY%c;@V}gAZ?A{r2I_zkmP!{Q2|i*RP*HfByLK6*RNl^c=6=PlZOu<-n)12_U+p@Zrr$b?b?+qS1w(;bn)WF3l}b&J9q9Z z$iruVkp+&lQGz-lp!k!8k%3_XgAT|zP@Z7mIL*MwA>*+@!BNTO)QXwS?GqNc_ZQh{ zBqSc;YIK>gq;qqshmw20)WePhh88XfrlSrgA1(8p;MOmrx@)5%W0$xl%e;+D?Y$z3 z{WUs9E)7ST#B^LZVirH;k}@ulGqf`CaOh#v^QsWgU_UKl+!no6{6nCO@=RXur617niMg!wjB85%Dd8k-Jic=r@I2Blw+x2>!= l;jmy~6HB9SpUBHaPxuztGXD5tQ25{w3kO@WG!F-ZH2`KfNhbgR literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/CK.gif b/frontends/dnet-is-application/src/assets/images/flags/CK.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e704f3b103e6f18371863e3ca33fe0966dfe3d6 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5uUot&Go*gak{t)OUrLLfFr{mMYJ9!1dTD@byO~afn_Ziq+vJ|MUAk(O zdg@iiI`yV{bymi$7DjcpW^J}+%}zG$o=%fIoO(T+x~)v}{X8bdM=p&Bo{*opr66l_ zaqjl4l;s&oi%ashl@;tLFWgz0zpXTXYjN(zvVyHGb-UA(CpXotZK_*Sls{Qhxk68) zN?)_uK&!?;tJ*-j)<~z$ShvAQr^ZCD-pruM%&^hcyxqa7+sUTS*L`ZB_sp<>xltht zo$SivB9(6+*v2)%sgUY+TiZe z6A>~mJ9BAP`uy6e-AxTU8|$`qv~4fUpHf*qcgdpDy4rO%)@@mtlcN(CoNcYHj|x4z zXwK=H;$`(!_cyFs7ZG^1u6%iF{Mq`7%WVx4g8g^qq|b1$OViQ<#w<97M+uxEp!k!8 zk%3`8gAPaqC{HkOoMvF;knz}{aFB)XSHh$V3Wt;xWo%|}d|rB#r;$Y|@KT89r3NO6 zmXMo{$Ir`{G1=xem1Is@>c^zRvP$_ySGQ|BOISdG!ewS=0R}-u7gsJxse%#?7l%aV z<($1@1_Fj2+!Cf{r)~&#EEeeDR;)5OwSaM=grs>~N}!6txtSs!R(~uu9qC+Xo_(n# z@}Wn3QD)U6rm9iAgP;Tw;d*o)k`QW*2Exw<}>_T69EM VKO<|#!^P@?Vj^tG(mWgt)&NgCE-U~5 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/CL.gif b/frontends/dnet-is-application/src/assets/images/flags/CL.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4902b0d6637d8b0068f8966c4cad3cdfb783efc GIT binary patch literal 211 zcmZ?wbhEHb6lLIL_#)20z;KI!;lHKDJu|ca)eJpe?*F4A|DR)EcnK6`V0d0x-NMkh zRHCP)^8em_$F^?!zxVk6|GnKeZ{56h`~Q0&_znc`|APV0EKH#IlZ7#bL4rXCBn7gQ zfi*xup|2@r-iwzkuE8P)3(l7KMmHMzI_La1_Tu~W;$*`%F6|9AN|{c}uKe8NA=c7b pcCe#j|AX~Pj(W4tr?XV;4cmM_#e9zL{KbMl_SBuXZ((4t1^_^6S{DES literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/CM.gif b/frontends/dnet-is-application/src/assets/images/flags/CM.gif new file mode 100644 index 0000000000000000000000000000000000000000..0f579d58f332388f05a94abdcb7ec5dff594b5e6 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5O-kdK#_beB|5QCAF5)QZ%yD6z08wlGREvd*^lX!Ho^3~(!V3-1e$ zn;aL}6`3+CC1qwx>de%P*%?`LvkbEJ9jhGDW~5e3&l0g^5Vd2JbYzur=2YnC;N(febLUJ>pEka5!R+f-r>obje*Sd3bI0!C zL#JQAe4jpbd-clm*DwD+e*)gU^ZEGE@5hh8@81Kzehs*IP~gT1*+-YP&mS`V`poU# zMW^pC{l7d5e0$gG^ARcTPcN^V&W^wR{eJ}nd<_VA6%h`MTyP|h z64*mP@h1x-1H%Gfq6Y#{o?zfO&A`YZNEFQ%}PfW5B^3$ d5dn(}NfT9k=GYv4>EztOFUOWF&BMW94FEiPAhZAg literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/CN.gif b/frontends/dnet-is-application/src/assets/images/flags/CN.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1c350b083b6571a95f4669fc91b17e1f7924db6 GIT binary patch literal 579 zcmZ?wbhEHb6k_0Ec*Xz%|NsBLYHD`e%6ijutto|qyQdqy+!6V$DZE~YpU*(1S5^EN5^%-a?SFpO zSw@C43=C(O80r}q&N4EdWnw(X%zTEK`2s8J8CKSd?CfVbInVNPUg6@p#>;z-kN1Xv zzC*U~zot9wvK=eVBUS1YSi1_o!13?EupJhZg9YG!)L#N@oO@eez@ zUrtW9tgN0pIy|tq`{U;J+|lu=lhZ#huUBqv$E>aY`})4~^nByt@!#M7UqHYoAD_R0 zf#3Z6eg_8r3<&rb5b!NL{8wDu-;|Uesj2_7vVh?R4nK+r#h)yU3=EkJIv`U(al*j9 zpn;*Oxuvy5fm1X>hQrHHO-@zU*fBV^iHns@AT>l-Q%+gi$l5<9sfm|`T`byCNL*3N zz``#wF{(*YnqSI}k4IKr-^?v6J}#(P*7yjlxYc}K27PVfu`K@i~rOJG!PWmInA((dNf?Ub;buI@5Z+k2U|OOKKFRJ+)%Rv`<0 zv-W!=Z}Lpp9GJU5rS=%RMh&M{4X<9KgjuVURgaGMY;C7{)4&<_ajT8IIxGSwy2LH; z&)puFvmvZ#XK4P$y;w#3Ri#>O|!As{g%r8Kp)Ejpt# zzqY%7_VS>l!n11`&a7p=xQYGzCZXGVMP8gzyL(9g>kX?1$L;<-_WE?w=kMddk2eCY z>~}k}nxQ_M;p|$*Giw;nt!2Kjp7qQc*0XCluWaVJwvG4Pdfpp51iH((?(LJfv_)b{ zz2L)xvQLgGUfC``w?p#v8SNW;)ZbmuUp`6k(`D05bF>~Fv$(X=f|3;M<+>Uk~G6UW)wt zB<26}jPDOp|3A+$bSO0U&Zer~6~(^Tt-wZVBO)6W4; zPlDWj#Q1-T2>`|#IQB*fib6o~CkrD3!(;{>kSU-%!N75ZfssSTV}rs$jlg4P1dq7) zifad~%HeE&#w*ttxNisN752Uv+5sz47?YQsoomaqbIHfg$NeOAgO?<{bZX<3wJl|t zSIKmObCQyCi-2K~%E?J;K2tcR9KN9F(kY_*taG!Qf`E*D)0-0uliB*^Omgn5P(0jz zKtN6}WQIax6DyCjRl|=1j?Qe2hCx##6q{N)g|%W1R9tL2$|b@iDWRZ{;Lym-CF9WX lVZp&B77i9AEt8H33!S^=Tqm)d3{-aO5|WI`HBex%1^}_GC(r-@ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/CR.gif b/frontends/dnet-is-application/src/assets/images/flags/CR.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e3626dac0c3dba42f65fe00dfd6713e6e0bf57b GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5K>~L&h}IB4&k6_@;RcsH*TjZP6o!faNqj_go z)|ARg$I5#5G|fIYbcWTq7_5c6>`ThIHj~`#(y?g!o^^1G=ZeO`_@$A`C-QAsk z|NegY^7)xFr>6Ipym|d%aeeU8+Q1uEF0M(oUSAxuKFDs1hxI;t)0D^VdgW5ch< zguO_Kdz=zC%f;boTEgkXxR+&xZz@Y(SC%|2FM3m7bu1_2Lx1xc@8P(ToY5_-?9jI+^YD|-sX9@gTm&mtaL-e7N)oC3(&jhSzTwB6iAobD z$gAf};PHH<#wV)N^ebj&koy8D)!rjIO-D`yN}70Inq%mk)^osnrdjT#mXkuNo)gtV kPaRn~S-nwGAi$zPk&&HWL8>NU!-8fuR<>km9u5X;0Du#1Y5)KL literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/CS.gif b/frontends/dnet-is-application/src/assets/images/flags/CS.gif new file mode 100644 index 0000000000000000000000000000000000000000..c9d918da9e1bf175b11a8eae2c12108b04eec005 GIT binary patch literal 1005 zcmZ?wbhEHb6k_0E_|5+Xa1AHS_NHM{rt$!bTZ%apHlGk-QtZd)4 z8+RT)xcB+zuc}EW4>`L$jEKA}FaPlJm7@NOngMH-J?6fOh{|a_@cq@BypH3S85nZ9 z&hBAg@JL@P<+l3k>o+@DS?^!Eq!+kkl9#j%onzWXadEKWUKYH*YzfjnE=EG;t z9zB2FGWR;K`K+BAH(kDZ^UAfGch6ri4qY-&S8uew|HIdBbyLqiNlrPatRmsE`l7YX zlUJ|qU%#Q?I``R|H;*1YaEMv(B|hQNix;P@ZO(IZXLX$U`~QF4oX6n!93@By0mYvz zVAVPx5|k$xI8HGza>#gWP;m70&2TwUy!;qHN4JYc#Uk~~VvRg%3wBO9;?`l#am^-c zLsNT~G1Fp&qQ!@KWQ9W78a_BCa!wYvV5w7RKH?#x6Qi?1~V3OlknqFd&dFR<}!zkD#`~{w4+!K RYOuIDaW!w?Wn*Em1^@|pXL|qu literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/CU.gif b/frontends/dnet-is-application/src/assets/images/flags/CU.gif new file mode 100644 index 0000000000000000000000000000000000000000..545fa2178dd5f70f3ef609ed4fabca113e177388 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5`mleUg{=BEP^H0fEb6;+G^O&dSQ(mRGp0sCZvea<01iJz3cW`uZ%%@i-`(7v1O)u@ z_y6hP`N-YF$0wWy-rbb3V+T{chQ^&ns76+P3Z9+O_8vFFthj>d$lM zKCW7Ic>VelJ9l0>e*FH`t8X4W_;&Q@jRz0DUc2^+ne$9<-|8br-^`e~{o6iHnPt96(X65GdSFW5rckaa5v&YYzIrjhm&mTWNy?*`l#fwMx?%nwJ@8{pY zKYsuI_Vw$Bckf<4cyRmn?Q1t~Tt0H-z|NgpKYe<4@#5L@=THBA`|Nmk%Zs}5^GY)H z3=Bs&IXk(yP6-NLQczf|sCZFF=dOYNCM~Up78ds{EZznLJPr;%9Ts*!A^uHf#_RI3 zZ#QqgdGqGXnKQun1;_I!fh7bKf3h$#Ff3%y0m*^#1Ovxu21X7Uj|~b3*@OdLSR}cy zaq>x;byz%9a_4XCmGG!YcJ&fg^_ZlS_=)Az6fGwC(5NXdE-P4-y*hJqGW&U1`vw-T zODYYMnJnY?HE=4Y@kkn{pW;w?u=4U!W&x`jiHS_d_>^259tcDnIIzs4PcDNYFv*oy z-l^hDhhl-lGS3NOI|_wbPfg{HFo;;;;HaSH)g#hqrQ&g3-maF1)yZYW1P5;pnInyp sUAv{sV)tyhc_`Ias*zJ^!AF5ZF5S|OZGSd6K4#?>WlNUk;b5=^07&p)%{10uHX9l>g}c# ztM_i+c4FVbPcL47eE#a?{YQtl?fUfe<;SNl&mKB0~p- z#csO0<7{u&1zs-moNPM+y_fiT%rQ643-XyC9=O8Ewk{@geTd(JsE{@G*5zJq9d1qy zNwJ&L6SoKZP0mi;otLpMI&5yBZ%?3aS5oY&naK^!6_4?3{l6+}sOCC$%&d9^TRO?DqPjd*1aW9HvztyGx=&1n4DL8IN2?8OY_>+Z^ zfnhF#4oDp+PcU$tW?HKIsR*YrTUW1`qSu-U4m&{%0;u*S-2LuBNh;^O1er(avL#B9^12PaP| z{{R0UqEzuG3k!&)10q0XFtDfwbSSLeTO@KORpI27QZ}QW@B$t6SNk?BI8%~)*=ODR NJ#zmK1hOz#0|2-4DPsTt literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/CX.gif b/frontends/dnet-is-application/src/assets/images/flags/CX.gif new file mode 100644 index 0000000000000000000000000000000000000000..d94bd810159a7bda0e2ed191e3e67eaf5035e6e2 GIT binary patch literal 328 zcmZ?wbh9u|6k_0HxXJ(l`xzJxGccUxU_8Oexr3AQ5I@g$2ENVQBD+OIjxdO?k(4~j zAisz~ZMK%?X=CGACdOwOOuHHET9~{m8G`bi6ABq}Lm0}ux$B*3nqnBb%@}5BFf33o zTB*XYT7qFKF9X_dgrZYqXB7dZ)J%Sdl-`hDWoAp0*)pPOk-2LA7eRvw!=NUC^ z`+z+_64=$w&JG^LGh~J&$W$`rbU5K<7}7y{y)70#IsO8|=oqDjFrRrj>@h^QHxu+TG@_%@ud-u$y{Ny#r4NXPp z2rs0ckA}A5KXAwT8XgRi1fc^#P^%@$tR>RvbSjmK$K$bBEEb~%^J;c(dPcAL$HVVK2YK~WSz5Tnru!?3|%(ChV3_5j^qf>y0o zD-;U3TrQKzq*CeJ+}zaEltdyCi^U?5Xn1&7C=~Yf^>Mk}YzlwU_&@&X2P)E33IGTI z`Yv_1697#QP-tb1)8$GgKVyCUajChqrq?-ke8X2z%;W#^qI^zsuCS+sj`hDSIKb;q z3FkenIfb5aZjN9IF6}9eBRVQ_IkmF_-l~&(6Mmbe?wz#T& zowm&HSQ1p$-p?H3Xz~Sg4mMkKGxxEGTG>u#c}CSh;q}WJ>CubzB@9~az&5}c7(8(e zS(tg#@ak}NufL4J8a-E#bG3DL{AmM^dAdieX}iH>@+enS6EFCk7mf&~3-hSJnco^r BjWYlM literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/CZ.gif b/frontends/dnet-is-application/src/assets/images/flags/CZ.gif new file mode 100644 index 0000000000000000000000000000000000000000..334c528da8b0d480e1f9506256a35a530bc34193 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|54 z&4ua~s}yxx4II{Mne|zC?6C0I<`}Ts+I^8n#38qk4dH2Lyd&1eh5yhMU3RCF{4|y(wZs;O<)(0F5N zx=TxIua3@PJ-q|Ey6>&5P8b;;H86N(ZFSDX)8GGRK)^>ozqdXC>lo@7}$B{rbg=7tfzRfAZwX!-o&=-Me@D_U#)tZd|)|?aGxamo8npc=6(e z3m49vJ9ics1ZU37ojVs8ao`9XCCCo}#h)yU3=C5kbU;Rc@&p6NX$D3P8IKJLj+_Q+ zPdPq34^Z};B&TU4;=wQ1D5!R2!@=bOi#;YO=vt|C_&3-wnYLtnP&&rsF-ghL$>fB8 zgKZN_oyEaLOf4c7Wfop890K!f8cR5I9x@&6;NwZTvq89>eXeEclRJVpoLD<0C3Gw- z3=VkBG%vW*@l&awm6KmmPesFk#Z$~E_e{Y;CRYVs0ckmjABs;-Ofks5QgKkJwbMaR wMnvF);F6BXdKs4*b_y-^6lxR^;CR8<(lJRl{YKBlprz>% literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/DE.gif b/frontends/dnet-is-application/src/assets/images/flags/DE.gif new file mode 100644 index 0000000000000000000000000000000000000000..4a7cff4227d71ac5c6c318be7c31743b5cbff35c GIT binary patch literal 1003 zcmZ?wbhEHb6k_0E_|5U%KCYFhLyGTu?Y;vC$V0hCvbL-#F{q6H@i&l zZL~PI#N_*Nw-db#C;ORCO<_GTf%D>Y-aAWV@2^(8G*5m>jr6O{`s>@2cTCXOJwfa6 zEWL|MOurp;dbri;*><)m#r9|r^9?F=}rM~`0Q`54ufnA2+v0jt)gw)xb_QBn0UjQqzP^!xfdQVL z36YW6DJfZ5S*fY1adC0s;o$)R0sj8}Zf31V`y8L2L*p{$ycfV3@_A1JVG>6ATU-2#q1FO^(5C#eN*Xo-B>)+^b_{A|ldr`FDissU><1dG*pXX-OO zJtA3r^yEYp|5YiB&2GMuj4>=?lADx|^GaKkeE1>Q(jlN=SH-dBqS8@LVU3VA6^hNr zdL#^DHVB+hILOE>C=e3yz~M*-Kd(hbfWn2Q7Ip!(fCCQ{T{s0~J#tPI99)py%*e=K F4FIQUZmKF=Y-!U>ZlK9EZOF6Ht;j>&%tJ0hFmlH27B*?#vo84yqBT?917z}WG zIUo7N?G<+Z{28AZw-C-x*YQ6b=*O}sJxl;(EDQO-C{zvX1479H77YyZyEp5_wLanK z1^lSZN=M{6NTrn7G!xUzL<8hI4i*7PVs0dEx@+2iCNgh)*B4J?u&fhrd^{PzG?0c(g7sty>gLfXLMlt?7XfNg*Wu)}ri z!l2(ok8VUAe8*hY>cN>B>i0m@x1(q|VA5VD}>WeLm1JAQLp1&k^kZpNcW;qh1MQ3J#DWp>RZzDOG?j2E@$L!$j zbK`E)in8Oj9&hP_tIJn+W_9I6Oo3HJ`taMQ-_EzJDa{_Z*7o4Qon1R0^@PVdhdP!l aEV?~AbgsFp%6YCR-23q3V~?im*!~x;QznoA literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/DK.gif b/frontends/dnet-is-application/src/assets/images/flags/DK.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d200354c4f81d800eaa4000019fe5b59d627e19 GIT binary patch literal 1001 zcmZ?wbhEHb6k_0E_|5)&mYepJ~+$BaE5`Q zo`K;kBjXuH#&gWfXPB8Uu(F1}*{&{(wwY7QW=61~5`oFL54{z^xo}T~x{r?37eDd-68yNV_&+mb| z`z=@3-+_TY0|Nd92Y&=gg@%3%3Hcut^*1W&U1;c=kdWW8u~+>3UPea#O-cElntCQK z?p%EQm7JX0g@soN3ZB%|JZxxq*V%cdrR73<`?bElGo77x7cF|TY16MmhyI^Dd13$l z8z)abxq9`}C)$`}CoICgH z%a@;@KmYjj>D`MLubw=)boT7IQ>V_JI`!?_x988FKYaM`#*G^nFJ3%<{`}dqXV08D z1B@wfjExdh3jxKSEQ|~c{R}!F6G3@`f#VnhBZrK~1_ehp9v6|q;uSpXoZLzg3z z3pMgsefV&REpP@Ww_M1Ff+Y7z8ch0U9$aeeRWjg{3b+v9)Gnyu!E)(_(}Gh{Zt)@< zKMWSMPtgvU!(lRk{k)7*-Rm7ya<`=Zc69c*^ehwNc*b;<4eFmQ!Fj8UW=VI*6GPJ&hvJf53O@W**M_kQ1Z zzVADn*WZY|)F0QN;x9nciDrpLDa~lf5&XWF(sSv>h}v*a^^ST|r+^-woS00{QPo4? zDJpiV`8)Z=(J(zn!MEV=oIt^%_%eeHI=+%9+75> zjmz57(^PY)Vee$)A1e9PjU$J;2MC30U{`@uw-T`w7gIW+042pL5Mz+@U9D|m8e??{ zK{*){`mbVlT%-VT7s7&I5V%%TzA4aX6CcaD9%RAFHr_x4aDjJ9oo?#JTtY z?H?-zfZ6i6(m=nsRS`TTfEA!{i!*Njka7N7$z|710(#Sgp6CL%@H<uVE$54ELR-s!! z$D^~3;}BpyI?TA8hpq)NjslLw=(q(i^I?Z|A2jNVAAh51!TP9AG`fwu$1AY+nw2hF85)+kMo`HoHH{`+Zs32 zxBKA1Paq;I=7_1tW^`ASy?oI>V4AX0_)$<~X4VE+s3rT7F&> zefji-E%GRGKSkgxDRA~(gO=A0wTH>`#R2!?+e|VhGFbq z)`#Rc$UVUnkP?>UB2wDk^Io!&3bEn1P$+5ZMA%uDi|O3|oX@s$p@+W(x4;QF#tYJ! zq!M!Qy6OHr0+O@EsYn1W(6rzQV9LS{2LfnW>sX3VyHd5Q^jKG(P8(uiYaAQ1h<2a> zTJPqJ;i5gY=titp^S5VaJE;)`->>oR3~#6W0KA8#BtUF>j4{;nbe>a#0~0_pO^K6) zu=DQ*@3_Y}{Ei5JcMYh8uVg~#>_V&x)X|J8ASFm`&Ve!5f#)GG{~wM|9B(-C90pfa z9s{Q$24I?_f+J_QkyDGa!WJ5Iq&}k<=oC=#ch^C*0M_4S>Z=&lX+9+IHxXC|D-R+@ z{n{upZJ^-^;iFkkSr#esY=Pux6ZpH)_~fWX!nSBl|2Q|wNm$4^u1yWiRahiP1g6lS zcBbeY$%~w0f)aM3x zGVdM_S2pz=!If*$qu)F;nCFrk&yhr0mrmW#>V3iZ u$fHxkD_SbOn|FTLxp2wdLt`7SbnHIA@8PATWrNd`p3=3xs^(QIvFQ(xjw9Rv literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/DZ.gif b/frontends/dnet-is-application/src/assets/images/flags/DZ.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ff23179f692eb3552314dc5d326583a721c6939 GIT binary patch literal 1001 zcmZ?wbhEHb6k_0E_|5WpKmPnVc<9ik&6_u!KX&uw z`@kDzR+tYWpIe2Kh#v4VV|ykw}PdbzrOtG;5aqE@<=MVp01tA$0gg;9Z# zV~?X%m9=%HwZ~)+k4YW@GXvb(+`{LFhtCU-TM`#JD>7weO6u~|jMW)gYqOY=7*$JE zG%C~$8ubn8^c}k$(w3+4C9;deaw=y?NJet0#0v+u**$o0|LWB%XV0Fwbm2^@vrwWP zZ>9lbnl3}CF7x{*_ik)mKFLgEox9GK+{9us1H&0s)<=;M&!0ZMcjwNzvuFSP`}gr;{Qmv>*RNkcfByXOaZ{50ezW@TZk`|)I>usg3*qln#>3x$VUIaH#~z1XST?%QC-WVz(P zMCD`s>M`pC42+NaHkcN%ELyNJnN2`Fu1_N)h>dTSN#PWZmV=AixRjF@*_?1vJHu#_ z|LTpP#gn!Pg04qA3O~3qh%x8B5c#2O(9R<)Rpr3=IQd}1?4l0_jtT{C6Zk|`1Xd=s zdWkRb`o*H8QqbDYEv%EnF)`)Tv^CWXyjm&~SlT#6jT$Tj7dqZjt!Gg+NZGLUU;~3S E00aak1ONa4 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/EC.gif b/frontends/dnet-is-application/src/assets/images/flags/EC.gif new file mode 100644 index 0000000000000000000000000000000000000000..a555bf49412315865369d5485262693a8bf0c5f3 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|53XxU zopw_j9V#1G}RS?@wN}Ed28M zf;-nsuU;&FaHpfEMR`(R(1IztnW;`I<~2<&iD;-UpHr86r9JLMsK(^>=I7Z#OWRsL zc)2y@=A2<*ILpj@mXq@uFYhra$p^BsR}|!zOG|H3R(@w-uwP5-l!3ujGt*aYZeK%! zfRPK1}ag_0}tB;g<77JhIqZZDIde#+p zUNA1_n562}!|_I#jnV6aydC^nfrW}idRQ6gVlW4lBIb#7_0%>CP(uC literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/EE.gif b/frontends/dnet-is-application/src/assets/images/flags/EE.gif new file mode 100644 index 0000000000000000000000000000000000000000..95c3e98f2015e17a4c5d2945c6a40fe7f0877d27 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5k|xbGK*(v^bUTwas1U*?88s<*Zf0M8Eoj(Gzd6 za`1$OQi^5iSAUB_cOkETt%lr!^s(ZYLKla5s` zxmUK}M(v76BI43wlCr)5Awi*$?q0s~3JRMxZ+`Rk&BI3zuUx%iWo7B;=y3Jwl{05f zr=_O;`}gn9pFh8T{rdUy=eKX)K7IQ1?%lgLZ{ECm_3G)B5Bz=gyrwd-m*^GiOenI(7W`@dF1A?BBnC@7}$8_UzfQW5?F5TQ_Xj zuzL0C<;$06Wo5<1#YII$g@=cSg@pwM1_lHK`1||&`T4oKySur$IXO95SXh{vnwprH z7#kZK7#Qg5>nkZKDJm+;%F0SeNQjGzi-?E_2ng`<^78QTaB_08va&KWGXtXu99^RX zHA6u0CkrD3Lmz_<$WTz8VBk2-z{nxvu|eS=hoH|HhE2__9Xvt?6$%TL+;|&B91eUq z=w(quQZeWnin6H*}M3}v~oBKA06eDwO~=wIF#Vnq@X8dA@GUe5TlZ_ z2!{wmI^TS!9tHy^lNJ4P))n7=2>wvv6ISkKF!6HHxG>MU>%frWd9rO}TOyIoi>OEB>U_}aJvYW4Tqt~$s bf{$CfMKu|hC1eJ%ote#;hSI?b~jEpujGe30bsGGaz*Ka>E zGP91KI`ihkr|&<1ojiT!@X=#R%F5q={rdRj%ejje&tACj`|sahfBrmt{P^zu`|=9% zCr+L?c5JJenW?X@kGs2DR8-{269@0#K63eJ>#3c^Z(l#Ue0_^w6=ca=y=%L`j@}|?|^`>0Rd|) zEk6VYe+m!(8W;CHG4VxA%+u)TFR3Y?Q&WFuWj)T!{8n1}=+>kLq9%# zeE;Ib+h@;iU%h(a)Tv)zzPx$%?8xE6fByXW{{8#6Z{NOt{rc(Cr{~X~KYjZ2$&)9K zA3wfy>C(lE7tftLck0xsBS(%LJa}-|u3dR~c{w>b85tP?0RjI0{(gRbZf#gWP;itmtWnwc zDTRYiN7fa`sE8o|vnln|M0qB*FC0xrJVmsE zSh6^k)6R(LvBqpMm~hm4x?cPNj-Gyr^!LIVdn~w@BCa}1%B}?;gFjxZs@=`rd literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/EH.gif b/frontends/dnet-is-application/src/assets/images/flags/EH.gif new file mode 100644 index 0000000000000000000000000000000000000000..89c9746ba1fab5594177000276537a360c65961d GIT binary patch literal 193 zcmZ?wbh9u|6k_0HIKlt|dJGJi3=FFo7!EQpyk%hc&%nUR!t$1j;h-wRRUMtRMvPZo zb^d$$W=1poFR9S0XJDMg_=;jAJyYuu*xlQibu+HpNzSF+4BQ(7ljqCiYQ$ZU$?Dl{=@184+(C&Pz1*pIgKyae|MK;LdIbzd#jLh<0-hbRzCDUjGxX!k7G^8gmYLKQ+3wEbI#i{6tWkSmh3n^Sd8^AEc15%A zjAj40HfLwN(3xt}*9($b?K$@*NFHzUzEbPDF5i8J2iHzd!94-er8e@nYW>gWI&8Dy z+G@vhry}4zFU=dgA)H1b%EoCQu_>LkD99-wpQI`rgGdy^NgeJNmrxGo~GCQtWO6!KT7a> zl@anPJK|w^`gSR{y>eXnA{<*4_%{Jojsv@{cQ*4ipRJEMYF+;`OMv5(}l2gsJ z?glyDjrO`3>HRu8`c7ulgZ!kIRe2?X99t9w4=9W7QkQxgAAC1G`c*~#I%k^$exAT6 z21oTMfgS>iKUo+V7#1<;fFwY9f`Q{S10#ow#|DLiK7~7E1P>iL(k*2Yb>qOoWOx3? zHigDtCLG=q6*NP3?3l>h#v{)py;rhXjYr-uYlQ$~P?Bqpqz#MPCZ?m4r)YKXM=#E%!>9CLy>Z?bKA2s5uuBmmKF;aBNg-HBt}=7FP|N zml9dB++W&aI+sR)fa3yH^XLOLo+0hLs!W_x4FVq=J)A-bR;~)RLPMl&m zb%y!OIreKeL>@g=d-g(m>rS;Z=X4Jo(S85P>h=S>JNN8<{`PwN$>+!4z#qQ?-+m0Z zc-ige@06c^GQNCE{q-mJ_z}kAM;T9@Vm*6?>%w{7lgD{4Ul!Q6PvquJi5u4>Zr_o; ze_!$GW9^qO^_MJFeDl_H-#(pV#|_r4(K>n3@Z33*&tL35eXzT5!R+f-r>objzJGUn z_|WO_Ve4PNeV;yc`}xE7)eFy8uRMSK^8fWK;N5$lk01TMeGmNdCE(lFz^6|lFI@_I z|30UqjqCG=as;tN|zWs>8>8X!}T_2X5}9U zXFC?nexp#i&s%a;wBpM~(}THsx9cqKwK{#D9&jX>=~ALVzpvcZM2$0rCSQBpPR2{V z@AF#~uGyO!^t~zWs5V2jG{bQ{=3_>j=goQhbp>y^$)0nQe-WYoCDUoUztN)<$Dbws zUrGYLw53iBbIGyPKf%CooPnX1fuV+h;S@9TX;#(~K*Y&;iI?}XfWSEki952g4-^$I zD#*{0lw2Y${aRmty|VIKQ`6mATE`6x?pjz}G&B9?+Z^fngDY4oCu&Cm1+RGca<5?40cGFK^E@`%J*0luj05MVAQy7ay@rP;q40_u#?7 zQ_@;IVkQM28V<4Yy6SMeVPxtOa|jIRu{g+dj8Dm};)=kJgD1tznb=}9Hy(2BQ}n2N zFhOy{;mJA~Otl9mF*WhZySKbpAn5#njfG`N$jqPv2N+o;4MIE&6q^nh=Iog9vgnxi q4AazG69SdhcqJP9g*c6tteCjOXRclDp_G-EmUyrwOY?9rSOWl)iC4V< literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/ET.gif b/frontends/dnet-is-application/src/assets/images/flags/ET.gif new file mode 100644 index 0000000000000000000000000000000000000000..6b5ff0c073ac875c9813f0df248c212aaec2ec61 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5V!5JxzPx0xq<*u$X@{vrlZDeHC!;(gw`p#UosRx<`~&6&1k4Hu zpA#OpC@ytrYS!wklsPFK2RrmKw1VgPhR+X-n;n_CGKJrj%cx1)b&{R`WDox-p2aJ3 zYBrZnnWK2@y#AeMRwpmnJ$dhS`-#uf_kp*c1ROZ&_VQE4_kUrh&hk8c?)c)B+pj-< zKYqoXIn8+X4Bw?oQdh1jT)(Dq@PN*l(?%yx89sbyap{ujl`Cd9Z&*Ej>U{i|^}9Eo zuU~oo`xo%-o8Ql$0l$6*eft*v`&a7s?`i-4XPq%%xErDWAjR%evCqe{fHQ{7=k0`c zdZ--<&^;e+yw_OjSy}oS28MIY%okW$&#b7^%X>pW;F5&ILs{7?3i8XPr8g)l zzSGy=q^!J0Lu0>|)^R<(Qw9bPEiA5@nO-t6`Q_yF)XC|Uo7;bX|8IVNKLY}QkqeIG zQ387iDE?$&WMEjppaYTyL}z#YM$LpL z984+4dju3hwsZtCv-8U{O%-vRw8WE>i%Y^sVPi|@L}fn~x08!lyQe5}Smk&eNc5Vj z9kzm_qylwrTCz2@%j?K(1Ki&w6a7;Mh-6J4swZ(&>k%`$R_f$xxkV<2p dkf_m;6@ePE{OmD literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/EU.gif b/frontends/dnet-is-application/src/assets/images/flags/EU.gif new file mode 100644 index 0000000000000000000000000000000000000000..d70a720730d6629df64951748fa17ce6fba1d353 GIT binary patch literal 900 zcmYLIUr19?9RBXQ`=bn9=hzrdWUUYp(K**2mx#)kB~!+*w>?~GjZp>*g4@H;NfRmt zEwJ2!(8~$~edw{bn{F2g#Gr^CB3wjl;X{O!wc>Qn26Y}TAHVzkzVm&*-@OwTf@g2Kn?31X?y#>0{2AG_KHQg` z38vaw3ZaoyEHc;YUbdRnp)Oc*fN>ADKfnT{0OW0e04N#{wh$wz0V z)>UFP!c;IwGn`NBe22L`2?OPw{NyY!0yY7C+KfKFP3oNdt8%UwpCm#jUQm#DkMeJ* zYAB)U-{T}I>MrS~F2@N3erWVYaApd9fTyAivfVy5?Pc&l@&JQ?3+R8Yxb7teCd)pk z{hfwZ7H5V16#1kiK*EL%L-Sho5mm1NUBH1xHz}{=R|vA`AamMD#G1!Q=3$c3iI_D58H`LrJHNd$IP<^YNdu zprThi#6MxS%tGq0b$``HZ<(9i(eB)0X30hkw{xyEj0S5@#`0ox3??!;^M%B>Tfw%q*~48{p}I-y9L4-6N(d}-xU;I7oJWGy$8B~w#taJ7BFg>!!aiFNUJ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/FI.gif b/frontends/dnet-is-application/src/assets/images/flags/FI.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3d9574d0435af0e1381d82719b1c6363a66debb GIT binary patch literal 1004 zcmZ?wbhEHb6k_0E_|5ItGlS&QK zN?n^~eY*}Vi%J8Va%-=Cr-11eE_HTZ9gcq8PX0Y^K@WQi&vhUHhVLRSTc)P61zkyr*tZhY&wrjD!*cmw02>5%3R-wmWe*ONlY4heQSFc>Xdgb50e}Dh}{qyI~ z@87?F{rdIu=g%KMeti4(?bD}E@7}$8{rdH*SFc{aeEIb0(KCOuwnV~<#XrG zoib%gcXxMveLXO~!0|RpP$2{qf3h$#Fid370htBL6ATVL3)7bt#Om_EcFfV1< z)*Y%goICCgi7#aOFsO_$CUAck5N_yNgVzCthzO-V&Fx%$R$sNT@T7FX;V?Bnd)pHx$dH?1 zcGJ{76gfhbBTpTHG7zcj9iyu(BJW~DzqeGRE`O<(`9c+v&USZD>Upo7TGj+Uax`ZB zOt@MG!;?!d2S(cr7MgLG3|Wg6NU_{hshsqS@hNLI}s$-{uTdf?W)`j%ylVcUr2|sA7EnX_s9! zxhNX)@zGcC^s?+tzz|#k-%gv}g|+@Ujc?ZSVHI@GXC zMOve?HrR%>!LVS!0|!@h!IcsSHI7Y54MzX`9D*r4Ui~nf-`9gKs?UB#FAvzQvpP!9 zjro|#VR?aG1Gx;UHI*>Tqp!W-EP=wltP}qHOW$iKYb^3>YTg&#qXkZRYeDXc9)xdP zTz^bm=RBBUkb1eSA2y>SD}{|ue8aDQcrhERWQ?ewKZ^gV{$KwRIPfzv0suOIq|IUT z698@$h`_~XBMC!WcP6FtLZLM7uJbvq*%P%__OTU5NdgQO93kXXEyvJ4J?HMLZ{ie(RBKg>lh1AoVvG C^@?Qx literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/FK.gif b/frontends/dnet-is-application/src/assets/images/flags/FK.gif new file mode 100644 index 0000000000000000000000000000000000000000..c94c564347d066afa3b6a72e44419ea7be65d605 GIT binary patch literal 926 zcmYLIQD{?V6#j0FwVN`_|GN;@Jw*4ihtWlCHP)i73s%c*C~5I2u++A(-q!T4#@?b* zqlQ%F(t?Cm*hRFv8?{_P@v=!llO zZ8l3r>V}@2&xs>u<+i3x8kv{5%D#r&W3&6b*$~j;l9rh^vNtsKm#jEqbcc1HKN%m@ z4M|PSXEHbS)T>;#q&J_?jB(8;8I@UGoir859U(aD)LH^ZVxAQ)p~QJ>ZFj_N_dxC;mO$cL^R~ zFXsck6+>=oU=PXfhSKB~JQh3zO+cgTp_dM#jAJ)G$R>F-4p_oFy)dbt##$|>M15L~8%6hpvipr32x5fsHO zSBBy21$y8dItI6eE|TttHwrll%8?Q9)>y#$8Zdqzpg;*}Tii!uc*pRHp~UyVye=k# zQ81p*Gt@B@?J$b2jas{PUknQ?Aogyt4Ag-ZZAp@?&-&2JwJ6gNEw%IbJ&1c@l|Xo@ zb9DxV0BA=V5C&okmPIyrS|O}!=K{ba@>9X5Yw=;o3Z@es#tCPknuuzSeTkR z9KbQ*@3yvU2fb=>r_i#U)_CPH*H@RXPVDlli>OLp-@gCr2l6eUZDQ-EU;Y_;A#bXl nbe!yzYp(vWX~!pi=}ft`1%l%@>71uEvG{1> literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/FM.gif b/frontends/dnet-is-application/src/assets/images/flags/FM.gif new file mode 100644 index 0000000000000000000000000000000000000000..bfa9e310af73ff8e5af4eb93af00b428a78bdc32 GIT binary patch literal 911 zcmYL|QD{?F9L9gwCAJR}>NyhbY#;7k#u(z#)=KR5U|E}OU0Z71V_~;TTBFU{bY6D{ z8@95(II0c@RyGllZp5mi8~UJx5iq%w(V-6!bY!KGF_M`_*(zB%J2x%tJe_;a_y4}{ z|NqW?``u{dz{oCM*2|WabtNh1DvCLx8RID_n=WP^2+4Kn_Ix=0k`<30!hh+`F?TZg1dD`+(pYPd8vX zWDLF%Sgs*lT@ic+aY;=VgzZG?{!Tft?iW8%{d;ikiZqf3|-7asn+)ek+TUH$g&$tZ(lBrT9y+ zs;KBWsEDajD2X04B}KEM>>pD$H*03# z^tIzv>iLG!^JIpQ{aG*)GkMPwn><|@b#EG97|!0C_e8(XKWP71n^&S=+nF9*OV^q` zQ5G8WEN;g0vL-4nZVE!1$?3;oo9Yj#2K-){bn9V+4h_C@I(9Qv`6OCzJx$e<8-i(l zllDCi`dTkP-+aw``~v@z_l*AB%_eZ4dGQ}^ki@`K?1&;Fi$ d-n0-s*Zoq?dE9P1yl(a!`~8;_<6q41#(zV=8ZH0; literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/FO.gif b/frontends/dnet-is-application/src/assets/images/flags/FO.gif new file mode 100644 index 0000000000000000000000000000000000000000..3301bc26cfbc0acc345a10db6778b31702f50d28 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5c_pvvTbCPHZ!mY<>=Cru!eyJI?*ZS4(^091;xc~y{58LS!L;^SQ`%-+I(hxn zp$oe=9crtZxM72Rf)Wdfhk6ze){?^sk-_JdMzvbxpj*Z8s?7On@!hWd~@yfxBl%XZ@m3};_1hOXU-fscW&SDSW>4m}8fWPJTzN^U zze6Tn!SGhFhk$}3)5(;~;-jqd1g#G3DLm}PJIg4W<(q_(G8d1vLWfG^ro-+6>b?ye zcRn0sW@9O4^H~sZ(20#t)+9ziL(!?3ndK3OMuGxkGrNF{PJqIM_DPcdaVIzfk8tox zn-^ShC~{Glu3xZb%>w79lVUniJ1Q8J(|R0S`hIu>1}<-zV4}fRnyJzm#M9WN@Nwp( YM}3?c87z`fSJH!2z1fnbc{muX0T*Y9OaK4? literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/FR.gif b/frontends/dnet-is-application/src/assets/images/flags/FR.gif new file mode 100644 index 0000000000000000000000000000000000000000..75a234551e5625c7f4173b4dcabdc05a9a20b5b4 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5wtfF#6RrRo<;u1~G;|2ydw6%{I7@XD8T4!N#*TUkC zkbS4 z=d3Is<7s8(=a!Zq$B&;reE9gGL&vUPzkUAv<#XpQ-Mjbj*s+uE-+#D$`_8Yw|IS^$ zeB$icW2aBQeE06>-@jjf{`~y?`~Am{uid)!^x3mZm(E|jc<%J+6DLm|d-LYi!-w~8 z+_-l7^vQeo?%uq4Re$wY2u? z=p5G5JD{rz^xH`z!(#>p=S)ma8ykPNv-|4g^xo0&s+HAuH@DmNb{A}H9y&Sw^z!=U z>-*Hr?UkqJFMt2RXyI000092jxn2plEI4*|uWEQ|~cQy6qWMu74J1IK9wMh+Q|4GNCT zY)TCsh7V3I_O$=yGI5jYS(!#Qxsn7%=HnBcC)fO#nRL`=jt!G!hQq=~t-R`!Rlfe1 zytGH!rhp|(Vq;TFr;L}HqZZQ(pV`(WS2%bcE;_=-Z!*Ot%SC0v9Lv%hJ%TqL9bxB? z$WSTV!rY-?TX~N|K-r*`gOgk1j04lr6BC?j9xULz?5fbo%`4zD;bP0gK83b#D-=Jo zc02I#35jedXg;~f#fI&sj|sVUv;r>5!vRJIm;=r$1iU-yKWSxevG_jq`Fg*o>#VMP)TU%9Db8{Varryk78Ai0@KK5 z>&R-4?8)9)eW9hZ93rE1Jv{V1J&pbRY(hc;va;MFBg1lX{F0KAtEGvbOssukuJ)?U}nhuyB23?f#Sl zM;P`WWyM0+ zCm4<%WjcJA>GUb)vu9XOo@70BlJoRwuFIErj~(N?dPU&cHOcemB<|gnefU7}(nW=f z7d0L|)_MI}|NT4D-FtLSoG`d}!Q}oui(|)(E?qSH@WJl;cc;sjt$zJKK1*+@!BN?LmVlJwr)R=*LRoB@Pu&u3Y@w9-!+L(sH4K*PnXRyK-skGO-qB;H zo8LxfuMKYAIokRM{6dceM_r6gx)PguF*fyFbn;{`|LcVncgt!o7nYr>ZG1L&;kiXi zpB+7ZV#m%|d=hg6Wo8RX&l8rNBP=^tTyd$i>I!+y#mYMKm9&?s8*bD#-KuZ7LdW!g zjoW5Rrz5U@=lmlsgv1{34`1%;b2upKN=)j-}3^>$;h9u zY|V*9D~|^zOij+6&@o}1nR{(a&cfXCnVpljD43V2*;Hj!uPbd@CSXwFmo_IPXJKIa zwBnYP8Rawj<{!Cy^ZCm+pLz9)_>}#$or_DmcNEsonJ{UZZ%WUOy~kXl>elW!HGjqS z6PF&X-MDSm+Wi+FeLQ&j@{{-9pC3L{6%=%|r)O<*^O>bfk1kyJ;oQ0R7cN{naNzvD zeScoQ{POrQFn+=DJW5~*0mYvzj0_A58FWB$pgh6AahidVL&jr+!a@FNLW-v*yY(@# zMB^&3mm`FOG=#gdTy)$PfGl!6xFk7-T4+n!a0O*QdoB#j- literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/GD.gif b/frontends/dnet-is-application/src/assets/images/flags/GD.gif new file mode 100644 index 0000000000000000000000000000000000000000..17fc449c91591a1ef6b45dbffbc5da983350c030 GIT binary patch literal 959 zcmYjQU1$_n6#iy%;v^dC_TD&5lYNL9btyp>Q!!d7YqO*#nlOeu_^{a7Hm0crooL9Q z51K?MYluIDr4jUDrR{@?BBDY{!RYRYU|UTaij+`HkaSm3d{}5CL$7yceeiI(+;jQP zcfRv+?-#8tO`E(C+X zWKlVjrM3WXrL`C1V0mAhfmeVA9+Er_h`9JNfB@#KdnCuWpBd(l{77$s&pEQ7IfZTW zNbEx#=E2Ccqwxa~^ua!8>dEQFZtf%?dQ8zbEs|V(gV13m3oxG^S3PVMj|+l30+<4_ zk2wpRkhYap5p~zKO9FZzLhp-!yLic_q|RR0_27YK)B`z5>T@2u3g7SoBrJUpD)6`O} z%koTOigBYm$Cp?^`fN*DU@>?NoOP%4qO6|4(QY7obFqUgd6V*$O=zx8^caYG^~((4L_(ZFJRoGrT7= zJQS*H9<5rvJ$6D3YZSFH@^E6~7Na7HbthC~4OL{4WmL)P9?Z7>*)yzEewKLh=3=v^ z?L7I{u5V-6-&cH89eEHN_;=>~$IkxD>&8g=mA$7fe-hId9+oxU8T6WNTxpgwNT@>@ZXnpS}hCmm01B literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/GE.gif b/frontends/dnet-is-application/src/assets/images/flags/GE.gif new file mode 100644 index 0000000000000000000000000000000000000000..edb73568e474a6a24b328b29f46b7c47f5aede41 GIT binary patch literal 581 zcmZ?wbhEHb6k_0Ec*Xz%|NsB*Ff}VIDE$BLzm>Ihd_uz1X;VMGeUrt&kj}`E&B&O^ z$e6>-oXyOf$I6<^%9_o}TENa;#L1b*$yvn3mCwUd%FA28%UdBJP$DE$Eh17PB2q6Q zQ70i$BOy^CA<-l&+oq^kt012uE#0N2)~BuAsIH!+ppXp|)XHWQP1c6N)L zoO-RSmb$r3vbS5}<~GgAX}OnIorT40H@B6(zO&riR{8tS^YonK;jtqx<&Vy?*`N$&-io?fd=hn~Ssaxie=rZ`>FW z9)9=EosS<7@C?}THCT&GZNk91vvR7l?q9e5gCrCT|G>mqO-tJQBy~L`Ze?f)FjxZsTiCQD literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/GF.gif b/frontends/dnet-is-application/src/assets/images/flags/GF.gif new file mode 100644 index 0000000000000000000000000000000000000000..265c25a61c8f2fa36f08c1b9bc6c9b99b2bc69f8 GIT binary patch literal 322 zcmZ?wbhEHb6k_0ExXQr5u!n(RF9XAFhGj1pqpvdl|IaITl<|)_!zoFI&2Lnsk1#y> z!N{ z38DWt8Qwl)6gnWJw}bKN4{I72N-_ZTPh2ei&+y5Sh z|C8qapSs}xoVow!EdIY>!T&uB|4%Ud{}0qk04V-sVF4-80TCcO8CcyFRQp0iSh!cN z5(r$9{YHXE=y9?v!W-j&g}CqOe$+w+Pjh#cVGUP TwKV&8B5Wp-DT;j}jLXPwIDW7zX3#hgT)mH#+ z;s=|RI=%4cf!msq_iq(l6R-@AL1O+7f$svV0xvE3O0P-rlukKi7GzR^rD{d>&>DOqQzdVT9|!U9)nI8a-s1EXh*= z#nvYAQ=XBzVUxM6!QA?{-C@C8Qckyft$#PiWKkwD@hYt;#CKUt`s|mqz_xvUgszEA zF6yjVeoEU)z)B&-ZIDNkSPH6N)(1+)EOJUDQovd=SFK3bD@+*Kx-%gLF4W@MoB zlR~M7z4hL~k=KiKaDV#R&ij^qiV`TixzI3%QP<0}_Y0?6p`<=<{j$(e)YpS6e*pNP B1w#M; literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/GI.gif b/frontends/dnet-is-application/src/assets/images/flags/GI.gif new file mode 100644 index 0000000000000000000000000000000000000000..94073d73e796d9988e1b192d3805632d4c0606f8 GIT binary patch literal 1004 zcmZ?wbhEHb6k_0E_|5-IF#`D1$c>UnejhxzZFH}?z!Lp1}# zIcDZgX66g5tY=tR%UD^@a&pe);JC)idqY5AA}{X_A))oc!j~i@9?HtDmymd(sCY#| zeuuR5a%t%UiV7PP6=%rGp4ZTLr?0K+Y^{aRYn6cvx_>9xwspE59bXkl^H z%=D6p$pK^I4f^^|ot$2|x%~?W_~z$#$IY!zPxog)z#KEP4g>u&L4kiVGymk}z0Aou zlaa9{G4Vo4@rKmYzM!Cwy*)eg^Y6B`9;v7}-`Mz|zyIUH1(&+Jw@#nFe!+qtU%&qT z`SZv3?|1LqIe+flzkmP!{{8#s&!6AFfB*XR>nBj^2T=0+w{PFRe*OCC)2ELgKfZhS z?#-JwuV24@_3G8jmoJ|`fBy98(+sJ7&&A-HYhkcx3L*=EI4*f&c5!)gO!KddL$a#I2gT>)B5Id$NYM-@$oUA24f~} z)=9?C&WdST^@yBcVE1h>%46ZWl)Qjgm4Jn*y)z7Rfzer^TR_U9$HOq0sZH6b>dg+v!>tFe KvoSLaXr0L1_o!13?Eup zTs1SjWMXpO*!Y%})io=tPcF_6?CqXAIzDxBdgbQ!&eQXahsP%$pKk#H9|Hn@hlii{ z_I?o_e#+PPZ%WFml$4*jxqk}_zZDn%uc|zgnE0!*;(ue~ue!P)4Gn+i%z4+SuudGo&=+b>O@{%-T;dn;DlSiJc8wryvYEIGGq+1X{wzMVYzaM!M17cRUz zefrAQt>3R*`~T?CpO-Js?BDFL9Vm(HELaPHjkqes7f`SS1IzrTO~ z{`vFg_wV1oe*OCS^XHErKfZqb`svfBckkZ4e*OBzix*FxJbC!=;k|qJZr{FrR1ix(~cjX8Jr?AbGC&g|a3d();(%a<>oJ9qAsDO0+;yX))gfw2RQrBQ+= zA)xq^g^_`wn?VO;Iw(&taGYRZ}*`m2T`35M*jz z!p6=iwcyLiV0OO-3npPvD+d*J4lZtykQGVpehucOEK;8yx3F_^^9nfZ_>jyy+pL6# zBgA=`M>nsqjLU%siER>QY3CLQ?r=FdRX=J&isFHz-r~y6Ej$cL1|EFcjclBs7B5em zA!m`a!9#I^JEwdz+uxhT>3q^^Rv8Bz44o3XdHDO5%!~*;#V4&FGJ`{LLvsrYPm0Mx XA=ScGpo>JVD5eI+XF$u^ty(7r-(QTIbACg4#L!-ppmp2skVfj*cR51HafZ@oa~$ z0NmmXn$_VbdS_t@9tUCmUjo|#-vr_Ux=9L!z$>f;)Zdk8-bX9`{>zApIS}klCES0AUlEsbi^WO25 zF@x2cjj7tt#F$|9M5j;P98BaIEXD}4>sDIBJi+3mvyajOd)ECCnj*HiXfS*EO|rSb zT$Bb=#TRm1UGdTyy_CE`;>lC@b7T-s3I;nUTst1=0O(+5TKxAr8vAFOJk!h2^_I*Igl0ge1(Qos4N0a_o>^x_GD3t}a)#DZYMbG; zibeezch2*TYAy=%Pv8bP1;@;~bT33a7G4X;tAn6XQ=9@7kiqhV8W(~F&RGyZT{ODF zl$nvDjqna+VA5L#f=azeE8_sg1;$2pvq2xnU^n1OFJD0KSZ&jGVEBj?{$ z+?arAcnkuweQ|u{_{b6C(7B>;KR6RM0LvU198q%{Q6-rx+Jaj{coj)Qmw=3|TCJ!8 zjIDcDKKPl&Vjh7XhwBK87^p~fs>6uXf_a0Yk4i0U7&OUK2FcPU@XzWW&JG*YYc{58 zU*f}@dWD>Bb*V3&VbCZQn02?(9AJslJnW$hp>_CC3`bD-Yzr2d=s+036eu8UMTIkWoP#D&(|QOII<5Z zrBnNQp%m=AuGG8=-%dN+k~%r{xS~J1VsJ(IzQ1x{&#BI9mutpe59P|i_j9$4Zyy}= gzN;$v@#J)%^zMke^-NZoZO87tb#rR4=O&K-0g|xx0RR91 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/GP.gif b/frontends/dnet-is-application/src/assets/images/flags/GP.gif new file mode 100644 index 0000000000000000000000000000000000000000..0324f5bf04f3f7483dad135c7e27b5eb58e616ea GIT binary patch literal 997 zcmZ?wbhEHb6k_0E_|5t@9Y1+aPiOi3oeyaJ!$FKkeTyo%8Wh5Wyfpk9`;TAvuN4VDbxS0 zSo3Syif@aTeP6NqOj`DZ%z`uNc{fTbFST@d?hOk%8lP}6*L!wI$nvS1YSi1_qn7w9XnCUNSK`Z*2U-&hD3!(=98j2ljS<+}xfzIsNnUdgbQ! z-`Dq@r{^0FkN^Ju{{jL&`S|<|4E*Nj_d77~XF$NmfPgD*ZZ9Jv|E8q;NKFOC6gb94 z395yF;!hSv28MnH9gvBjJi)+mh=Gwq#$$tmql7`h1_>pXR$fW{qzgM19%dJ4WEHXb zae05n=M=-}H6@D8Zhi93 zt=~9gKDcyFRQ6j{z*+o^SKg`p*A2lJ9bQ68t_w1LCZ+k#bL{-bF++Jn>SR@qMQ7Gj z8c&#KRmh@MWSn|>>O$9kwY|*Cdk^pkyEJeZHZ`&G%Gl&6G(L1gzb%K;di}=IAxcBhOBQMrU&V8zFbK1oqMifSfCoU@Aw4vZq@bdEzGG+4 z(5}GUap-z$X$KNRpmzb?D^(kkLZvcDz=UKZ2({rjXU^E%f`(}UK_;wm=Sx1-$i-s* z0o(wm;21KcGYJyN;kB6ZISQJw@h(&Y3Rs!o@uJVbmK+37(?(~KGW+II`&nlw%f@vv zu;xB$ix3RK4|VUal&-Kni_nhnUe(#0nrdNs5WH38?J3^O_-+*Mml6QA>2bqC4Ij;N zrgLBzNQ^R?OG4QBcMc9J*EyUy5zh8jNL}Ym7f*1;Mb7+jC`Q)fs((w+OQEY{w{O94Ks~p z0|I{)-U=95P%-LMdy(1<)-Wu5tkaT)LGwJTA?36Qd_36qxYwW!wrExRINi%>gOGDn zecwG@V$ci~7}M`+NwR606*-3mEih$25xC~!6O1?7UcQRhe4su-gUicT%=2|*E9>97tVCMS0#@r zw4%1Z{P9JZxfg~;al7To?74MUA`#g*E*ETn8mn<%4$Lk01%1B#tQhQ%Bz7L&#IP2BB=WVt)V5} literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/GR.gif b/frontends/dnet-is-application/src/assets/images/flags/GR.gif new file mode 100644 index 0000000000000000000000000000000000000000..b20ce2101de06709b0b6f5c1637ad89b874114b1 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5=#-M0AS*jlMP-)0{&I8kl?Db=3=OC1>ULUKEH*KjgrZ6S#odQylcyr-JLe=_|&P#)~tEB zYSsOvORvwFb85|+JF{o+m^*jZym>&hbJ?;(3l{8NvEuN81-mwFI=f}dxq}DqtX+F_ z&6*>J58s(IY3aFhFXqnOc;Uj!<;!;cd&~U+_@mAa&odx)G8Cf3>P0YNmYxO4+)1{ zd!)?LBq|gqOi*;F{qupdED?xADqYRegAKGC18&hLJ5_vu5PZqxvtfBJlvmq zyGHu;z4CMS_n(##)N?pGV^K_1R_wH{*!FpG^_SvP*QeD-5g$`CEol&Pt_`Mz{g%ZOY|5wkPTyl!HN$)2R;T)T zZY_(wd)9iiFAJK!D}2EbzrJ-rQ?`0{EDN8#KVi+K=*7o_CT;TVS`jpHL&mndLH+B( zrf!XzwJT)8y10dh{8|?zEjb!9YiH)#3u!A(CNDXXxA{iF_FF|e?-XvoUAW_R-sY>B zt4&^7lXYw~+Nt&}GYsIm% zm#)}PSnEAwvvKD#ldk3Fy{qh|ZjM>HuW;Mhmg9GNFFb$x^40lk*G^uzaPj)}`%jz2O#_-^yj?UNQxU9w?WR&!3>DYLLXSVlji_BM(6uqX(Sg6I7mSL^4Qk(1iz>5`_a9v2?e zWnmWY?Ajn89wDictf-SKqL>hpv_M!bjX@%oRW3>0zR@nI!`iQrNiKy=A%R^XfkQEo zQz?mCHHAk#okum9Un5mmC!1H!Q&>Ag+#pZFAX~<~T+XyW$+}Y2rc}qd%Fwe_*SSi? zEXmZjQ`bJv)T_}ds9V=Q%RYRPv0IsuYl%&8m!)sLg-@-ySCvcjRQLFqW*)`%!L4=y zb#BppE)iYsG5rB)^W9_myyGW_WG@QNT;P{H-8X4!VA`y(oJGMIb3?P{hvzH|&72cc zurRS~MN--F^qO_C`ExUB)@0VK$*EtTS+gpyaRZ}>J(GwXt4ao|a*Bw4uB2&+u$sS& zS%I=cgOW{|v|f~nccXvKYOj>JHi7l7(fxthOM`Nj24yeyNtzaxyT~)PD1QoTV+x7FVp9m%M&z()MZL zN2bKDY;xF?<}oX&r6Y02mc%*T9m$cAz&HiR?I=MY1QdU=FfuUAWzYes1LX+@j?)Z` z95Nmo6b|Y}pIS0gIh}2WUg^6RFO4%MDmTU)`fMyBjpA}14-*%TUUK3v#1Io)5uHC@5fE2ZOtyggg8G!F-Z FH2}P%^N|1m literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/GW.gif b/frontends/dnet-is-application/src/assets/images/flags/GW.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8662e7bc8d8f464c8b2ab1b535f8b8f8e729252 GIT binary patch literal 913 zcmYjQT}TvB6#iy9?ux{^+#B1l8~va}#DbzpS}%r+nW$`A^yI^8QcH-g6-|NtU|K>! zmXZYqA_hhVLHS_xu(>l}QRu$;u!NSxt{PMppRc)oAEl>pCah;g8~q^1@WkPdx3R{u(B{{ zjz^m0le!+5W>t}X!AwCT@C7JxnnyEOL zQiN_`Sux|pY&j1zd7(Bm+RakYu<*=@Y?F|U#TN(@fx@OVi#RjUxd|Gf_05Kpw&zbFnv@LgaBl6NYDd4e1 zc-r@YoA}ORQfCCwVsKkCiUDKuS6q7m%kVTL=Kl~_5%?^S7SM&Ji6{h@HULWkK7o|= z8YwMTE5|}03}Y2JLl*(xX0LN-0L;y1+Cr3vdAeTWpTS=aGYuw7J;7llLg0-tIY(XC zFin=@IReGjCh@PEM`wmj)@ThD41Zf67OYXqxgK2XU-y|T#Uv&Z(Ao^X&eGE7sH6q5 z_Wp>lCYHHqvS#@qZ7T&Ul{9!-R^ct}N>|kCWisoRI(cqC2l`={xmou7kxMJXZ{4gj z;mq$qVZK%wt?s><&v%aOUhJv4&AfFZb;nzKZxxmVCTD++#q-=%my9fyYwzX|nUd_3;}F~y7+C8cKOr`GVxoSq zmT8oMd90CjqM2=qg=2X_f(vo^JUL&RMn|1y0^2u3kkh zzGd#Qyc)1t^Bd&v9aO!vP37TX ztp^9RUYs_5deZp%F5}ndEIwUz{Cd;v*M0v#4}+hb_WA!L`sah_ueTHT8}RKnu~?c`5*z)YAn$cyJ}^$faXU&72m!^PEQ|~c za~X6%>Ogsdf#Wm-BZrK~28DwTjXbHF4ySd9Yx(4?5NJ?z;cRT=(tH%6ewJUyXHiC^ z;e%#QZYFlsUzzXIRPNwr7I7;O;CK-@-@9Peg%h7xIRquRRVq#>2na29o_5D#=f&2Z3Cc!X4L1ZF z7c91I(b~FklXA~YC9fov7YiOXI@ndd^Qqc=)LqiVW6~al1|}!w#;Ok-i$vIYCKzX3 TlgKQ5(8SEfmMqP~!C(yl?=&<9 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/HK.gif b/frontends/dnet-is-application/src/assets/images/flags/HK.gif new file mode 100644 index 0000000000000000000000000000000000000000..aab5f679ecedf7f1ae4aaef019109809b3ac5da1 GIT binary patch literal 1005 zcmZ?wbhEHb6k_0E_|5f5i#uuqYpT!i6(GV^|A=7TCMht*gQ zsj?mbA`Q;tI@~99c~9u_9@61$mghQcAaKM`=$M&AkDB0B8`vez9IPuj?zu$4b) zr!db@dWxRpSr_%?=8BK}^dAN2ue4I0XQsHpPVJJn{$>Y_r@^LMowWA3>+N>a-Ql9M z(n0I6x8VU#gX_T-*Mcoh`k9>YGdb#G{3gckl)vd|f3x=qPVW+&E`(TZ_AvU8;&vz6 z;aa5K$7J_A(T=xcoc0A;?+vv6lIeRt!R<+k=c6Q#FWLT|v;AMB`MgN?`J5B*I>YaE zrr)RBz>m3s@3I2kWe2>=33#3ra5~oQO=0-!g76RJaSsY2Ki8zZuT6bdoBFLO>uXci zx203gbk}~kbY{N-;}HX~i)IpM9o6rPf-cJlC3Pt(ILChtR>&IdbxPV)bp9B{j?_*!Gdqs4PB&YJvm&9b{I7XCSV{Pd1( z`@~oeNO4}*RlIrn)S2D8&zv~}j6rZrjuIq?fZ|UUMh1rI3_2j4pgh6Aaf*SFL&jr+ z!a-(sJAt1~uE*wjut@}5n6SuQxRG7&!;49(C)n)jMH~(&D7jD4WK!R8VH0cTOsfgc zY&43GxlPn?XPLHv$=zSZyn>B`Lq(leO2em)L*~&_uX(mpbp!*pc<@NL__tgTIHB6z z&o_xJr5cbH>h%OCZ8}Uy5c@zzNvfJo(#ner#iVfU$iW|^5U$rnRnfl zghZzV9&TPPoejpB0s^LfEoUMcm0BG5__!20CM34-sRs4jX;|3Q!rr`rmyLzN8USrw BF0lXr literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/HM.gif b/frontends/dnet-is-application/src/assets/images/flags/HM.gif new file mode 100644 index 0000000000000000000000000000000000000000..4413ba1f5d52bec6f11e33153029fb44f4036e97 GIT binary patch literal 937 zcmYk5UuaWT9LK-6#>BBW%ROCow@Qi9hdu-hn$6mUu|FYmU7D3BP9)QGwzYO$jBVy+ zR=QD2EhWo>gcjQSkd33Tc@-b7503j#nsY}V1nnNi9%RH(LNa|&h}f-RXXhq+*zf85 z4xiue_x*hj=lu`D-G>G|coENmdW$1IZMxsp0-x&amyP=Ol+9{0!}(w=Z_d-mxRJg< zPIh{`bEuLFnlLQh?aq}~?Rjt;-?To?p&dK+DX1(_#COBoF`e{ zOcQki+?(SAWu7E_5UpORcm(ngkj9NP4xKGklSDlOOaSo``HWx;I130s2#%u^am}2A z=QJKpS{FWjKQtcJ|5AYp;RfQ}{J-J1c zV<3GifOI&)EK6?oc?VKMo8XOjVRg}x`)twuiSpJWm-~dAulh@KTkV!ykp)u=DT9n` z$yMQVO0)$w8?Nw#!Z!$y+Pgdfihjs`(FRxdzy6y4eAORT?Q~A)Bu!Itb6{3;mpy+u zY*f6h2>VaCcFba5px>L2;5yhbGU6?KSG?TfEFH#l%h%4GU4ywNscH8syC&z_URYsk z9j#vm%=KI0o!hn_Ls#pnKw8^-z4!gAS%=%*v*zFHnx5U!-E(QZpKYTr2LrWKVb3?O rzI3(RR!Cp}_;OdQu=)41pEJ7-950(s*RMM|KA8x6KRkHmZM^v};=@L- literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/HN.gif b/frontends/dnet-is-application/src/assets/images/flags/HN.gif new file mode 100644 index 0000000000000000000000000000000000000000..7641d5d3023a64def917298e5d536781351ad358 GIT binary patch literal 896 zcmYjQK}Zx)82)Bhn>~c-d$J5#peA9Vuoz0_MQJgWT^S^(gTY#xi7YvmFc^_(5gr0< zS+qmNCUyuBEHqF&h&vM!g|2nzAmN(GP7-(!(st&DDIlTY9@BjYq|K6L6jrHfM z+wyP}zX6wcDH@4>`e;QX*7Q3o+!@{6vh)v@OSGQ9wC3mdBKmdJijG**@2z`xE$gp^ z!?*!F1^xh<8&3coAok&s5AiXOAAEnj&%c;2k^ORL{6OFhL2Zaf%sK_6Il|6@7+R+7 z&3u(}OiM5)sNF z0-J&ncM(U<$Zl3k2mz;AN)0m4GTUoryfNDVGr$NKW_N|5xU0#*2cyz<1SDmPli>#> z&~mP(48sO4I}kuwGkSGG?Mzn2X>W%~lNv9$uz>SJXl;iNO4sd#Ced4G5Qf^Nc-j(s zA*!{4wJR)~U~QD$M9v){&Rw(VF=?Tit(c5z3|Ii-E0j1+aN9DU2z5%DVDLC1JmFGM z1HZ@u*VzHJ1k}-tlEbUGKMC7#6CCq@F#Kfr&R{ZVOqQ7nM!5|@lA(YhWp5)TXKMLa z@CBi7BV*_~P;k(z)Aq+WxOe%RN`usF;`lcxI}5`E;iVpB6p0qlzyhD6A*dS$$?()c zaI|s!bZcyJ)F1(SFeSK^9%UrJ<@71*gXsc;qzK3C`s9#K)5PRHtDF|tbKVaN%50Oe zW_y+$Zkrdx%W3esqB7sxZC2K6RXiKyI%(#84i7>%GP4xzyKE@GTORg5A-S(YD3cqe zVs!&zZfWb%RC2LD`()Ll(zhD}Vs=GmPi< kez)L#+~X}2`lXr^c~_J~abhg@bn%PQo!FNFh$3qK0g&|vtpET3 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/HR.gif b/frontends/dnet-is-application/src/assets/images/flags/HR.gif new file mode 100644 index 0000000000000000000000000000000000000000..b4cc470042413f743a4a5db04e21b685e44dcfa4 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5#?v{VPZ1d)O4D$@kDFu`A$x2?CfU* z1RM?uI^yTI%iDWXXy^e?ul|V0l>vd%Q&KmmsxQ?yoM>n~(Zy|_U*N&;$c05E2TLoC zmRFxSdhGbyPoK_Sy!i9apYOkZef;v}+{KHh&Yu1K_wTPie;z)5eE0tSBgc;Y{PpY0 z*RO|<9NDvP@8v6(FJ8KM;^c`ZPaa*mbm7mR-`~G~`}XbY^XJblUAlPu__5p9uN^(G z|IO_iC#%YiFI)1YIRE*|KPbn85qv8vYugOy}-+RRX|{Zpx_xv$-A<$4;2+> zOG>`f*YA{(d2ed^(8A)Xsp(fIryWK{zuerOy1E>(w*KYs|0f{eYe2wS8=G(8;UB}o ze#FK7Oi6hiANMjL;d5&0pRBB}85w6IBcJ5te6OfD5EpkWJ^fHx+NFYmLpfO&%Sw*d z)m`lDynXWIkI$dKfBN+9<;yqEpa1;&_05YHPaZxzf9A~ft5;vVc=7DnGhm#8<93uF z5CV!nSr{1@<}&Dj)PeE@1IK9wMh+Q|4GNA%sdpYIUU5G+%Q*SWl1$;_eR7Q{SFT8Y zIquNJ&dawT@pGHsJX@xRA1qrm1eiE^6m(`3ALn1-)Wo87B4y>IWlStAJQXdSla_c+ z-@(DswB&@4Vyu*|k%%V8L>1R55`q;^xu$BlA5aNm@#GQIj@XnjQ)vUIx@PnYo1c#~ zdZsJ-nYrF%a$UeLrCanMK(KLQGpBvkjR%3rZ3l#9^+Gmmc*xc&tCz6BA<&71qfy=@ c;lzQ1hdE^RQ;tMTJjBu|z?Lk{!@*z;09VIS(*OVf literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/HT.gif b/frontends/dnet-is-application/src/assets/images/flags/HT.gif new file mode 100644 index 0000000000000000000000000000000000000000..f1b9609a81805b6e1bdffd5d6b915fbada3c177a GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5fnhg)ueF9V`q$7Q@u&EK^8#t&J7WXh zM)^H0&3c~{{ z0|URgxm^wj_z)icDLC|5T-?{l$fqeOKQhw)rlx+*%KELLeQwU&YZYBP;?t`uC+(WB zVQb^eS=nVpp>clOH%vUXZ((MV|Eo*KjxL@K@zpT~28frAF*BcHWj)TydWM4o=&_5u zyk~iNFAE5q5)wKqA#q1m_P(Ox1qJytiV91lrLU{2uTfNdrLVtUS$Uh9+6@E!9U2;M zOig!dX&uzjIjpC5Kv(ySk>POzgS!?M7tKu1nV6h5HvZ=1bi>N(yPMl>d%K5DPS4!j z-gDg#LC9kAQ=3tyNQKg#w0=ELa?e`@wFG0#%(<_{by>}I)!*7 zEO#iqwWLuwfuWIUj)7}d3C9En*Rp#n3Z2={D|k#d@k~nb2#{~Ae6%1@`FWqb`!qA( Ss3{#6=G(F*OY?9rSOWkDTOeQn literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/HU.gif b/frontends/dnet-is-application/src/assets/images/flags/HU.gif new file mode 100644 index 0000000000000000000000000000000000000000..78a5724dd57c59559adb42c5be127809870097d8 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5Y`@d{K4NK{M6cF4*%%PV#$N~cRJ6)LMYs4M0u>d(;EY|zwg)zv7|(5lulooT99 zuV>I=VA5e?G0DPdxs&AtE3*zWx8-h5Go0M!yZNv84_Fi6x7^QbzL!&zQ^4$i*mbdi zQv+ic$L8$H$=;G(xVJEGYu@K?pP#*acJt27pq@1Ng)et-4m)r(gzuHCqH z<=U0=7tfzOeRAJ{eP+F;UfrIj&YXPy{Mi-;hRqBNg$xV@3=CVDnRl?VZewNL%E`Hx zm-nE6z+MT79pd8K#l>3$1y9P#o>f%bCokV8DY;8YsZK)Ty1xENUESNJrspgyo;W$J zHZrbaZSB}d0?*4D55{a*(JEVi(C8W8X#Fz`uu_?v`;=W%hjBO~udN54!? zewLd0E-UL+M#h_xk~4=6T{wRH{IO%F4;{L5`SPuc7r(rI{ruj&zhA%p`SRuC%a`|W z-1zwF)#bBie|-P`@87>afByXX_3P))pWnWH`}FD4yLaziy?XWZ>C-1qo;-Z`@WzcB z*REZ=bm`KC3m49vJ9qZ%*)wO(oH}(17=7Sq93{vJ0mYvzj0_CZ7<53IL3x6K<1_;! zhm6Mt1xFQ+brU)lFXI+bbDL(f@{ntfWTWS@n#RLvJyX@(r&ugpbktkYglY4fiN?!) zC3J!oMciakJ3GrfkA;szK?xa;3k-)^1=Is(2s}z;ZslZ4mgeDL Gum%95gF;pS literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/ID.gif b/frontends/dnet-is-application/src/assets/images/flags/ID.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b288fa2ae0494967441eaf4bf22780bbd451ed7 GIT binary patch literal 1005 zcmZ?wbhEHb6k_0E_|5$}DT};OmvFBsPcI!f{Z)SVlDhRk$7eY)EFP=Vq`sB%zhYug#yLa#Q?c29* z-MVq(#C&Z(7cXA8aN+#<^XJZ;I|~f@GiOenI(7W`@gql$?BBnC&z?Oy zckbMrT>=0mNV&zrz+A`swlY+RMWmwIL07mC_LG`378yuZm515qv5wS|) qxG>Kuk7>=!%j}H|ja5v#GEda~WlS^fJ>Z;#RHz literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/IE.gif b/frontends/dnet-is-application/src/assets/images/flags/IE.gif new file mode 100644 index 0000000000000000000000000000000000000000..4ec0ae2b676499dd4110fa3f3e38eb064a30ede3 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5fhi=MriW zlIV~Sj2D#em6z{Qkj#`+pQx@_sHoMWrQNNq*RQ8lqh;7ZU%h_y?D?~2&Yd}V`lP{hea9sZX?s)8o;~yG z<@0Y}K7IP|?%thS*REW;aQ@u#Kqv&~!8D!YS$d~( z49?~mUMe&>UtoN-*z8xA(~WY=TNPFhYVH2?xjk)kde!Rof0FOJPS1x8uKy?d|C<`{ zsn_T4l)!KOe!nLN{+tx>x;NC?M+?_R%t{o=)oCr_R{eE9I*y?eKB-@b9<#C&Z(7cXA8aN*p! zb7z6xK63^XU!#CZA)xq^g^___B7+XdJW!rs;5f~|$RXpgLBWxUMX991aq$Huj|pu7 ziIbmni8r#!6hu5+)V9cdf(+-wOKD!y4VlDaEG8~$<#nGRr^)5S)+c5d&Em(gFsX%8 zWN?psbK2l!f`^BPZt^Hp z5@6-vyA0Ullfo(%%c0t;-b m>K0U9X7Lnk&`@zY;^{MmNq-iaH}HXk_6>{`ZE zxR1YNpHS6tq0;>#6^BG3x|N$wDAyg739K+|IjCK<%(V58Y3l)-{xfE^o2***xG#Ka zSTN6Z##M*D zfBgP?(|epKfitZ_Vw%6PoF-0{P^+RyLWHiym|HN z)zha>A3l6|`}XZyw{G3IapTIBE0-=^I(P2eS)f5@&YU`RYWeczz&Hd)<|sj02q^w! zVPs&K!Jq@u2Feo*9H$u=Ib=LGC^&M7?3pk#@EB_cSJ1K)frCjsJdNB+83N2~-7V}q z6D%Txj&_OZF>$j@EMDL@(bJ;HrRj58?*z*dmbfkzhKcg>rki>;OgwNw-l6>)hl;?0 z0A){mgBceS5BV;zZF|9R7Bi+*x-Jd()aoEGr1f?i53qn6|KlthVgG77r2zTS=4%SwwSESM*v5 zVFq{vdK?>S;|73wMY18pXBbwZdifNDw#u;$DMTjKz1F#I;);mEN<< zFXjqkL$xOP^YyNZU#>NXYniwQW#Ad0fF0@r|gBc*l$5?nu>{e8GdNrJ^QosKRYRt>UC7-wNL5-NFZV(QRaf$n-FpxFrB@zSKp zW@%=lm+Cg%$t!+5Hq%i)dVUEZLs1<6Si-o0n;f_QIsSW8hS_RmxTQY$r1OKH@?U2q xC8(D35NA%e1c$ScZ*xFLurrqvgy)TFf51W^CkEWz!}FP$*;5zqU6LjA{R7WX@0|bu literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/IN.gif b/frontends/dnet-is-application/src/assets/images/flags/IN.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1c16ee41dee842dac79e47ed5e3e0f274a0c7f6 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5x8RUt{y*j{L_b@Cr_SPyyWuo6}xB5KV8?c zed@g94So9;uDw>=x~Hal=d?xpuHJjU^}xwDA3y#2_wUr1Ggq!&J$~l&_us!>y?guO z&Fd>SuAe-6=GWgp`wktrcI(Eeb7xMTJ)O5DIcZgJ>#;J|Ne152&4Xszhfna#S{;$G zIHGh@O3UHm?lV>HlZ>L4xF*aD=r~8sSS!Jv;OQCYZ!8bV^<2mcK0^dxM`w4TDx4vwj0-$P#_O zK7){HrfHj;GB&vt?(#3#7V!M}vok>q^~MYr!dTCQvffA#xDv;IEv#x()rQl_^03PSh4m0X#xMH1-$F^dDG+ldwR&<#p(4%4CjKFPX@4_31&YV z#(6DFviCA&uB6GotJ43}VEU`eX?KRv^CrjtQ~ZBU3iviH{MYQb zms4WC&rkioH0%71)pw8YesJc%zZZ8t-o13?@Xi+(4lke9`}OX{zt8V{x_jyW>qm#y zuiZFz&X4ck|NZ;-=g*&CzkdDv`SaViZ?9gxdiwO~!-o$qUAlDk?AcSNP5~nn9I>MW z;Sf;#$->CMFo!`0q!g4V95_xhFmlLvY*08Tq!qBoppc2JQ_v`8OTtDaH?GD`K2swT zj|+<#nPe1$LNWxEotUnkILUmXf1Xv|iZzwS$NA>j*04CuGI`pxjG0r+#vwt0LDieZ zjC0OLmCi{rHZyEGm5z2yR&%KPArP^YYr0|MubR%{)-F+<=yx5O$^v{d>@&}mT)fog zD`pjUXo6$1TS6nlRD;w_0*p?~>>?_zt4cH{JMc?ev>dpQ$i&Plq?K}k!RZKlqiNZL a4Ta9`{E7j63YtzS9s*Kq$6xRcWV}Fx5agoY`89MQ^-J3-814 z|9}3^1Mh{4=PhTNbx;U@0Z2J{Mg3N1h~}R%z6q+R$&=oq>28vrV2*eRE<{@0r0pt0 z3?pVy;MdZF6C6s2>Fo@fWCsTra)uX{Up2dFM>pdc_K2Gqc9wJYv+OUTl;C^DxXeq5 zniH&Tv@gu^Go&;eada`lS|&2ZbISsnM%DpeQ8meq(9DuJ7-k&ZEIH+gj3H|q;|n3F z(i~7!-96F-MYsv4o3wW^^dw4eOH_!aW(9F8!$0QOCt~0(C;cPQj|Jg*hF?yj8O||6 zn42g^FKcUOd|^cQl4frNg(zDaX}`+!j3BhA!0EwBj(eKsrr1b`p=Nn;rN`=}1H&G6 zj`s|((y|a3Fi~RFzRU8(Y3Gd5V-#u$c7!cd0lSDWe*e^RIx_DS^x-mK){(R$y7V; z{{r9|fHR4IiGvT|3V;Iml?ptxtH1jSbe92|LFY4qAr6h$d<$3z=pX=B$aa9Y0T2KN z%ISRofCHppUXlOr$gnBHiVP_k{IW$acYut8tN^Prl*zD>EyIR>Uz=@ha{>Atuszcx zKpEg0*+^|*2Z;aIO#iF{cj2j8rT!CCoPu}?Fh#1{8HM!*!0YA#R5dOXk7N5jRiN6- zrtpk&d~r06)n)zbUC(z%Wvot#^G$s+xLX#-HZXHt^%g(}zu+DbsnsMR^64ocR7yhJt|N`?Hk)otH(SB70^3gjyrR zE3UqU{v6O&Y%=vPa`Rt1eo3QAE_%`Tg)PN-pQ&6qy7x`TqxW(zENaac8)_`ry<5Ll zo(BHw-byp IXyC(t0ijaGQ~&?~ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/IQ.gif b/frontends/dnet-is-application/src/assets/images/flags/IQ.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6283c23e4cf9dda8815961b3d3bd2cde1d5e9a8 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|57K*;j$Jvq=hptk+m|lex#HOE6MdT}=Fcxmn3|9=HDmg&=?jl7 zY+Kwmd-Lpb56>OHaeV#m^*avkc=_R_yn_7h1G`^;c>U__t79jR?K`;d!J`LPuU)-# z`O=A#C*FL0ZDwYA{P?lk*RCFCV5ntas9|6@!OVP`mGuM=adKYZ<-IH*a85#Ef}r3X zS=p1avd3j)9w;iFmzSR|u{rj(; zJ9p~HktOrzzkBiG{>_^g&Yb!2FEYc ztR0cg4}7L;`pxp#cqr9jrb!yhzKP8ZjZEe_ToM_=>IWNH3mQ0%Bpht!6cTsnu@HRZ z%r2;EmLcGg?$;-xlW-)X@lk8HoOX!M1H}zZbFC{1F6>y?+{`O!`s&S(iS7^N?AxR) z0=_gjv2axV_%czUW5NOF$$E@CTsVamIo30YdR=)TsM2Vx!+0P>Q)sbM!#|!+8&3qX Nd9o!-^KdX&0{|W@MPUE{ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/IR.gif b/frontends/dnet-is-application/src/assets/images/flags/IR.gif new file mode 100644 index 0000000000000000000000000000000000000000..f1e66af735c799016f08af51e661c6801f80291d GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5&LG@zyCaX_~`t(^Y`xF zKXUlk@85quefoU<{Dm)Hzg@U^>G+v5Uw{32_vzC~AmjV@^A|53KY8-li4$MGe*N_M z^V4U~9zA}1_TmMgDWAT4_MaK#Gu4lwn1P{)fx&};!JUD*gqgLRm9>nOvy79smRF!r zK%!AXFiKFiOIER8QNBf9GDT8qPAi>^>W$pix;f5uwCb`B*c{-$(LZ2a zK=_96xUF%avqMw2r)KTT3Y!s@wluBpK;OY*2hU$VfAH`@t2E2x6-h-~3*&lYn+`R$ z?rWKFrhmfe{?3CP3og%l_2$LJ%jds+{qp_mmka049zS~I=$ch0R;_q>{MhkL8&5DW z9AjcS$;^C;jqNx)`w33Yi@dy-g@w;bN!^i^y{I66Us-vHwDcM!rC0j;>y?#vYiaG! z)O=%RcHF?=uz~(XGt;|PmgmgOzBxI4_w;<|?EK8l?YF=G*MNYJ0Rgv*3eV)^9M8-= zmYZ{-q~uyn&8gDTN1dHpi;8Y^ciryqJ5W<|y0!J~{P{mtu6Vy_(T~-u-!5JHbm`LT z%a%Uev*+ixZ*N|{eD(bKiK9msFI@Qc_3PU=Z~prE^T+q^&!0WJeCg836DLj_KmP68 zx2spL?%lf=7{B0n9wo4ZfZ|UUMh1q33_2h=P@Z7mIL*MwA>*+@;h>Oe$_s%-Dk?cK1a4Y#QdlF9C2W_F zr;whv!3E2p69CT{umQX2RJd%F8g`GceV*zvNR6|gEat8hixYS literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/IS.gif b/frontends/dnet-is-application/src/assets/images/flags/IS.gif new file mode 100644 index 0000000000000000000000000000000000000000..23e9c6f69f7c39c93782664116f2b532e6c2a69c GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|55y^^hjU*iu0%LESkHGkGGqTw^LSTa%jjAM#fe~#%5;b5H_}U7M4&J zmJoLKc23StF0LMK?rt8QPF~&~F0MEsp$Q@)GlYdFiiu5?keDtbJ6S{|U0Hdan%ZJ@ z^+l?xGqkmr$;(%$skN!9HmIvN85qnrHC?N#+izvH+0t@@mDMIKtwue)9$no|W8)ci zc3X{&C!3m1v$ULRXSc%IdcM2+ZhQM>9v-{By!QF{?Dz56=j*%Q({qcv`&u8L?cUy- z0s{{O2JQ<8*clpnI4tZ)SlHpv&;!B2dmrJ69JE ze~*gBQYE#SvhqbnW*e;SR-0S)cXc0|IQi_X*;hKdcCTFZAg^dcdG#)PpCztAD}&;< zCgmOS4(=_kKi}MUr@r%I+r--r0V@h?4ir}Jn7-)A86AZSx=Po~w9nZZUvss27~*|9 z!1G;d%$uylQ!yb|lcIl>1_d3Di8>P>_n@NeU1!Jn>dHqwT}LV_e$SorY32-I z{DR|ol)w@Kia%Kx85kBa=z!!vd4hrCGy@}tjK>CrgS?VQWFoFK__PX0In2qJ$b3?y zQ6^-HXTb|c2`*Wi84-bpJEmwcxxd)aC*P(rW9;p3rpAq{VqV+SXzGbwPE-P%#f z?0#;JRmnS!FDjao7`&z%q*g7-6kg)Lz^YK_M#n@&@5x$UKYmsZSm@FvASk60a8}Zc zSw=9T`6$mU-Pj#VE>3by5Rp<5dC?fqbhKC5f0oG0MCCRIMa_L8H#Rfy^r?ibG2r~v h+|JXer&eKjp#7kPlGrK>Nv4$JJQ8fl(mWgt)&M`BFI@lt literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/IT.gif b/frontends/dnet-is-application/src/assets/images/flags/IT.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6c51739f78dbf0da98bdb1e58bbd57f4d360754 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5NSP}28KKa1~&%gLT2UyX4Ya>&Js@EQeLh= zF8*?UfpP(%Dk0%&Vex8li8=|vNI~gFY58V(`6dO)BuUj4RrL;a#VkdwQZ0+A78a8& zjOvW6+N`bHtvwcb1gs2jo8lI*JRp2sc*ydQxXp2qDVx+OJhcUI<( z%#s5ohfW&c5odx>v%o$+pfMaQtph*ZQ{$ycf zVCZJh0htcU6AT=u85lWaJT@peGPCK`R7`yAujtx!gMo9>6EBHIHnoa`hfM4XUAhFe zN(L?Ak}zhH%yC$F=m@V%mylr5=9aGM#_=p!5*wS2^htEpNN|}joStTsvWbJ`;vyGz z9y1YHp(oFKXBZ@J@esW6n1!EPFik<~OS=CYleAqN4N3;C9X#AJClpvZ_~k6J_eE45 za#_G3%P(NkAh^O`&Z_82%FIVkIvn_fghUzw4)@QqDtWe`^AZcEV56vrfQ3WjF*$3- UcYhu*xpoRFvL#FNa4=W{04H256951J literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/JE.gif b/frontends/dnet-is-application/src/assets/images/flags/JE.gif new file mode 100644 index 0000000000000000000000000000000000000000..e629d8dfab509b57e8f5b70d60eff4e07bca7707 GIT binary patch literal 937 zcmYjQZAepL6n?g5+nm&T?~vh-PzZ`mVw8%RgB4}AwsGmV#4Rjr6{$#zFq<_(OzZQUU)BubDrlp&p9vmz`=&vT}K&8 zundsikR94WLw9NXH61IVr8q66$x%s{BXq8V7PB-xMKx8_-$x%OsLMbrM8zef#wjS` z@3fv%@_~lxFF~r0b|Hxo;{tv-tO?u zNFp88A&Yz`z%1&gfPGpopC0PpeEHT->PQ>Q%^(!=MD-RYG8z?-Wz+#p;%X-d*z$or ziW+AyC)oss2fz{JvKSApi|uhYSnjMKZ*GNaLCKIUBtV;h5k<<`G|^??Nx>%UCgXlR zO7ohfWsT5lj$)#13hoL>QobPECf1C0y%aM58N`Ine}`k5W0GT5?19T>?gp2HE8qY} zYAuabbAhXQXpSP01=1t%yn#NuZsLZeF%gT?{0nYrw&Lz2Fcr~T6Stc;In?25iCC4%$ zgzP}g+DgC`4^LZoAR}h6iqXG={Ss6d1J#?+mXRB@(WAp~s*;rVk6|R#!Yma(4WbBC zY9H;NFq*DH*Vn2%h?JgSZLn9Q#IbKiUmlt^KrhCTx(b+Z9EA5$Q2+^w!zC zEB5TaQdaMajCP0h{lK(G`jq-jA+;|HZ1WQ)WDQJ~jCi!euLY-MXx$Yq*U26_sk4jk-lVdJR&ydKon{ zSa!0vABhW|Bb&5XqGYpn_;l9R9ZpS~C0aJBCpJpXIc3_viDBYa_DO5BPCg4i%7fhagv`bD2=;)L_bB3Y5o}sXSL06aI>{-U#T*j5lnJ=7Y zJ#&Wj>{-rh*LeMWS+Cy^IDcN~;X~OMFVr$K1lO;ZfBjl}(`MzeGKs5~^^YId`}NCd z_iiIcN1;D|+*T~t|Nr0j%^QzhJFPx_@;SKQ?)9sHq9TnWNBk=*O;@fAl#=3|IKekE z(l|TYDJ?BPLqpNY$s#z|)5yrsz(C*L-p4QrUMUQ~Sc*zV)Il!+4}6XL!2 z`54ktQ?s(NQc_al;^M-?!vg~Y0|Em4{r&y?{Cs?TJUu-y)!4Y9fs^U+K~_FVEu9X=C#R*9nM^}} zJzjo>SC~s^!G?uP&(C)5VM!`-aX2?a%PwZmkHVuo3!J+@aEKV32w371{KaPBq4r*7 zmo7O^A&nIQ^O$B&dowXfz4K-nNGc_}2^!_Ta@dsYps>g~agM^x zjf)tY#B9$kXmox#$-ydS0mnkY#6#?YA}UuD9=V>CX^dR-BB1a# literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/JO.gif b/frontends/dnet-is-application/src/assets/images/flags/JO.gif new file mode 100644 index 0000000000000000000000000000000000000000..aef7cb9bd1df56df55e5924c7434dbc1fd26d399 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5(_5C-@LQ;=+Qe5A6i*kzyJ90>GS7Lo;|yE zqlby|9@dIs$VCVeJOtDM}{xjD^ua$D@?zsWyfbAaDkzku}t zZWG+?%k3i!{fGAl4;?g{VCvrB7BxMRFN;CXNZZlX zE+#%QF(ocFBS}J9L{UXHILu#CTEsbs)5VJ;BO|p^mo+QETa1}uv#$IyA?7S|qevEp za~Uc73iD4gFw`?JoML4?$;o++m$!q9>%5TAc?pTL5)xg)g69x6;9Lko+$78X~`Og{z$JooW=8xU~F)%9g$mu-syByH;0lk#ODU&>HT+n%oiuJZCu7j4CG+!vA~PGGlmo{e<`w-i zCdm(e+`Mq`go0x$kF3y+=lt_cQx0(`BqTB^ItnOxIH&~p%bKNfNmw{AGB&etiJ269 za9AK~p1vbO&~VZ5eg)?i4aP}F+7DP{ZqPAobYkU^wko@`K=CmvcVqOb2^xh;t=&?V T6%QPYl-;^T*^;GsI2fz}fUP6n literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/JP.gif b/frontends/dnet-is-application/src/assets/images/flags/JP.gif new file mode 100644 index 0000000000000000000000000000000000000000..b645bc8d8de3414bd505af83d13a4faaaea35db9 GIT binary patch literal 596 zcmZ?wbhEHb6k_0Ec*Xz%|AFA&|EpK79zS;c%GImKjvqgG=+LIko3C8G^8ER;2M_Mw zy?f{C)hlPuo;je%uwRkkpfdAeRn{XK>?d`3&ln0^vXHo9BYVS9@xGV#BR~B&F?QeH zzTPj#d|Z?3ga*$!Ly^OVVy9AqURI}nX)pfPSMz;h!;RMRgHntKBpCNgFdi|Ixox9% z+g9zVm+6Z@t9Ox3$8!_DPHZ|}m3OwG^h9I%g9X!mZCibH&gAdg*L~c-*vp( zKYjp(zkmDo?bD}EA3uJ4_wL=BH*a3Qe*NmztCufdK7aoF>C>lAo;-Q@@Zqgnw{G0H zaqZf*D_5>ux^(Hng$w7;pFel*+*zRi&zw1R>eTV$$B!I2vVZ^nJ$v@--o1P0&Yhb! zZQ8J5!}8_J=gyrwWy+N9?(X{fdSIY}Lze)d_>+Z^fuWc|2c!-ZCk*Tx8yK3JTUuL+ zit^bQ{iEVjQW9b!13cZEiVCv)yu+PMjjdy&g1i}hnhJBmJc2D0wKV0`Lwp&%f|~N; zm;!CIW%-2_bgbMx0=S!4dZJA11cXE-^o-p7BjTIfyt!BnZ3RWdr3}=3LYY&W*2W|` zX~>C5N;_HxMf0&Y1@a_LP^#Nf!MKEFB5UHgHG)q#gk~t2xlPz{P;vH5lUx>631_!6 WD}t7lL@Q<*uk@ zD3E3@lI1K>;;mMfZ#I`s*HtPqHJIt4Rc&j~;$qh86}UD{vBSb;S%lYuSc4wN!1XEd z8}d?T<>yZ=n|E@VVuL~Ytb)P?m2I1PE9TcXuIyNFYB@uW0BgReM76qNj*do|v0lBE zNr$7wB-hy0nf*JavK9zA&G4N*ecJ5Cgcbeyv(o~OOsNm_^IgoqV8_6)n3Z)aC#MNB z^E5%hJrWXo6co0rsVz`aI%8_O+t6^UfkCu{#AyqQy(T96EG?e7xm|N|y5Q(=-pT2( zz5Nw8w^#oD&jSJy6cz9L`8^5wj%&dDYnXrK96)Ny*EWmL;*V-)GE_mXL6;wG9ml z%1BKuE-aijb?Tx;i>6GO($mw^)z#J6*;!s*o|ToAnwpxJm>3rq7Z4EO@9*#C=H}$& zWNmG2YHDg^WTdaJuc)XfD=RB0DJdZ#At)%w%E}6iQ*hjl5(Gj(@h1x-1H)Vf9gsRu zo?zfO!NABN=v`A9H@vxF@;kkHt~$#iamrGg?;3p<|_$C1G1V?E+B z6RtQ;NO9&-G|xF8z>(74C*z#5!Jz1ftALVy&6fv?21nZYDF7*F*xUz*PKd9T%(ZpPDntmpgL&rasO zIalP)0*PEN+EMMYW84f8k?^k9%tjc;=jrD*k z>p>09Q@Xq@@?2*O1dbRA9W#^YQ4_psBYVS9@szFnR6WW0hSFzU)R&tpuCh{o?5qFC zPk+9-;s!glOWyjM9W9RB*O`8was%II2Yk#8e32dSJTu^QtlQgy@Hd6wAIjq%6hwZhP5E4t^1e3pU2W>O zrmO?<4EyC64l1&q(&9a&#d}6i;JA^*NlS(M?%LM_Ev^SyypMId6Xp0h)$2);=c9O! zuNnR?Qhh#W1iVi3d!HHbwLarrS^zK-!I3#ikQM@pKUo+V7-lf&fV6?~1OvxO21X7U zj|~crGUgK&Ft(&$TvJS%(i4|Ou2cPeNqQ2 zi$ICP#24ODRyizoJCjeI>)~cq&`5Z2uvOWz;0#C14EKp$EMiU#3k(vDEU`%6#qnkF za-K!P{1!e30vs7Sy|WJ_2%cEpJITpFMIvLu!Gmq${YNr(DsAu+QM6*3`9t7gLz~E? zGZh<|TpvtRw9WZoAkuu4OKQrdu!);o9tg^t7X8t<)DpPFD{Du>!b2*Z2d}d+Gci~L E0IVD<1^@s6 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/KH.gif b/frontends/dnet-is-application/src/assets/images/flags/KH.gif new file mode 100644 index 0000000000000000000000000000000000000000..9149a67f74f7410d65184c022a0e36c5b0781286 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5pC29F{TDtcQO*UxjUNSY`ZDg`a z&)}_#+t;AbCw_sC`~p6PN4^M+co3WLB{TbILE(#)t3Geua)M9zn7Q?V{K7kZ6VA7F zzFN5W^X9EGBJ*@r);L(~4)i(^5pXm*_>3UebRW0vqQZ0RY}fE`&t&IFQe~B8l9Htwnwzw=S88hZSz8}8G@M~>vB=4Jr?1~RE9==_Ui%`Wu0};)OwYKI zmv@DMcLf7SCbPgQR>3u_LMu5%SMf@26p-C2p|Vj{bFZTAA$jdBl8SB8%6&>YGxe>{ zm^xh0GG1a}wcf({u$lc1C*PZHL3ga2*SQ6p@sGS85d9z^>Q;E-t*qiFSN5#`@#NOo zHFIBIKKcLE!+Qs}otfElZtlc~TUTFOv-sV?9ltJ}I@45gV`|s$wTnJ&UUk;P;$oQF znY8E&4dv(c6<@enoN=*yk{WeZS>k_A@;M>iOIpe|bkvutDjqb@Ib~{a*4*%trO8z* zvs-pn&)pmzxY#{)clsCLb== zNpXKOQvT;;{K!iEpO?NgAx)~6cp|n>3_AedT4F&FDT$=K)^LWKVam7 zBYBj-9s-I#Sr{1@7BJ|5q(OOtf#Wm-BZrK~1_eh2hiMTHH@TjgsA%6J;rVHamsq1# z!jlgdo!fhaH6wO(I5HpSlVf5xnBl;9h>>x+L83v!g2rYJewJ66DxDLTSxmjPW1~vC zu%c@x3#X3DOF?y;%x4Dzo!fgC`*pMZ6tv(BTHsT9Y=U9%Gaf1Hc|3m~DjNtbvMIk; z^HPbeXSzW)ALFad?h9C0SvfLR97uF#=NH$hIkiEd@qn~`)EbSCj4m94DsD3z5*Hui fY4qy&!x6;NDXbN-C1$1&tCz4ETe36{2ZJ>LRD~`P literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/KI.gif b/frontends/dnet-is-application/src/assets/images/flags/KI.gif new file mode 100644 index 0000000000000000000000000000000000000000..a805123d992cd66fccca40c91c9e6a7745da1735 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5sse`Ph7EW&!vFa_QL8pQx+U;=vrA+IiYLP+W9MvGi6|_y7zkBlB&An3=Z{BsXv~gxz|H55I zZaPM`dL?#OcP>6~=I-^IN6%bS+&61Z*5}V*}=K4l;Q1(x`X*5J7O7cH<=!;ci-;9xYdGrzrXwed)^&JtcNuj4lA*~ z%?Ljx%6d?e>$IB04L6HB{*HGH)qdt>oyttBWnidbU^vdl+sVasK}6uVh|mp5iE|PX z69fhC$jLrXR6MVsFiTSMs=E3!ZS9x(`b!iQZ|dux($#ruYWl&-YMqwWT?>ozCMKWl z?7liV?JzR>;pX<;&Fzl8-D78`hfYpEy}S-vTmSO)ed^}+%G2|OhsQ5}|K9-tzXAf@ z`S^VF^ZOAP_&qT2Ye2x;fPf2bZXd(LFZua>jgNa88Tl*+@!O=MViHy=^RUQfb=p8E> zC#wf2H>TZTc+}#_GfmxRR!U{?bN&`w#w2W6O``L0ekIQ?mRl=L8ZON> z4PRg}(a5cTp+`R(r^tnqLi5d{rtv5$wR9=CPvH70$Z<+|p+&_i5zj?OJf`^15{lJQ zo^YIrnMEk%Kp~6g1aSvG5r+-V3wkB&s^%@Mk+Gm)#4@8<7Nx69-o}W6J}h{a)re8gie814mWYX! zh-gUk*NU3<(px@&C5U5(E=qMr!XF6|t4g6Caf~2N0 z$7?njU^>9Yz)Ua#hQYLOIVM(R@oILM#99dECdL~&65V9)=Ccc z(39a59o2b5#YU`6BD4=aXoo9Dbcr5Xfe4>#j_Q%g8mfoD_G>IM!m24dfP$k!3?Ny< zk1{A_Z&Hlv3>X4pZ)om-+xa)tCsHqiBP+rYSq5t2D;eTC!_ZuyS+k#Jp@ddd+6F}kLyADDD%)gh( zA2h1cR29eHhkF&w6bNs1Xk8fD4(cD`J}OniG)azU6Zl(kZ5-bpx-r~k62B!nsD7U6 zV#LqooDC+LrwUDyBpj3W$u$O@A}OA;#%X~`s})R@**IkZ%gc8jn+L?hX>g}_^+Hc= zYULK)%U8`@C(VV@)(peUc`5oST2TJBysSSVk?{qDnSOjQCm#Y7Oi$;77c62g9ItFK~j;eou<-7 z2sSZ^*_N#hvM7W_8nC6I1Z=Pmr4KdPnKg)5ZKe2NLQj@3<-S<38M( zd(QdJcP{tnv2gR@m;woZ15`#dN|(k`6rr^{lrE!mP7mytQlq4wQr4EK?=%g4ETs=n zV84E{jNA!|50dmO>EnU?qkLvrUs_h&1C*Jbv2#i~XDt0D8TH1}vgBT)_*u!A47l|q zJtJ)_64g;^T#pZsUK&wTqhPXPRPa0grl#}8Y+FR~Qb#hdBMClinh9$rH|PyyC0bPODH zP=Wx_4QJSvnMcr~GicJ^-qp_8LGZ;5==nty|1w#fZS)fYAu22w6~7YYM9;z`Ewe937_ZIC4p+6~0|> z0zcRL<((-N+K^B;;cCF85J91IvYzbLl+q)ugQ{#EY zk9)Ihir7MsLqY~$HN5&_=)>ZnaH3g!C52B`3gv1Nwo{s=<{$E);%-HGZ=$m58yu6g zj@g%PQ={4em@Vh8_=6Rw30{1AY~Rb_Otkgx=a;p{f%x^-yQ8e`WT^9c+m&omIkMhU zz{S16+Hgz%X2U$~sqXxvYM9>HSM}y;#p<}#_9-($e}%e(3zxN?y?SWnw(avN%~+4^ z36J}GepOqZt0{;2$~pS3`}y}zeP6S1Upth4eDBBdP^72DOy2wH{0ouU3pjdV;cBpL J#P7$Ee*y1)E*k&< literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/KO.gif b/frontends/dnet-is-application/src/assets/images/flags/KO.gif new file mode 100644 index 0000000000000000000000000000000000000000..3c194e8b40a1e426935f226b3a400be98e7f2f17 GIT binary patch literal 311 zcmZ?wbh9u|6k_0ExXJ(lGZ`2bF)~i)WS_>xF_DLRjtKt*F~M#zu|@I{?Ml*ZN=nPL zm76s*R$A+q+8Y%+7#F)+7Ft_x^tQ=$cHR=|k{TO(I4S8sR@RZ;0@tdlQ!6@54$o6L zzC`idO4-NT1z+yw{dSV||5=9rml^*5{|~j3N|fSH78a0EIv@h%CkD2V0}TZpI#R98 z4owF=WI8#IvlZ`5FymWZXmHYiXPQ$(<4TqJj4Ue_JMgpf@^xOZ+`-%}kZGb+sgcJb gTV10fSkBw5tRz*=$Rr>y#NX${Eygr;sw0Cn0GC2aVE_OC literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/KP.gif b/frontends/dnet-is-application/src/assets/images/flags/KP.gif new file mode 100644 index 0000000000000000000000000000000000000000..ede846a82911697e1d61486345f6d359591d06b3 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|57u6h}w)FOfeVdynFRJgpv1a$}jr(tI+`p`}eMNa^ zx@X9W%B~F!6ZiDaJ2iLhy)B2UV=`EU8<}|mI3-%SB$`E)`((BH)J*2csO2bVms+~5 zvGG`J<~Z3ie5ZHBPFs)3K9TD~lMjR>?h8xa8=ba0xBNJ(cq@lw8?Stapi-Zr(Hv!y zsp`h{rmm~?tvjtf=A1rv?&;|0%@h zV?@C3n2^(XnHS0mZZy^Y-MHoqC*xT@)>FJ3SHyU4ON!i6k$$4CcurORysE-2UG;aS z`gcwAKUtd|G12|%WOd5aV3UE?SyRJHmL^xN%zk+|{qS_WWoPxk$?lJj+f#R^SKe;# zd_Dh%`u__H_!QvtH!|>Bu;062pV$80ze59mh6cRMO!?N`@q60j+C;Mqm z&Km*(4`pTVs4KtFQhTkVeO^<2xw7IxeVwm%RzIBV{`qGrIkF>hF)Np_vez7sgG_9^ zjWR9~3mOugTKS~RDt<6La_Zn=>YZ@XcxlHJ-H=r=CyP{gC##pTNM&6)d3mY-j5R+F z8gWciax1#VA+lk)|5B&PKWvzmu=32dD7iI5P{Z@QfLFZ?XQRjoZYhh3J98wJ4JOU? zooN#JNTnlSk!$(A6`I8!3nuHwED-3tlsaLCYVj-$Pa(EW2WBn-9t#JBgG}rKN;Vk* i4UH^~wj~cvY-~Q>FK(Q5g5wcWN53drvNR6|gEauWMMJUx literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/KR.gif b/frontends/dnet-is-application/src/assets/images/flags/KR.gif new file mode 100644 index 0000000000000000000000000000000000000000..fb33719cd051ff8199c1f05adddafc608edb7f9c GIT binary patch literal 1004 zcmZ?wbhEHb6k_0E_|5mtMJgW&MWrN009R{rl(j>sO15i(bBb@%;I- z2M_L_J$q*I=jUDxicC+ZBpR#t zu}fMNy=e$~bWTRplV#q_OH0nO$(g6!I3T#VSxV0>g2P9k!9#?PCF6=jfCEDhzw3+u z!5hvexCA1_BrFanG&PAkPgA&|B+xNQx6CJ|-~&Tb3!D0}l1xFT2ZEZlEK64;H6Ci= zk_>q9QJJmBp}l~CmFuz#bDO-!s}F?_kM=kSMbWql_Di+VDw;amn;bNArg_$lGu`Bwx-X zEiBLzNd8FzzX8pL0U!c!&{}jO{1E&rosaiUEaX}Fjtd(7P^ch;0dZK;j{v)bFd{!1 zmPAKA?Q(Mz70iTC^Z}RzUIFWN<+Y9oH~B}pS_kJYd1g1EY3&7F2+x7f5>tsXp(|Fd zxKIgfDSDW3Q_h2UdSe^BX0fR1myRWwsFze&eu2~>IV9%d%Kb3&n0SB4x*Y_M8seOo z0IU!$Qd5G2jteFP@U83J5iX3#=^Gc_9Wk+~QNo#AlsBNc18%6-4z6fcaWx+S+N+M1 zl|-A+njza&8Ca1mLS8}cbtO!$8T6P+qD(Hwq|hWV4}_NmH=Q8cQeP!TpIav-9Ht0I z;3$NSAAFv4c0etHFg2s--za*fU>F_)Vg6qd-z7dv#3VH7bV?OckPX15M7~7SI7ZZ& z%B8m8_9L>5l%X3y{$8z4)B*b5+?}hc@Qav-@J~^49C{3#QXT3rRvIC^^VCO;KceeA z#Zv{v)JFK3=Fx>=oqLVOeEx5{!;*VRPOopHe>Y#}QBIh++u0ToyF5ldt3(SV%=;t# zPPrvyz0u20vaJ-nlxXnCbuzECE9R=!414=Yr%2t;!G1*aR4<2im;t5P(lXwJ)uuwR zUV#_Hnq*jr?~%I_tn+iHfG{Ymq?;NkQk6gG|2 zzG(NRm0n(3FB6X!ZM-k@K>3Ngi)kWQeDQs}s(QR`?AXoBa}yt}`!lj`&CgDLdX|&T H7*78MBQ*oD literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/KY.gif b/frontends/dnet-is-application/src/assets/images/flags/KY.gif new file mode 100644 index 0000000000000000000000000000000000000000..04941c945b6bd4a5d31b9b19cd3ec591e913ffd4 GIT binary patch literal 1005 zcmZ?wbhEHb6k_0E_|5q#NdC^%TaT{apA?Z) zom97V^{x|pF2sA5Ets{eFu5Z;zF}tX7CVEC_L>z_x;GSLH`p3x1$)*cM|C?{7Q}>f zTFZtVq4*CQ{wJW?e0+J z?NaCARN?R06yVtu?AsRN+vev{Yj2ej9nv2W*cIZ}923@;5IHF^YLbU@ZiruAUbSGmv+)6Miv~m0 z^YOmd3lev>))slV9`0z_SXc;*M{s1O8bu2hILpNNroiOX{HVTGIl5#oSmUkcBf_sqkE^Ao&XE)Bn9^bZVj81Ju5CUdx{#Q+q{|S z{HXJQu0zJ22_7w7(~VOP6%-hywj5Bhh&ysZu!XZrROiGT4aKFMg3TLv*;p8?0Vkm) A^Z)<= literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/KZ.gif b/frontends/dnet-is-application/src/assets/images/flags/KZ.gif new file mode 100644 index 0000000000000000000000000000000000000000..8ff39eb698695c2b78891d4eeb4b2f7f64e83821 GIT binary patch literal 1004 zcmZ?wbhEHb6k_0E_|5UFVoP&aif0VC_1?-hGj? z>n!i&YrMVZczezYOuZp7`<}#2=&yUHzy6(C$4-r|J*FE!nQr=|J>ig6?|#EYw{#~S(VKGIVEQSenP)7PKeSl+ z&}8l<i?9 z%J=Yp&u#BKx4-k)^2Yzjf1ll-0uTT7+w(2(@b7>FKLZZ_4A}iK{NT5^W51$yJWo0K zH}&ZEth4_)yH1EsIHNu9vT5HAm-UZbHazq@{43z-zo>&Bv(NmJn0Sn*XSe>!>!F9= z#2k1Yz4u}Kk(crlwrbAU>$C51;)&O?)3%2kd?eDhPGZ73$^JE&ryeUzT;a9zg872Y z4x3Jh#Uxubb%ZQfUUvFY!};r>TXx4BJl=Tarc_*_>(Z6QXV0l;W<>7VR(j&7_1vj; z3uai&Y7Jc1pSydaQ+Y_-s+|z%Y|R z2c!>_Cm1+RGB9$;cx+H`wC*-~Q81~cm4%gA$YF)SqBhaSJSNY~MMsXYvN7?P%y{7F zHbI%`vqID%mJ@C48Gj~pE_mqLuVl}%PqT%!vr{KZEq2nDR==r=P6Zq-mtUOfGUz`O zaVR8{cd4OE(G~#>cR^9^1f{tzi#_}$J>ts_cqne*Td2Xuwc_FD<-HO%g*6uf9GxD_ za|saOi8#P^LBY9a&z*uorj`SiP4hS=csR05H;G-g#X)dU^8xEV4jGA`iEaYQHc3k~ P4l*_$yw1kV#9$2oB_me> literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/LA.gif b/frontends/dnet-is-application/src/assets/images/flags/LA.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c94b9bee1b8071909b6335cc8eded67a179555f GIT binary patch literal 893 zcmYjQK}Zx)82)A%T`@CzPnKagrNJSZ-@i7Tsh2-(AGn@UKHbQmPaRV1ve zwh-+oVvwcaK_R2V=FXS|p$ifnB(x-U)SzG?b(damW|ex(;r;*n-uHk1_rIyTSbMIb zH5Xa<4P3T}Q!iIV%YdtPV)fHbo_%Q8A}05fS(yW(rNP%SwX+p>o*Yi{f(+4w@aQA(3U~voqcZAWR5eH2#cDKP6Ve> zXH(E3A~EHR#M7Ds@R-G7vY*+O*={4_h1pjy4UB+cJ}x|ti1jAkKWyE83KBEKNmvBZ zL7iMp3EUc*ObFmz(|S}wjY#rN(4J16ZYcah&1;-z@O8ii`R0qLl1^`YKo{T3w$|uw zfGR$)cA0fWSu157$hjp%xN8PIrjw{(D>|bJ1HwRLg%Z;V-p=8dF=L%%u$dxkUB#dp zevmNN*$LSRYH9{&I~>KGX&8p<;F$jx!xqCA2Ax4+lEh>%%54BP7#s{SBaN7py35;w z%MW!MDMQx*$3d;@XaKZ>xl5mA>Zf`=$4{c-`K*aMm$DiUjO&RC?g&&r`Nkam~dz$MmQ$!k^(AC5S{xhb6Q~6d_T-Du}#Vv zjb46o+e$%7ISrndow1j8>t(e{IgbXpPMUh3p+Trxs+Yn&(SY*V@@4!J){GVilH{Hl ztM0crihWBn8w-8er_Pp#s)E`B+mX_$;IFp+`}t|bSL6b`e{`ZIvtT{^u1_eubT^=r jqWVyN-ALuVrgrzk%G>skdsa}#j~~sbT$(Ki265ppNUs6V literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/LB.gif b/frontends/dnet-is-application/src/assets/images/flags/LB.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe9916c434588c2f9ae63a556ef546a2bfe95aba GIT binary patch literal 1006 zcmeH`-A_^h0L3pN3aQ(jYXzYb)Rm%}=!RnE9H#hD8_e>nT#L$uu7_Oa(if%BTvj&q z!L?k5540uC+)PY15ls^>7rX-{Q-gI;QbM62@_Ez#gWfw2=k2`wemg}aTz0k~8i)kk zz)>&^gW~9#B*sWmva^uuuc!)Mxw@p93GD8D(`fauwyWbYyr9N{m_cutpPSbk4AUx= z9}B{UrKyD(+i$yk`qQXtY!O;asZFr_LVKj$O}%$p-ZY3L&E*d+7Syp*YA9I(`krGq zx0-UJG4I{*;MUfr$@E>LfyO_|B=;|mwb!mqyw?p&X654$0JH)CjK}K;1c*S;kVsHO z#Bx-W5d?K02!S9%CYxhpjZ|uDbTmq*>uGT?jW$4`APMnODiuvlT~1E6r=^W1Bsf{D zDF#E$WcDQ{n%QhaCQHF&dh_%3+1c}1nSL(UoXhC%N~M2iXB~#MD%FHcWHeMGxHW^|iHNFc=5~{C>aB=kt2K9*<{# zf8XVDIh{_2!(q4EZ8qEX_O{h(wOA}>vw3xO)o3*8^?C$Bv|23;!oQ4>F|>at2N95iHV%T!0^XreqW}t?A4&#W;MpqVYop;TTTDxii}@8Vc`8s+QL@ Qt8SI_#E0FaMiPOXKef1arA2GgQ)iYIt;tNEU0JpvEoEv%SVLlbcVpd-n#v7jB`fM{w=~plDJ@>sShuyb zcxip@rn;Jq4RxEF8a6gHZ0Km)-cYx?uV+tR&(7ZN9g`>SPf0E_HY|2>Z1(dl&(2yL z8`G1MJ)@?2O-M-Xgb5owJ%bGl3@a)d%`KgbOpG}=IhdIlI62wn7NsB|IYdUJQZ+anV*)LtPnp}bA7d!mzRKm04pmiFlNCqJWAjU0mYvzj0_C( z8FWA@KzV|J<1_;!hm6Mt1xGRMx|9TEB~LD)yqGf=8jo;EG-~H1L>9L(O=K!h&^S=o z;x*lnDfNJ(v62rzUp+%?hoOrTyI~BA)XZR|79lpaUq3Q0E1VNEQqbWzQ?%$zixl67 zidRQY_K4`q8`uc0c*fHvs~hm4b4uoUMqN2GmrezPv(pvyi(Xtja$@2V8#R-d#!W5? zvK%G?S2(wHOi=V_dJ{6?@sq{_nr1?K1Pw9;mU?v<^WL00U*jon z%tbc-01Y-V(o<3A4T`q9Z(o!Fo7nd#+}spAOadQ(JECl8ezWIq{hXaW~v9lS~M13WQ~;FgtJYE^VCdwOzoqbEu# zR}j57T$~WHu6>RK)SkH)p0*WN;NsYYp^C1om(KR_`H`A739+{mU&s7{DB|p27}Wwn literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/LK.gif b/frontends/dnet-is-application/src/assets/images/flags/LK.gif new file mode 100644 index 0000000000000000000000000000000000000000..ceb8ea72e5de2b79944837560490545a0cae85a9 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5v%N07%E_;2p_Np57^K8`K5X=u2!emp|iUdL!0tg%s-^6UFtiyjxt%c4){hG|^gWu6rTO zXCWuUTz!pI76z-$4X;NAPE=DoX=S>}!t}6*(?K_}XDJ#!VQ(K^;v%3PH7|C+!5 z86O{D6oaFBlt2#w#h)yU3=E4HbU+fIJi)+mnt_o+#$$uRK`s$LlgPkFJhGOBAI_Xi ze$FS_$i&9Oc-h%)u6u*T%ZHEEgf&c=_;r4KOl6zwk$-5(hX&^^NvC-%Y7Go2-aV>) zCn^LB9XljU>diQF3=X!7NqCCIY9=3QnyBR`kSL^~$keZ+-)GWQ#O%_>D{J>=r^GT`CzNe*lrSp|iGDU%fak{_rv jIjICFHnMPCcp=o{BJDe0q|{1f1^-e_wq$7@4hCxgeo!Ql literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/LR.gif b/frontends/dnet-is-application/src/assets/images/flags/LR.gif new file mode 100644 index 0000000000000000000000000000000000000000..47c27dbaba9e675b7c85dd090f484c2a91807003 GIT binary patch literal 917 zcmYjQT}TvB7(FwNt1OFc_ioGLUnZ-BEF?*xC4wnti^^sa68o@QqGF4UCJcgP*&-5x zVnYfMNSJ6Q6lq}iu(&&5kblra4-y&@yGbA+q_}XqGi%Ug9`5&XzVn@PX6EX(s^SvA z4Ho~31MPE?=(3oDad(Y6@>wl#Nn%i~Z^+D6 zyE+#ou`=EssBurkKg_9in~e;1wa>kI{Ux67w3veG%?4+#Dv31{y{k*6n4AwB!Dz#W$u-(i$NSb3f(*%k@M;B^0X_noHepdign;nwSjX+*g*)!~Z751} zW(UFxAoHBbC9GoGOpHm+()%9qG=?-Qx3t<#_@CB@ug9X)as%=z8^=UjMQ>Dy`HUsqYRBi3CHYL zI+`N%h{Sl#GN%O&jPHl}9BhZOI^D}2kF5}-kkjDR`3vcV9kHS+MK1@qPMQd1cmNSC z;pNPsq(k|;VsYbG^}AdRr*oa_p7K!tP)f3-+J1=U7AIlPk|JW?7eqbISWIwmx%KL01SbtDmOH58qGUNU`2> azc6q2EzdNblin`R-v!L!C&^YTF8>99)eiIk literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/LS.gif b/frontends/dnet-is-application/src/assets/images/flags/LS.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3d6715e8071783eb014288b9bf4291a33985335 GIT binary patch literal 925 zcmYLIU1(ED7(FRhd#e%ZObsDbiQ;3`TWw3*^+9c^8q*rvA|jXF8=BVCpEl~<-bI$$ zM*J645bNKA4-u-SP^Ab$kf6;)mZCoFgAW(m?3R+0P(&}gT@!b9rWJM`hL3N~obP<+ zo7uIeskSai;Kbj6^N>FA?7q`?)t;SB-2FA)uNMBY<1Z~Kx@~&aUfmjN?;EqsvG)Fi zbh6!gJ1+IL+n?=FG~wKN-~OCS+|mpG7UHig>2lTdoW0>d%zB$p`RR}P#PgWbchjEB z#iMHBt1X@1wxKm<{gzM#l{)sy%FWq%5Cgyx8wgS40YlNkk#{R;%RGbsX#V1}y>N8^LAZ|XhSx+JNp_-E zM??qZ$R6<0NMXS$^p5}($Ra7k{l6Gy89p*(xeu(?%_3kF+-Rg3${8{ujf{Kot|%QE zKq?0!{Kphf4w?~?jtG6`_hRl35vtLwkLMr3zZGV7VZJV92$QX#%}Kx!9!QxcS>)LP z$AUJF|6NVK9x_R@;16gs`5{J{xtueBso{LNNiu|E?2tQ@qIr@vU_=1d;^g?_(A;dA zvKG-xDQ{f?;X?x+>eU{c$o4fYv_6cSNxu=C;U~jFb3oKu_m3o?s1Td@6UFjrY?N2; z9({1GY`Nq?aCFK+XoXWQ)fyU>m$>{N!h<_5mO4Fa1EV+oJilz!+Omm*C!>&E>jSav zpMrZKHywPSCAUk1CH}FpNYQKAxpe>aic4QI`=j!O`lNRAam!%MotgOQvhJdihAVw* QuB3|^M?z0LD`foeAOAKpv;Y7A literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/LT.gif b/frontends/dnet-is-application/src/assets/images/flags/LT.gif new file mode 100644 index 0000000000000000000000000000000000000000..f710d581a95b6b6f032d0ed3bf925ea68e5ba6b3 GIT binary patch literal 631 zcmb`E+e=dc9LK+BJ7?S3**Vi~uFT9$%UjOd^4@itms0SdmmUR23O$5P>M=BuB<4iL zf-VvXA&6;4gwac&T_A!Cbnc#zQf3;cn{L0fzo8GGw-0<@zBP5#rDaVC5V6q;uLph~ zd_H)+aC;C8V8M-d(};vs+Yz2(QY@+^GDf#`KbIIHfubyJ%ZPZ2DAtxRPjT}k&5?GF zL^p|kiuaHdB)ym7K5cUCw5!}ftb=4%N#P*r3TfNP&_?>^byeyr%)ek-Mal{imyx`J zq#w}wpxA*j3e^q_g!mok3Az}R>#&9dYltse6pI#x;%`D}fGhT(+|QNx6_!~Hx-^3> zVZf;#aPoalO<#|$x5wag8g6&%I&X?EaxrPaa|_1vFqV(ee2iEyoQ0ss1T+YU2ukn^ zSl|)iG+~7%!l^gq@-22(c0Nqezl+xCGCTUkA}2y z@jAUB!T5BNz|^Ysmo%N(|6Lwy;I zk8AJQhP&T(Nu#y*GuPC{oQso}gA?OvGd;;u*Tb^(J9i738%OHjx7ib|mp(t?SycQ5 D6aU=Y literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/LU.gif b/frontends/dnet-is-application/src/assets/images/flags/LU.gif new file mode 100644 index 0000000000000000000000000000000000000000..a59189bb268c39efa7bc673e85d7c52b8d822e65 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5W?)NJ|Oc~`GoJ$~%?iIZoK9Y6i;`|qdEUfsBP z_r%FFd-omu@$=8iS8t!cczyNS&C6G=J7w>8D>&?$cfd7ozk9(!@1g^Nm1hDfPli+- z3obtxQgJY$<3@bjmB^Z7F^wnva+Z6g%}Z&&5Z`b#yliuD!K%U;&kCkJN~qr(Q?)g{ z{bc^cYbnhKN~Yb-?mpGH>|?{y_hmC~C01`NopQNj_2-sluWRSs?^^q%b=m8z);&di z$2(WOYnXFw^5!r7YhF&@`eov}7iZ63K7R7-&)@$(effUn>ec7ZpPgY~sApg}!^n7! znfVMG+gVP|YrMQ?`S{N8@!b#MQ~zgWy-Z5_o11%f-@c2751-k$@AlcV=MNovaqHII3m5)<{P^|7 ziw9S({Qdax)3aw+PM!My<;%xs&whOW{_o$vKY#xG`t|GQ&!6AEef#w3)4O-?UcGwt z^y$+lPo6w{`0&P!8`rK~yL9Q&g$ozXojZ5-?AbGC&YS|8@c%zJGDiv0LO}5+3nK%= z3(b37g+(%5^bB4{% zOR79lrc4`qW;(Z@71s`2;B)iQ(KEBmb6JEqR5C8ivnhXdI8Ou$+)3VU~9$Vd0?`jz&d;h#dkBvEUAg=G z{PmBw9yRfpHS=4v2v{}?Shfq>bcouuirV(cxc14qcFDR-RPg9laGR{;)vf5>rRX+6 z-Di@fU%$5hLc_=@dO>;0cBN`gOD*GTbUa)1eap05>-D@>*`?04ik)X2*KQoR&N;K! zEVR=!c!O*9G@F=-R*{o!qL;d+&v#B)U?~kmV;2gg# ztYV5=(t((UebIFXVjK3yHtdeBJrLKpH@1FPbnW)&nuP(mdy|`wW_ImJZrq;Ka44&D zYjVSpobID}y@w0?PL@tST{C0ntfhPBt-QG7;I+NSo}In6bIF=tKY#uF@$<*`AK$-y zfA{v?%NH-7J$?4z{)4Mmu3ou(X$MSc+&A8<+NlYt6auH=Jsv@RwKSU z4GUbDB~6$lBRY(qA8uh~Nm3~Yc+xaoP>w|@GTDh&Se7l}!VSfRPScGP%{ZPsUgRpr zsQ&JOKEt94?i3qcFi;^x-&)K zqpL!vszt({85b2iMEH^qq)hzuq{D%SU)gU>g_>_WPw*@W!5@al7^PKAI~aTBX)j z3xli{1R1ot7__*UbbA_iy4x)YvzY2<*6Zc8Jj!a4pHZEQ+p0LnIbrtGgPrDtd#z2h zYWKBn_w`+$;Q_r_2~g?(*o9{ z2CPX7SeY8IBGqk5Wca%5xGhC-n~Ne>WT)(?NZneIv8y_5Yem-XTBCN?lpW=uz@a5j z{K>+|z>vV81F{4ZCk*U!8yK3JTUuLKSfm|dL(Rmvm^g(bHLSgwSj4TO!fd2?nA!Oy zlq@{_n*{YD;@#u~SlReQp&b=qMWr_~gsc7XY?jDfw+NfTX_rgIb3LW7)g*}8=k aS!%gVSA|T{c$l(=;o`vwuFj1N4AubdL7OT7 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MA.gif b/frontends/dnet-is-application/src/assets/images/flags/MA.gif new file mode 100644 index 0000000000000000000000000000000000000000..8db59084e60e58005370febb28eb1869e05b7111 GIT binary patch literal 1139 zcmb7DYfqbH7`~q8c@L%Vawv3AR#*#kI0p!fG1y>ZV}pR>Ai~0oUx;E5&5{j_s9!it z1SGmFQr$EO*Ouz!L3_Jja)aVs3C}0ejXr!;~%ybtX>F| zW_{SK0`p2t1!G`0#^aSw_A5u!m~AtN>nM6R^s1Buqua zn9BE_VE41hqfFe1!F>bfPe`K&=|mEnjlr4*n>@UfY*S_haT9n2?1)$wF)HB?9r})u zzsrIiXW_R5+}?|cT))9oOeEk*AnX#h7 zCL>a}JRhDt<>|H%#KV}IaSp;Ppz{>VJYDDH&2nBr+@j3Q^A3); zGrB4Br@}T9&4ew2j)*WRFe6}&VuirUaTbm(Q!L0g$+H;_lLXVUOhV>CC-MJG@8@nfZasVY7?Hy5mg>b#kqu|9Wz(%3apk@=|o}r@B*@Q(8+5 zFMg3&Indeqa%|DHqYX+!b;$Q6-xhw8f1_Ic!tSykuy)@wTSpjmOv1GMjc4jHOgZ-8}nCb9~V)?bxmJH3N^n n3_cfgr@=S&oVNSI{8vr>+|qX){zuGNUyB;cs?|S(5FGgzW?y>X literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MC.gif b/frontends/dnet-is-application/src/assets/images/flags/MC.gif new file mode 100644 index 0000000000000000000000000000000000000000..8793e789c705cec8afea428856449cb8992f4637 GIT binary patch literal 1005 zcmeH`+e=z;0LOn$&7oKs8p0n#b`7$3~OQ7LZ?sDXgVg-&SF_uEC-uyWV7cO3|B#cF+bnU;b4V@ zZZ7v@UY@tK)L&U?DJu)|cq<&vF^?Cnt_}+Xk=ojgiVBxN5Ua0GG&Z_~LSs$MH$LBa zw>~8joi;RNT3S*P$q%6rZ)@{3H3cP-fLM%obYu`D+}fI!N|RD)96>Ujolyh{AqXZC zMZ3D9GFhUh=eJCj?(aVv7{G^y@Zn+Y@-n)#q*-1zudTVZwy^c}ph~4)T}@!vsZxpC zY;lvxcW{ufT4PpgCX-30)2UP{nM@`UiFiC7i^ZbRXe1H|hr^*zC>RU|0s+6@@ALV* zUa!aFal73vm&@UB*zI1i_ymB|fB;<;D~cK@IS*2cClgZ; z4K96LMd)j0jOK{k?=DTMUS-3@@*=~2)-3mu5PexZ08PX6YyHsYr7SwPk@Qv0e}0&q z%Va-{EjEf?mxx9n7UDUaVY0d1V6=ED_xk-YCtW;3_=879(1>_;PxzEXwDqYp@A<>N*sVGF>>hC( ZqMkgVw9kW~U*+W!2cTqJ0cVkb@DH`eQ_uha literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MD.gif b/frontends/dnet-is-application/src/assets/images/flags/MD.gif new file mode 100644 index 0000000000000000000000000000000000000000..786b52b4bfbd39ebac668d67f7913c0340b5c970 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5iB?ENX_7gNj5XH;KKt2oObJ&{#@GN;lMF6lHO?U@4V9YR{&LYkct z26F_J@}!I=$(t{bG3u7oDp$8#YT&j?%cjf1Z-bG`6x+as9qb03pH0&mq)(4eV8_t@~wQ?Q*u@hXIw{q`2Ab9$$)TuKDwRLu9&M=%i z$9(1t>)ErMhYs;xx+D=5$^GPs;*~4%J9kN6zM}T-o&Ljz7QcQu{r~U(?_a>rp8=H> z>UZvVT)E`-`c2%L6^zRkGM+wRdij*;w>N(8p9Nkx#Cq){@9nb^7Y?bty6?7Prbt1C z$fGMxukZR^I_5RC*E2PWImm;vF`J<|m%XD*eNLBkRi0y-CqqNH;xZf7jqU<}BHaEb z`2S7}e5ft^+EV+gx7Afg)2Dt;pQ3zj$O$}AR9r4Cy+Kj&oxc7iW#ye}YI`&^KAD>C z*U~zot9wvK=eVBUDFcJEMuwM6OwJn{|FEYkB%Ibl=-5)o%r%q1)yu4nyx&8O` zedp=<-{1dVK)@#-pTB{D-~9Z32L}EO2mr<-I6g-S5<)=nCkrD3!%PMpkRDK;VBk2- zz{nxvu|eS=GrNmLhoEZb1bN#HcMg7Tzo^p4ZZl^B!(&fD1>2gG&dur*ReYEXr!*uS zINGNWyyVUWC3e9j-V<4j0t^>2a49FBn(=W{YTsh7DPo*8ADUPhCC#pE$lScFYqsY! zDM=xZg|5x4idhp14=JCWZazbfQ$fYRsY{T{;(>%ya+`!ffs&?{ipK*kAxWW(6BnQI z%rXdnqhlqqqTfMSR)^=tf@Tg;4WBhv3{6h-%QY(Kg*be8$RVWaJ*!}$Gl#%@8@6O= I9u5X;0I>-nOaK4? literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/ME.gif b/frontends/dnet-is-application/src/assets/images/flags/ME.gif new file mode 100644 index 0000000000000000000000000000000000000000..64b76441f69e9a39c0e53c9d80474bffccbc23da GIT binary patch literal 324 zcmZ?wbhEHb6k_0HxXQqAjFImc8~@n=wX;F$$65F$*90A7sWe5usy7 zQpY5OkMRi|&el6yqI<$a{-lZYaZ%xA-S(%WRWHu9I4&u2oQ?k&1K)8ekrTGE=Zdw@ zmg=5#kw3!5e_TxX7`s4kP3SQ}p(7juha5unvfXs}*p5ExzFKs2 zo}t7U<4I1*>#pgjy=GI9^f>g1vn16}X*;(?fyYXB_F}*M^9;SK1Xj5)lxC%~@rVek o@u{*jmd7gaa%)SgYlt`ch6gHfaTtV0I(fPHd=BY^Jt<^d>uV=ZH?EZZ+8jK9q0RFWg%F&+~AhD&?#rLSK4y7!Yu(gYkZ2f2Ij5z%UbI1)2`>= zZ4f%eG->;uPe|-P`=Jo5lckW!ec=7MwzrTL{`u_d< zw{PD*e*F06&6}4mUp{>J@WzcBSFT*Sbm`Lh^XJctI zeEHnDbEiz1(%s!%UtbT5I&d705@d#e;!hSv28O8&Iw1X^Ji)+mih+?s#$$tmqt_HA z(F4rS&rQ?xUXt)qXc>=G;}jK3rYY@yGTOe2VjeQJoslwUQnyull73#sI$&PN#ZRd| zv&^$toUBwF1mrDCX9S#l_83BcWg?3(ZSOkq)Is{cb`$Pm+JU`FR)Khd} zMdIUQeR6gcFAgYPIIrN`C1vPv;ejIym$;Tk!v=>13JRSPhO;IpICBVV1sxG!Y-&E> w)WM>@>A?f$PDyRA0~r?`n-4H|OK2J$a5~5#so}S$;9(*&Tk{59HWmhJ08G<0S^xk5 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MH.gif b/frontends/dnet-is-application/src/assets/images/flags/MH.gif new file mode 100644 index 0000000000000000000000000000000000000000..4c8c8098539aa4948cf80e2c383a69cfaf20be4e GIT binary patch literal 968 zcmYk5Z)jUp7{;G8sflzly{8KoTlDJsA&!8VPU&Vpto1IdB`vipQcBovw{&*3W^uck zVS|5Wz%aX6MrdUQX=hfjWMdm)pq7y}_YRSOB0D6)pG+@Elg@#a;2Gh<3(Be~-30!|A(u`)Jg4B2FKs%hy%itLS7 zHfZ2NYWQG)F3aijvVAn>IlV&H^QqgKJQ=4~hQn9VtEVd|xqqnKbp)c_nOq za2`UT#*0V;%^=HsjvbG5?5iVyn9-*-fz&!tjFRbzBDwG9g4ai|=WDnRK}PlXNa@I9 zMd1O;y(!{RoPgHc?t92Ny(5r0AUOj0`4q%hhPdg z25^8IcH@rAeD*l3M}RR{r)-dP91s%Y=v3iTK{)9JIsgr*8~x}qK!73=T>igeC^6h) zC^Gn2r^tL@gvS8fXJ}(6)Q(XQ8`|2{vI6Y^8i8hkHjsKglW+n0f0v1Od_*C|KF)s! z`^(Ua5V+J@okwX1q(1=|dKFFAg~pt280y|QA9pXT&g(*d&GewMwmHv)es1UE!E9)= zO&1CRXDYJj(a5GyyPv7nh84OKs z+uo+&)@|ljpO1;TeRyjBgnQ)8Rp%Fy^p<3Icw}sM?1)cX6SU9g1z&H*q6AyE>^dD+ z7Meay7h8J!hZY=IK49I2LcUdA8dfi+|pdgF8>y gvI>HK{Ag?${3?+%g=Rl79`Z?&F{eFlY{F~*0?|!tE&u=k literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MK.gif b/frontends/dnet-is-application/src/assets/images/flags/MK.gif new file mode 100644 index 0000000000000000000000000000000000000000..a8320ba5380bdb3acc22935eeb4d00d08e055cee GIT binary patch literal 971 zcmYjQTWC~Q6kT)Kaqi>_j^{FQNJE&(hgK89RWw+2$|z;>Fd42vBuKE6kV>>gO(-2& zFpZCDp&t!ClG2Yd6p=xwCVu$(kTJW8xO#Y2r)7 z>xiEd?1>@65CDFbDU3qUz#uarEo{PX3N;5aF&;8iHt|f1( za>|1@C~X3Ks{c9giMy*+gY$1awC0g>rB4*|NG78x&8S7eg#xyXEkLI_&;bhwxKIRB zdPA*MGy`fz#&rox+5u(EI@&)OfhZnU;OZl=URebWB-PML;EH7y11{-2aCuQCHtXKC z8djA!D=M3yxr#DsZ4QwzOtaKbYO_m12PTvUpn#0x`QIloE%ArMtja;!J{f^Dq4c0p zBDYk=f^QM)YUoKJ`v#&EdJM?HoOLrlh%fM8D$!iTNSK8dRUbfW9h?G$f>!7wu-Xx5 z%K)CnwT+|4FI| z)VV+RO?dS*d>`5~7~BqjLlw+|kk39X{sMmpAB%`&kmk3a4pC z!|CCwnlHEYrcN}L*ZT*fUyq*9gB79OQ-jA(dV{O0?2PrKjDmJoRnU%}`oY^&c4KJQ z%!Hm68|yAakHO~;uQ)g~IyYXf)rU9eW1-J}KU>qRVSUYScMM_j^{FQNJE&(hgK89RWw+2$|z;>Fd42vBuKE6kV>>gO(-2& zFpZCDp&t!ClG2Yd6p=xwCVu$(kTJW8xO#Y2r)7 z>xiEd?1>@65CDFbDU3qUz#uarEo{PX3N;5aF&;8iHt|f1( za>|1@C~X3Ks{c9giMy*+gY$1awC0g>rB4*|NG78x&8S7eg#xyXEkLI_&;bhwxKIRB zdPA*MGy`fz#&rox+5u(EI@&)OfhZnU;OZl=URebWB-PML;EH7y11{-2aCuQCHtXKC z8djA!D=M3yxr#DsZ4QwzOtaKbYO_m12PTvUpn#0x`QIloE%ArMtja;!J{f^Dq4c0p zBDYk=f^QM)YUoKJ`v#&EdJM?HoOLrlh%fM8D$!iTNSK8dRUbfW9h?G$f>!7wu-Xx5 z%K)CnwT+|4FI| z)VV+RO?dS*d>`5~7~BqjLlw+|kk39X{sMmpAB%`&kmk3a4pC z!|CCwnlHEYrcN}L*ZT*fUyq*9gB79OQ-jA(dV{O0?2PrKjDmJoRnU%}`oY^&c4KJQ z%!Hm68|yAakHO~;uQ)g~IyYXf)rU9eW1-J}KU>qRVSUYScMM+i<$RrnbEp zh4=%s+En$vs`}Nh!D!cbBTA^Y=?j>A>`XU29x}%=(HXuN6B-O`ZJKVf%VMv+6S@zmXW;MnE7@X6WV4`GQKAfiKOqzuyF--iOb9UFY`K PDFwUtw$2TK7*GBO9cAql literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MM.gif b/frontends/dnet-is-application/src/assets/images/flags/MM.gif new file mode 100644 index 0000000000000000000000000000000000000000..ede84e6faac11a42dd9bfe9d1d797e57641ceccb GIT binary patch literal 919 zcmYjQT}TvB7(FwNt=U#~uWW-_6jsdRMC`*@qGC(VmM{vDZAe%T zC9-5h^dH%eA)=7g!{W~PWa!e14-#4uyG780kl~Hno!Npe^Dy5x=R4myXJ(EZtJzc4 zSPVCQ0%2KcYG#U@sPwZtcUeMK6q)s0X5j`lC0CYh7LUT_BBC7Ym3*ZefS1i4=U=k3~y%jsvH-5TyYypPRToyxW z9Ar!|`6Ra`xrpSo_bf_QN+C8JH<$7onhj%l$;#3h6T%caT<3pc?umb@?b5@s0s9mX{$F!?8OBW0=aJUb9B}7_L4ZZz# z+Q_G8Ekq@~UH3Gmmz$^&0dLlMG|d|+Z$Z&{DFqOl9zzUOd?w4O!GR=@nxVu=LfH9t zX~V7;93Dr6C+Y>Y@SP-u&Q|Eu4m=Bi`TuZy<@m^vMn=ue3R|ewV17d`(0QQr@2)n~0oLDT>a0#RnynT1XYlQWl?4%_9(@4m z2GC$q_&BPWmPK+r2O&Ay1b#Gfe`3HQL0fc4`?4~?Nl?h?4$b$jlv*T11ZJsPZ8GT! z$%>qHK?^K9-w)SRzDRk!?d6AvtpcP%(BO%GS4l-ITUlfHMb#^G(p)Hgy)dnum#x1P z8!FzdIQBo`D(Jw*0@a(84@zqby^+D9OUPSQ?(H0w9>$do{YGc7~Cw&`tAAb@>;03Zz$i~s-t literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MN.gif b/frontends/dnet-is-application/src/assets/images/flags/MN.gif new file mode 100644 index 0000000000000000000000000000000000000000..efa313cfebbb57a9daffc99f94142f9bf756332d GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5h3(37T37yA!C?%s39cG5wci3gmf9d(>?$bI%nuX$$z z=A8^%aW!uJoutk83--ONIQrgv$`Pxn$E>CuvzmIudg@W@iTiCP?suGX#&Py(rSEq4o#e5gM2t@^~rhI8NR zPJL=R^W}J_`t7A2mnT>ppXl~xW9r!!{U`GS-mZxIus-F}ri{G_4980pZuU6rjb%QN z$h$vXXm2>{;S7l`cfn=JTAx>DZOk%yIV1e;q{zKF)+Zw5ujN@Bv|-+F$Z)`dbB_+k z9v#m8hP-=?1u8`tDn%KNnTQ@YmpWoAKV4sPo}u(|bHyjV`YWxJH`u9dcF=ehY`WD+ zYoEK`Za3W>E;@(34G(x4obWR_>SKJ`-|T&Y(}fVLPbqHKBJIAUdEJh2IuL06CDZqQ zg4>f6&o9~jUvdIor2D+i^!t<>_%S!|U3S1Nd&Tok>NovO54jth@-cZAWq01s?0UG} zlUV0tA$CubJilfKe8>!Vn;CFD(d&Mi|A&HzC)uHI3ZvdurhIM5uMl8pk>dJVmhz!I zb-uphtAqex6oaFBlt2#w#h)yU3=E4HbU+fIJi)+mnt_o+#$$uRL4$--A8wXBU~A`5 zmguoO!sf5gIA?*+&n1}$d&JazOdMK{@hLbnS-Y-$baGOYsD{ppf(adg^PTEhnz)Ko zLX=rl^%5#RKA0%y)bxpCi&86>m=UYXh8qgZOsbyE-_8hXEa{k}63;T>!i9xyE#8y= zT$!kR;RL_D&n_Mh!N<&eoHLc~b~3vwOjPupR-pLc5Oar&h=Jvz&u+aA3jT8xJ|;1= p@yc3jg+x6`J1f~3zAfXVk{V;LfNh0O!;%%gQpRk_(mWgt)&PctPi_DJ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MO.gif b/frontends/dnet-is-application/src/assets/images/flags/MO.gif new file mode 100644 index 0000000000000000000000000000000000000000..0f1266299ec4445bdd7831b0f61ed20f86ea4e95 GIT binary patch literal 1005 zcmZ?wbhEHb6k_0E_|5gey>4pw67X+*qi}T%^)MqRvJzQcI%NR<^@QvBzD$*-1LxOufTX zsmM+--$s8%h+>wtTDg-(rHes-py`}Q?K%&wYB#+mZ`}qjtx^|*RzHIlKa=ht+(I9WO^*h@ZV7A zu`nZGLy^z&9KTh0f$NI`))oY;%nw+R?=~eVd|heWmYTTDH7Pq9Q@1u|>}t*4)1I}v zjloTVwM2`pSev)hK(@m{zR5wU%~>+Z$Y@50QMUX5sq^b?5D@tPm6Y*lW5-` z8L_@JXi;v=mdfb0WsxgNVwRPpZEeij-cq!`Cv$y6=8C$$Q;Xc@C3!AL30Rd=xU-|? z(4_vei!A1bnoRI-*f&wF(_!J&^-{G)&1-uF%GE?`bi}H4O#0lHU05$xspY;bs&C8G znLFm0PIF#;Z2i7lhc3LjtkS5b({8$C?=p!>S@}A}J(u=aPBwq>{dvaDc*9o7Ggpsa zxqI&HmE)g(yah%dI2uO@aza4yCkrD3!!!mRkY-SxVBk2#z{nxvu|eUWM&O1g4U<^d zfI!6KLck(7fyO|+3mJ=!v^CiE2sxZ!NIKT9#H75!;4n*vyi2#z$3l|?Zhj?OmNth+ zPdw(@RC9>zaMlpuQ*zqFapjch^Le@d(Z?$^C%9N%}ctca#gX2&ie9vf|P}I z${K+aN8H)9gxLbKQdV42w#?s=VW@b4gOiJ6Sxe$(HNJUfsrz<#C^|jh=H}+{*jaS! p+#Jiy16v#nA2lD~<>is72vFsosh)J_L_*;qX7=U{ylgBC)&TjH2&n)7 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MP.gif b/frontends/dnet-is-application/src/assets/images/flags/MP.gif new file mode 100644 index 0000000000000000000000000000000000000000..c030d4242dc98c7996702a02a3ec6a7722c4e9f9 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5`iiNUi9NaL?Y$j~cWyc7 zXk8cV*Pfc#si9n;X1*}qA(|1o%#McWHKWZgg>K@NjMM@$7VQtn%_`3-X`j=iMFTKQX|!HzaU!T=e3! z<(nI7cegejY^>Xzn?0$kV`p#o?vkSEGo~F_w&bL;Vx^i&t(r=uu6C`B)dXv+ zQd^q}U+?bl&^Zxda{~PP!$W7pL@n^~Zb?j75gRivBW-nd=K8|?9fkQ@^K#Y~7HmyS zm|a}BH8o{UL*2gS#)H~AHAY5tetxZKY0C=>H&#^a&d*gd`T72D?NTfAfEp%trlu3Wuo;>^|69n*{ZR<_Mq6p)#B@c4=8 z>zC}iy?^TZ+J=c)r*3XtxwvcBh6zij=IvVAaBBOM<+J-fym+!>^{SmacLF099Lb{u z_7G6~$->CMuz*1aBn`?F3>>E!7&&A-HYgnAl@1V?xv8a}*+p$fLkEMh2Wz9W$AXEQ z+z&4EnQEf?W78vdAyp>DI~A8&1XY<^`4kVhyl53P&t_TG5zKy0)kES}$i)X9ms-qn zu5c_#aP$-ON=IhokZCef&B dWAosHBMY~7)Pf%q6w=&g2(u+i^KdX&0|3TJK6d~B literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MQ.gif b/frontends/dnet-is-application/src/assets/images/flags/MQ.gif new file mode 100644 index 0000000000000000000000000000000000000000..64ae2fe4dd36887df3f924e2532e4068b531a005 GIT binary patch literal 961 zcmYL|Uuaup7{-5x<}|5Bjpx(s*v^@)WB8|NRD^c!qV2kBgr(S1q=-h z+vZ^rMr7o59NWYG4a}qsQph425dTsj{%_1_AFZEqUr5MP6Bt>v2Ig!1`Z;p_4bBnQ z_wX~1tUNk`5(o{MXB^8AEN>y4Fz9BN?Gysa_RH$+;i)LRip; z|9Gx=L=`93IYvC{_r{9%5+Zp5%jdU-idIZm!+3nRvWHYH+C@UWoS^Gyp&Ap(_u+&j zDTt2*qj1!2M~WxRuLI7{kK;W8LwHA@$7gUz%S7o+5KkZ^G6uUL$JWR{y9@%VWNdN& zo5gL5Rg0=c((2T$IF`Vki5yIuMa522(YM~(rTZe}?mS#T0oo81ThfONfbp=H{(D?R zM73Y$f1=}cj4GOZ>h(`j97F^&pu8Q)8HTpC$R3o2Hi@4LPc2LuTF_o_C{o^-w6vg< zb2?N=Z?qX&#l9u8Pan>S4Xr9~CN62=USld&M7K)9I%xN@4p~2%U()a+Z?y7pm4MxP zD2>YyipDpvo@Tp&X>;zpFYi@ahwbb?;dFgRJE5_Z0#CN?_RLJ3X-YZU!yymFafj=b zaQE13JI-y6J>gHzr5xv7?T2UMnZkkd&K-w+Vo0bv*9TKg7gQPdCq6jiIPk?m zeRkr7-!6(D0@1xak<^sy=|DQvJu%rx)8qS9G5V2yKnZ&4TJzRWAsYnSS zHzXw@mYE@C80dr1!*aVJQRpZlLPAYsQvx4^W|L0m-Whec59dGU`@jGDzw_Ut$7>E& zG?c=Mp8(lI%I}lspUJIBvhkac8zi|vyaS~79Vxv-J}ndCBZnW7v9F~2EwSDv@0UpJ z5W(iU07QUafL4fZAPG?8X3C4i0O)sdKG+_cER*Sa6q>k@L_shEV%t)%8^{TS5rq($ zW{q`XS5hpgASOgaAAo1TD`2)%daWZ#P5%DY#-54uzVUfzTJw%pBql(|1(QpP>5@#P zs8MH8(i4Q5a_+4a)HlIz7E7xkZky)WIxY(H1#lglf@5M$x|<+A6CdietVBW6hByT= zKn9BnH7<1MIAKD7z^vYuq|Atvz#waD$*_4%BvenKGJ;?uyil)Hr8Jpcwj(U|s;wcF zZDLvwyjkVp6mMYsB1*1F3E`SSkC6>j@R-|jO;dqc^D0eAmZKTrvnptTtT{hCr0_+? z>x^Djg>7z7x1hn3z5C1Dt(o!~?SP27gie;9&z>$M^?WZo*Ym^dG7^k`!cuq+l1p)_ z9?wm}w!7k^j}o0lmLm_cfd#K@b)E_LzwCfyEj|@oo$(|rR)6K}RGE`wv%r< kwpwIoT8Ru*%W`3fd-bYAe_U{S*V#5T_VH<;NG3S+2X@ThgGx=(+VX?i{_jWBK+;MbpmhxY!upnHHV3 zef6QbwCSh!J>0zdWKP@?2g6AbUh}7QU!FbbVoCl)JEJK9u8W*3mj!vQwYO}E3Eu1G z&>bGII3jRKOz6tgxNT|i+lsS~)Rdkx(41~zu+U6zrm5ZxQ@!b?`m@aRXPO%T(F`l2 zd6q`AEsbVco6NN}n{Q(}%f)87qtzk@s|EHJK=xu6+a>M}E1YfSc{;E5bKB_Qw8-Cc zeTdJN5Z_G!UaS2)mPG_^3-MbO6SmXCxi2wluaEnb)VRaJzVicp<^_1o4E0~+=Q%AV zY<*7Z+0^)hsqy==l8?kit}V(wT~=_uH2-Wx(Z!S%p+MfKnz4%36^`zLqi)kTW znsN{2#ee85f8AEPv$6d9rlpUU%vc>8crd`J(Nygnl%Os0uNA}a-#_{>q7a^UfDetAnJmN1Ki2BBs~-bYIgPH+!c=uqaw zp<~c^NR6XFKx4;2=kxMT4X(nF8GKmW%;e>*tnQO z#Jop9RcW)!gBj{p5pxq89&??$+VC>;BmcG_Ad~8_7A)S;6Fy!n$Oqfq$HoX~))Xfr4A{X`p~eHZjv5OB1XuN* z6lG>42gg}Yhru$MD7X;A=^=z#;e*=sG_BcLIDt+{?NVJW>8&=Vg}~cY-kIhtjNe4z zZ7C^SGwCtCgDSpkaHeq}4kVWuwVV*+{QWv&jwue8CBoI|2GjAK#)ZxfsO4amW|aRs zio4S=4L2Y#dl$!7j*lD$hsI@@tKdx70Ax5yII?CMSvg-T#)3~lY6E#g*MO4UUboNy z=)31Ge^8mi48Op?fu{nx0V+yeY82@vus~eQQLm(Qo#uIJAX(Z3{%vS15!GqH94x4O z$wfI02sypMwSioTPP0^CHhpqiish&wd=`eefGz9(a7E_pj5nII{1CQzLA`G@d>Z|ASK$1E`4gu{6SQlVTQ8>{KJ9dd`}W0^$Xfg>l& zy=8s+1G(Z_Y4Fm^y1~+O_Zz%x@%~Zw-{eGd?r1^!%*- U8}YA9VBh)C<5wqFs;hD44*(kWzW@LL literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MV.gif b/frontends/dnet-is-application/src/assets/images/flags/MV.gif new file mode 100644 index 0000000000000000000000000000000000000000..40dec6fcb80ad5ea608fdb5fc4dea69c9831cb6c GIT binary patch literal 914 zcmYLIO=uHA6#jM{+7yC~GbJpENEE3-b0{?ytsbJrnnu&apJNV*genqri-#bHKcz?y zf>NUm8m0Ji5USKa#EaBs*Y@DSTxw6!N|3Bxf)tEK7-u$>F3a#{-h1Es-uGq>_V?}F zmF|EOzkuT^A;aXty9?KP$zPT1xxc5_O^mNb;C5hgesc2}l6jGN)J^g#ab9(f%#7rF z$wv6KfWhP9P+gRK4|?P|vpA3x1SL(d4w?5QJ{R zrUPtV9mU0`w%`_~|AR^t(K^0!eBrP-a$M864$j0Ou*BizsLEqhHCf-XhZIi1_^~4B zBH#tH^*N2htEy-VI!iGtDs+2-z;>7xq$X~C9Oa{6v1u`xNXjrx+8oSYDF5+aB`0Ra zO&XJWCQ{!TolA+u(T3NgRVpx-!&=5*4Ql0((*-P0x2f@z#w&~u$X>)PEOmi) z2^c)a4iAQ`P@il)I|{>O&AO3MyfN`dVs89RWGKXJ#U&GOqSbL0N>GbTP3#?3+x*G7 zsim1K#OW_Yo}W0dhWG{?u8=Z|cIvCo4ek5TLVCtJZY(~W9ouqj%o$3*KV0yf+~Cr; vU+y1WGZ@{OSo#*vZ|&dYO5`g?)ODSad(m5`M+$3Sc4vLHiO<7ORqXx;8SwlK literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MW.gif b/frontends/dnet-is-application/src/assets/images/flags/MW.gif new file mode 100644 index 0000000000000000000000000000000000000000..f87faa76bd9e6e0cc24ff2d79dae0ccc0c32014b GIT binary patch literal 893 zcmYjQT}V_x7(Mqox*HVPj4U_ZqQD|$iNzAMAXZv76BUu52!plEme}k{!bPaGAHoMI zEzzKdmasoekkALC2Xps=3ZnMZgM^mE-X!orNLyk0?p?z^F2j5?XTI;8GjmU!4waPF z=U_X2159PCg7wf?$SPG9Rhds^`Auv?Wpyfhr?Q+A?2O7Y)x=sXIf3aXpLB6(Vzn-_u-gb?t!l;96)Ma!| z)(d$B**BCpxn`Hg;08+NtR;mZfiWOHE4bqX$@%w1hFk*@9*2Y{dI-YAFFr;*Bhd39 z9L~t!x{BL_uno6BnEylKr^HtYOTv(vCUrA?zwT6U9af^J`sVuPOydN3XtG(iA>>u>T2{`#co4w|pq}=^ngVV8UN^ zN8P6Fjm83H8TYf?k@+{>O2$L)4tF5%zJKz`fy~a}zU_)TUiUchm$kNcu;s@s>Nz=$ML^=0r9;6 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MX.gif b/frontends/dnet-is-application/src/assets/images/flags/MX.gif new file mode 100644 index 0000000000000000000000000000000000000000..3e7700fa168267c1bfc88394c2d867b9e6529397 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5e-7I$F7|_eCn7`m7#iv3q!FY zgS!ZGfg)?MDrdO{cZnu%sTOakHdl~5e}%4iqnSjVnP8-vRGqneyN!I4wPdoMavO^*Y};L=YN0ye*poXe0=@}27dGN`yCkgGa%qbTH3>cg4Z=QU%R@lR#iQ1Z~ruD z(*FeuZr-@@@87?_fB*jZ^XJ#EUq65T{PykJr%#{Wy?giS)vG5@o;-Z`@ZP<9*REZ= za^=dUOP4NOxNz>=xwB`_o;h;{7=7Sq93{vJ0mYvzj0_CZ7<53IL3x6K<1_;!hm6Mt zg@aN&W_M;NE(u)XHC5&1Nv37IvW+}?JslsFI8?l*s@dK;?0R;N4U>9JMx!(9M9YW+Pd@xhmK;hD+izRG=oZ^r3VxX7tl;IF0gv(sXYl5#p50uQz;IWzL-nt3Qa`-o4_le*?Z z#T94cGmcj^Twl2^C2FRLdbcD`ouz)4lweD4+P>1<10vk@k+EluEEi-H-W8IYBCI$? zRB@`b`c!SRd8`uCtUZ@8h|Oi@kCo7zqG-I-!gE`A=4scU*?F~BIaQ{pSj}*cTAf(9 zqonz$y-!Zxtj)@L&R!v*_1)ce?#{DU&P>ZsShssgc3I?>J^dbj8nMZi^OokWTo=4? ztJ9k|9_RA1&lKcdD=#@yn0K+P_)J;x!#d5if8AZnW1^qb z)!wVA{y%ZTyN>pEo$Z^_Qa7Zg{GL4VLRH27{Jc;7y?gTWUiWmJswltOPzl%f1H- z7rOGxC|FoT2)zta^PO$L$y2zPty@&frNkh?wR?tH_NfNJjD<`soFaN29UmGds|PH! zD_x}&aG;5ei-Sj_-~jh5i?Syh44vH`Oi}Y_V^J(}>0GQHs1w?Bgkz$EL*}lOn?lcg q=Q(zXNpekb@t1AP+7WZ`)6+9^?AwJzUma%Wmo;ZgmgeDLum%7f?q+rX literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/MZ.gif b/frontends/dnet-is-application/src/assets/images/flags/MZ.gif new file mode 100644 index 0000000000000000000000000000000000000000..fc223205aaf8cdb8f6c1e05424c99571dcf074ae GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5mq%6a^%1%m1Y z!dgY*IwcbNmC|-?+IEdP?mZ>}(`(iR|6u0lGXx~*a@n}GoB(ch3W!-S>O-IAH&-x;?8n z_snG7-_A9q)a~XJ+g%+VcV_yZsM7tgFyqpsv{)6E^?u@~W96^TsoS0Ic-%vxT2JJ5 zS=7F^@;3zmZSq{l41_j0YMnHZs1szk;;ete$Kq*9=$Z)M!{VG1v=xil8S=PU0|Em4 z{r&y?{M_8!oSd9YO-)TqObiSR^!4=>6%}P=Wd#HTczJnQSy`ExnSs#?j^0rMUkE7v zWMO1rn8%<4QUuBq3>>E!7&&A-HYhmS=nE}~n0V+&hX9XE$AkbyX7j4TNv9fpS;c%{rzIC?fO z?w#Y*$53#orE}5}_latuLOY(j@!54tmEM~2@{)>2zY6CDl@EM#ttv%!UJ!ISA)w;k zCBf+AlCZ$J`N5ZhPbyqfwIeq~tTb}%a&W1=_rv4R(bF@Gv#u@BbavyBXso*P;lie+ Y-V(+EHqcwq`j(b2kdQ0&^q;{eo-Zn2A}nU;?$=dRxuvFluBe28t8Z6O^bA-337Lh9n%ie- zXq$IloRYq~(0q<#=$81fHSw88io!O>N~cRJ6)7v`E9y_tS1VW3sMIi>Z>C+RqgAb? z*QBT0pli@-V9;V<(rsegX>8VO=Cs_&YLb=PayO?rPF}0LoMt%rZt!zk;O4o+(`}xc z|9by`4FNvOef(DW1+EVaSQ8MqCNN-CfKj`lS+A-6bUXX0b}Ozfn{#-2_oAwKn|rpM zSTcV_e{E~l`D^>a6E!NEeWornJa#$h;G$`_7tgsE8}feX{Ew@bUa&K{7wCD$&;3(Y z;={g>o?&G@!@+u%lk*A}*EL?=8v+7P z6cw*1$iGlid#$bg)ynFJo!u`dr$26P|NZ^{1q7Ulh`5=Nak!@&7_;CQ9wl&wfZ|UU zMh1rY3_2hcpgh6AahidVL&jr+!a;7+xCsG)kC@qcL=E0#2xweZYqWfI<6xqaOFNHP z+5v$Qj>*ednCkBwe4O0E&Z}Kw@gw-9P?KFA%dQ#9?X4}mCQ5GajH|g;F~YxU@-VYE5YOn5>g@B4Z&_tEW)oWEsu}U)(w- WX(yhk2sD1mIZ2r&8?BNrhBB#92&~$@~ z$G*VO!vUek7>XH~3z#`8IC(30B^o7U+hpb2<)yQv6-yPBN|ZI~HT0+GYt?D#b?8~l zu`rovV$g2jw9?6KwVTr-C%46J0owxnH~af-^b6P!U^c;2sfjgVvuW-$uhO}Jh0_9D z)75+nbVDkP6I<=_r}`)w3dFbTS1z+sFl5c0%Fw=CaqT{#8~4@DTwuL)jrZ|$hfm+a z&z@yCc8tNpgW=2><`XBFw{K^*wPiFnXWY4yD8qBA~ij|L@)hz;d_sf329QXHX){9lzCtA2(O!qj`==n%p@wKV`dsEZhIyxr|3@)0O95*t2 zZ)f-2$?3AS)h{=<$4*YitgWBBx&83-{p0Wd!prkdK)@G2zi&V?DDZnq%D1#sU=)L+ zdXzv90mYvzj0_Bm7<51qpgh6AahidVL&jr+!a*J>yB>!^B^Opc39}Lg#ika{MopV3 zKQ5>D%X5o|tVy_dh_y$YN!8~;v%3FW(*g~hgbN1_HggEDhy^S;er~R1+93rghXV{u ztekutdr~-fWG%Cflt^w_5vb}nSI1FEV%3G|=DEkFe01u#sNy@%fU`nHAY_q6&bbAi zkDpCg;xpeYut-S78(-#xeOTx&yP zZ#hcv1CU%&bR{fJO2*#S;Mib~t33KKYP<;>lP$)KFYKw6JW^B-8^4Y4OxXDF!no}X zU#tg#SWmX_{40`4sH)BV7P5x^e1rEAz%O8Y4Om5jm^F62C|pOCz}QDK$GZZ#D>)S^ zw)>%#QIZAJQa4jRF`8sh87w|LSVxv{Nc~8K4r`wMAwtub_CVl+s0MVHg1kuT2om$$ zvE$d*b_g*zX4V<&MzEtu;8Pf72r^{(0N@gE4WL}lYhViS@Ct|knLHyPn;R?#=<0gN3=_wkAHqu$Da-v7T&<4#?L23i6`#P2@3YV?0n@{%bcGT#gB*t|*por3J zv;f+^fw3jiUm7tX?*C%=&algn7D3B0Q@|(~@AKp<8B%8cDOqHbHx`IM%Yc{z5{$iG^IHPEz6yWCC(PqdAi1cShl~Fuydw{4)DOS*P$)%B{OW+?)pU zwv!bDH`27#w7vjMr}??f3;#6N{FDR~C&VWHi9*{|6g%biTUrw%s4jnz! zQ(6)4%<#q*Y8I39amxh}wB!I?k2><4-P literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/NF.gif b/frontends/dnet-is-application/src/assets/images/flags/NF.gif new file mode 100644 index 0000000000000000000000000000000000000000..ebf68d8183a2f1e761156e309f9b9bacf1fae305 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5I8)9ghX0Jgd2n<+9V`eBm`pxWxHhMJLKit6%@M_B~vA(v!&H0sHyj; zYfsl!DpOW0R#ePW)SscRR;{K{t6{p(RJ%z>t6od5T~D_~*Pzott3u0av6XSJvBfM4 ziuzheC2qc(eZAIr zc`WzvT;b`z#Xn$cfX^Bqzx95ei#-Fk1O{#n4A>YDus*9< z3Xj_!7r8nzWlu`V?v&J>sTun+vi4_{?=CN0SK4%-seXHX``-5ML*1SGI_F-QyXe}Y zDTk+YZ0uNZYsHd_OQvj{GHu(mdHd$g*gj*{&RJ_ttl4*S-?Na#-;9x)7&VHJm&m8ZxovCe` zTN~HaH*aX{-rPBV&%EtNw(UQ?@5;5yzkdDt`Sa(uZ{I$B`tI3l}b&KY#w*xpQaFo;`Es3@|FeQ94Qx8v=?ySr{1@W-;i1 zG=TC11IK9wMh+Q|4GIUDSWR9OEasTB&}pVt>d646;{uJWT6b0)dM2pq*r?}wOKDNt z1QjOPH4~gtdsVC}%IH?Iab#(WNLtz{<(hK)VG}SQM}cEjBL@GG!8Z Pe59S1Em@j}gTWdARO>iI literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/NG.gif b/frontends/dnet-is-application/src/assets/images/flags/NG.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a1452038c8465bbebb90110f32c257143826599 GIT binary patch literal 898 zcmYLIT}V@57=AX7>?DHreX$NYYKDfyqCW#Q=m$mD*v9Z8x)?ZXOcSwVMe`~(1HA|m z6Mv!$DFnMP>LSRyk=uuNIf^ilm=UoPT@;O4Z1(kiXHGv3AMbh3%kw_Z^S-D3Vq0TV z*FKcv51<@TT+=S)uA+F9{J(s|qlT%;DaR#8a~Mbf1oFJ_BVLTJ09S!cAPNis%PG9t zLUc&|4V0$Pvjq&nB5+fHjN_$PL5i3$LSDRGgR&Um zG%A1|1O00>OC?Peux|6vs%+1#u$yo8bvJ4lD2Yi9&IQBs)NTF^EwQCm16IoC~lN@!tnyD>IDvBz_?DH8;bFPwc=@AhnpQW+W|l zAQRTY37R8@*cl;Km>?%A7A2(dFO>VGmdb+kfK z62+Ji5eAs?bd$C;1mfdZ$9x8;!l3GG)q=g}f%6btJ zGF!3-A2RF@6PDNnqlaa82YQJVUwn|rlGsTLiKQ$DZ)awMI?Tg8=YHp$?|kRZ!9y+e z4IN&r!%x8NI+h$r7Ju})T~_+zd^nV_R-dQGXRY59Nv6k#7QYSow=H&^Pg<*1IGRY0 zTh?mQ>r19zq>JC_$^w1^dO7-lJitKqCWzcauul{pxn^Z6W%kPhoh~G52yR1suCi^w z3L$JyMdBTgN9p8QFKKW)5c1vvqrfX*)+@a>kY`T)``xGeC(eXk&Oz7DZt6yE0_-JK zs*@~3l9}W|5tx^ZoSQjx?iI`0IuUW26*N`&-ihU?pvK}OgaN@IFj16l=iDI&uO{V% z0kDEiP5})lgL{Zg9VQK&av(r#*0`K!-1d~%2)`UR`J7G(%`<3BpgoQtw2O%;UFH{R z&_!p>*Dm;(BTj>}2m{97y(=>sSGgG?{4><;f?T&Hju{Mt3Cx^>rZ*Be3^tqdEcDLgC)7@LAAM>)!Lnl2=P1yGbn^_Y8 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/NL.gif b/frontends/dnet-is-application/src/assets/images/flags/NL.gif new file mode 100644 index 0000000000000000000000000000000000000000..14694620511a9ed439131377a4f0424bcf28c182 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5Z{L4EefH|c&ATT~p4q$a z;E$hwUcP$!{Kf05*KS_Ea$V7727~b`CiB&-7VB8eS99B~<#XOD;Ji)3eY0ZFVa34h zG7b}z12(7zZqN+fs^T@htH%9-KIShJm4;f#Do8^95GcGeE?_ zah8+w8ZYk+0f8%mg6Bj;E=fpC5fpqVD|=5~{)wXE6?yr&l9KQA^>66vzBV%YWNP}* z!eW!Y-Y+Mo-9|<~TwMORxjlDuJZ5eE-{1dVK)}y{fd9e4@BIDW`1$<~5C0Y({wpr- zWnA3%)YSi3S${J#&#qf{X5G4rn>XLyyZ8L&%`Z-$zI*7<^2w9G-n{wm@#DXbAAh=e z^W)8%SN8A!|Ki1u@8AFZ`}gP1pI^Uz{rvg!+qZ9@K7D%k?%k_bubw`A`sB%zhYug# zxN+m!wQH9yUAl1L!nt$j&YnGc=FFK>r%nN*4;+o71UVs~_>+Z^fngeh4oEX7PcU$t zW?Z_uV(K1KY*sE}?U6KLVy&rE zPCqNA={v_|;~`fcDYGn=SBxSr{O4JhJiD^7Ih}vLU0olCiok;aWsfNuu0=;U1Q$BC zi#ZBute7xSX|jfA)fJ7vg$!*Xyem{DG%|Cr@^ElYVql!8$S!3Qu)#q=KuXP~H;t=TM!qO*iA^jVd~C_m IJRA(x0AdGNH2?qr literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/NO.gif b/frontends/dnet-is-application/src/assets/images/flags/NO.gif new file mode 100644 index 0000000000000000000000000000000000000000..dbd2cbe715f824fff916e885d97161e018692898 GIT binary patch literal 1004 zcmZ?wbhEHb6k_0E_|5Kx-Ig_kUux?mHlerCsvb?sAEOk28Z z!TQ4t2AN#u`Fz%eW|7Ty37uiE8N(HRDYdIpBGjEv`)nJ=)io?&G@%gK3#i|ZOM?+pQgZZ59#LPGZ> zBrZuvOc4}(C@cF!QSpj`{9H-N<S2sp)<#t>b!nJ9V_b zT3MYkFxaG}b=S=FjH%H>3yZ5}rk6}ie%RR^F*f?;?MWBN{|o&ia%Kx85m|V=z#Qq z@&p6NNd`s^8IKJLj+#NoOeB*Y9#qs0T$RDOIIUlyF=*eDMx`Z(SXBa7q%an<`71ax zZ9fp1!pXtPUbHOXWzey{`A!WiUR6aWIk-8cx-6PRIy)zOO;O`~BiM4HOF+Wm%z{AW z<9zb=6)yy4Ftu_D$y-%OTs*|eBdMM=r9yE+BNL;0h{=hDOa?|4ZXp?i0EY#OEMlhJ zXxPv=akgWpz~76-%X<%4#;sA=DcI<&+}-lyO5)^WJr0K9i!=@zIv!a(x%S1L$mX`5 LgV))ZnHa1A(%e2J literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/NP.gif b/frontends/dnet-is-application/src/assets/images/flags/NP.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f288fbe1fbf30e40f695fe1fc01e263ee604de0 GIT binary patch literal 563 zcmZ?wbhEHb6k_0Ec*Xz%|Ns9#&c*%8%I2i8$#E;|mwrJP)eQf?ezVEI`fgmt5=P+# z48oiA9O4-S*Gd?bFd43}&DiKyHPbn3sz+(4w8Olx?pSWGY}15Jr|LYdbU#kdDACYa zano<#y6wi|>CPA8#2?X`ydpKA+Ecr*HgRdZ(}b?ty~g_WyLQ}PF~#1#Fgm)^ z*49H=r}pBhlQ+CwE(>r!bg(&VZ~bQByz{eX-rceNEF(ib1H(mj_OqOvXLvYoi-=4S z6nv;4cSS+|jH3JtHMMJM$`@5t&S|N?)7S5omwjVu`oPR=xwhsNGt*yAPP>haZra-X zbaQ*?=X+2ikLhW@va?^MrCrR< zzTVvYV$!7R9UYe^PdYPY%9&-$&aPei_vXzD2M?Y(apL30kLS;yKXc{`Fbu(ANiw1M zlZBCiA(uf1q!Sb;4(t;e7@C?}T3bTRvvYC`{G6DD)N?0KZt_az$dWU2w6L;e7gU&H#T1HAzOjcD(w<$6%DJ{jsh+pkulW}}%X2t;($4@C;j9l6! Ll2INS0u0swq*cil literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/NR.gif b/frontends/dnet-is-application/src/assets/images/flags/NR.gif new file mode 100644 index 0000000000000000000000000000000000000000..626775d312a47a60f812c54a479c87a990ffe7cc GIT binary patch literal 1003 zcmZ?wbhEHb6k_0E_|5%ENL=L+G3uZS*N09kGOiAuICz6%Q`c^ zTw>PQhs?DPni7DdZ)<6R(|~!-d#SaJG_#&*ac5F^JuaSoah)f(=BGPbNFok^lct-%UmPp zgk+PRZ}?%9t~| zeD$i9_O^@->pS=Cp0#+A{L(3kJ6Bq*Uto1&htKMH?pKe+9o`yoa(CRFvzfQfmM)vB zwr-C0*5!WJPh{RcR}G9oa7>O8B!__FPZmZ7hUpACAf2E*!N75XfssSTV}rs$KG}kT znU|lP>=u-9SusKJ$SKK2*%*(BkDqbz3d=YwXt=1%HPe(ySfx=oy{At^&TdY|#KWGf zrb#S%GYT4+nwgkc1Pm4|a1`Jal;KcG(co9Gule%k<>%*o^PHMlScNh)Cn>v5;!~V8 zB_mMTW2#(WlFA3)Y3v+E843pV!v$Jr{r;mJx`?uc8bUQt9)+sB8()>+%0n=Pvdf&X|x|SF4dz-wieAc;R zF^lTA)Rfrm@16Iqqx#oLyZ`?ghy;p1S->iFKqSad3~Y7>{2rSW7=&^2dmPI#5|uox z&D7Y-C%k;}6s3%q*@u`5FPiBp_IQS5)e31CPY!y>62io(%{Jlp|Axk<<_1RwYXCf~ BYqtOZ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/NZ.gif b/frontends/dnet-is-application/src/assets/images/flags/NZ.gif new file mode 100644 index 0000000000000000000000000000000000000000..e151943d877c7f47a1ddc6eb26a0eed509cee0bb GIT binary patch literal 1005 zcmZ?wbhEHb6k_0E_|585%!O!cOl>d!LMpJ`z@$J}71xxoxequG{5Gp$YL+M3O`HJf8&I?L94 zuA|i=7uzN74lA5(=6O1=_HbI{@3}6-caxvT(ulxq_Eyayeyd_acf^G4OpMx_7`@NO zeX^hDwAA=RF=6Xd;|~V;&JOgM8R9=TEBQ!F_?oDYB@w}kQsTB2WuK0VTv?oZCOK|H zN#5Dg{Ig~GXDf=%=Vcx!$l9NqvAd@9Vo~nl;@m^EWfybPx7U_mEH64ynt!;i;$ltt z`I@q`RVBx}+pcytUnt1yH8q@LVY0x&c$SU%5<9D9?#^r6o%=FUjz@(p&&@bdR&=ql z(*Ct^-21@O&Mu}wI0K{2IszC-@Gii1Y333D_Y za}Jzfe9|Fmn0I5v%iyD(4!X_-M|ON%+#zC+&El((@Zuy_qg%z16%U&^ChKM#&*^YT O#=_M2!FGRr(|n@i!|K)ViM$8K?- z3GyK`G(2lH0^9V{R@g-Lo2JfnDBa>yvd*t+d$40U=j+Fhj#(HU;b1tz$#{&H^`sEj zIZ@uL3KEZuwRaimymz&`D{|`Po6w^`0(M4 z8#k_9yLRQul}nc{UAS=J+_`gS&z?PV<_s_r!I3#ikQM@pKUo+V7-lf&fV6?~1OvxO z21X7Uj|~crW})})bTYrVxWs$9hGWqY4MC;GlowA{US2jq#e2GzYtQr!Q_c zyYtLhM|asYnoo% zCLh5UY-dGPZS$Uda9q+Usu#b7qeIEy>@-#Tf;AZ*nc8@y%(BjS2s$UsP_f9fY&0Q z-=*Ypiw_+qCsS*Q}!H>+&O-QvopIl7f#qZZ`0{J51uj@W-%LQ zvzq2|TIBKCmI^pj@Y@tfxK_yeG|79{>V`HO$4#(E?Dwx&9#Fn`-=Sk~-+w%H=G@(T z_xBwLb2m2fLVfL?#`?o^=e#|C?!xX}tC$$purhDr;o2!8vPnYhgr?eVJ?(3@ zRy#~gjyl>s@b$Xx@AEJu@b@9BZm+F`}gnn@83Uv{`~Rd$G30aUcGwt@ZrN7H*Q?Ha^?K_^XJZ; zJ9FmDo;`bZ?%cU))20m@HY{JheD2)2-QC^w_4U9Q1jpnkL2?Kv{$ycfV3^LJ1JVh~ z6AT=u85lWaJT@pedQa2%sZgL1I8QabN1;&Z=qa(rX)QV)h6@iYvi7_nlPT2NHBFC6 z+tsVUp=ps@#grw9pHjHQ^dedOqFNjnS>5{HtqDAQ%y*7u(F2Z@3kmN0a#nR58O%$& z#0?Vn#RzshYUz}cODfq3SW20=+CmxMk+*@!h4 zJ{)Lkb!`}J z-@JYM#Hmw1e*Vmy*?Q{2+1d@=aSJm0PE4PCWajp_d-goq7cf0w;mw8j?%yk#khgNz z(p7twT)1(zdsW5vA79H`!Y59tef##!!U-9Rx+)fDc|Uvdc;n>uBlBk+@OM~0dEyBM zhGPs2bqox(3=AiknU6Cw9|MvsEXP?{PqDL~;N(2X%X^WZzmtpWl#tL_35f}Uf)5lG zFDb~MS5TNGDY-;i`m(zE8b!sI`ugjYm6s?gZc|gcVW7W5L*t#P>258peL6aa_4E$t z>K->RSf{0R(#Y_bfx$fsi@O#U=S)ma8ykPNv-|4gbk)jghmp}wH@7R+){h(=?%3Pi zwzqre#();FJIrMZf>tUJzscu{POqz6A6K>z>% literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/PF.gif b/frontends/dnet-is-application/src/assets/images/flags/PF.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1e1b9540bdb544930310d0ffd3621f73690915f GIT binary patch literal 1006 zcmeH`-A__+7{`C887yq()}}+tmtO2$T{g>BK}E`iFPqaEwb7~xUbHTH!?HrOLYWzA zG-_mscH`8sW;z*Q5btu%32QdN1fvuaJLpk3#0b0WZ|J*c&%V!|yU%yuGsX0R!xxhP z8LWaeMIsS>WtEY60pirmbai`s2i|pvwY36qwcuv)ok!IY(XFng`@@%+uiJ$t?)5I2 z)Gn8It293vgoso&a)WOk)XXnq0a-t^8Vr4zbl8xOi_6$bIIOo?J@fMuQ&VOL!XuGD zIJ^`H*e528R;xy*>r*IJLm{uvH~aIaXKu~{L4(7?i+;ZkMFq{x5Q5;LP!Puh!61wv z5DZUFf1PkTP(SK$IzD~=q&MgT!PT)blf_~(nT!_ApmF3a)WCXwm0?!CQ*uha_q|k0 z+onG#N6YiQ=$bD~XxUGt@sAZ)w)H2%WM{*PHI&YUR?7#$J`Nl36KCfbsdC)3iVGcu6$t&)@!IfddqaG*acYau^>WcO}EPL8vn z06CN&pwR+!y0);;L#KyJOG9O4SXr6Bs_JfTZm6clR9Oi#nXRWzIXLXO+FGos$<2E( z#Af4dZJ6jO_Clh+e{V@D9TPV9)^dj$_%`t~l~^3YaXc7Y!7yxjS*O)Tuc$>))aUap zEG&4v-r3n%kH_P7yIn4q)9JL^?Jx}6Y_=#Gl}Z(j_;1wz*S`cZf^h@@WMJ>wW33Z_ zXaNLbYSBPCb^is}itv9Vq~tJF!dxxAC5^|$iAO536M2M~m0#%6dN`dHb4AXk);E$e zOFGFUf=ox;yeEz^MAd$Lm_>hnbeBSYGJ(=@nM7~0uedhQIm#y;-;X6GF<9iZ%wsQ~KOK!}+^~i9?HbSB xcw*1vo@5biJA)8=R&oAZ#p&`)UiEu6n%N_i6x{H^yqTUc$-($b6fzMM{sEPynBM>Z literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/PG.gif b/frontends/dnet-is-application/src/assets/images/flags/PG.gif new file mode 100644 index 0000000000000000000000000000000000000000..14a65184091e7df09a0af55024685b66ccfa8206 GIT binary patch literal 947 zcmYjQQD_ub6g~5L>#VX$c(1HOvkGh0;KwS-no87Anz+~+jBKUY(k@{Vmu-+>C-^Z~ zq$*Vm*3uAykrE_o6iQJdXdzG}x-)-;x)`({Qd|jTS6lI8p(z=By|Zhfk72m?ymQYx z_deeHdviL4Npaq~NE3oS64W6mU&z-O86;XksV%7>O$(g9qTmiiIT)vNf>N!? zy&Shv@QhM|X0FZTKF$5f$WQdMpko~LQ`fs)!DX5floQm&;Fre&#tZaV(1nq~vAKi2 zx65$dLVN_pImp|9n=&5yhA9mT2C!)OMUoP{&ez`DpGV&^Q&4ei9s5-;?b9xxpF;c4 z5*l+g|_6^CsmkP*%@_osH(~?7wj6s zj+Mv_Ap_@&%O%%ThvOLL*oh64mh#HYK^Gi7T+#zde~zXjMiG#qJgx`WuJ2d1ay2jy z6z?mk!VPZczt5gEf7FQ8O~i&bLHYPg&a=-UI7z6wXCwiSMZ?mst^=%51#|wtG@fbv zu2I!+wPk4sTJacwvPQE;C4^D28nxUOGB&*DXbkiT(ER$WL)Z)WuMe|+bCj*Bz0Cgs zsjcv}DFzVize=9eAZ_<~2q3Nvs$MU3>eQf7=_Q~jS zvo9->Ikk+H_tdhi@|+!(1(w1qg0?NasPw+DmzO-YHpn)X!PWFTZ?}z9+jqNZ&PLg% zY7Av;6rSJcCGii1RK8nY;hQicW7zDqoxC)C_v=V|9@AyxOuVV3m%6WrOcd!@B+))- znl1T^ccH!I)C#$JBAXE1XTRBK+*+Cy#bSJIKQ$$K%wNX0N_2LY-&^xW)4Ism%OiKs zjCU3=dvn)@2l3?T!ov3-o?N+h-JbKc*+k)EOZtU#_O{klS3Wr??b5bur;XJM!v5^h Ji*HY0=f4v68Fl~w literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/PH.gif b/frontends/dnet-is-application/src/assets/images/flags/PH.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb38107e6395b89112ce084a85eafa643014ca32 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5e#)2*!LSXfN3vzzDSw8+hEiM{<~N5^SiUMsDvn|*y(`unf)^qlA8 zv)IF9RzSe2z`)gkfhz+7mWPM0jEh^Bm9;%JbN(f*Il}F@!`Fl|9@Y)ajxsnkGroQE3GQ4VLddbA(ys_~QJG);_PPeSA9@yLcadUg>y?|^ ze_!8so}T~x{r?37eDd-68yNV_&+m6&;Lm`7Ghtz;8|puP{P^(U!%LSgb$53IBNrUW zqXhO4Q2fcl$iT3GK?fua$`cG6rx_SIWIQ$~II4Qbys-#saqHrju$dB}_}ERLF=C#9 zW0DGcw}6C2Pk`WIH-051``E@wEF3&S(k2}a9~ZIpE84O232sj95*C&Gv=~>S-oxoW(4FZl#tlZ*SJ^~!ecxD=eUQp0TcyOSJjZZ?uLt#U=xLyzkM}aZB z|00hWD!N)C9t!GOVP;1&m5-lW;66>u(21p^|A5~-la-0g%lqcLP0_QoQd!|I*Oa9{nD9h7i`LWjq~h|UOC}V zU zm(Poj*OgZwSU@01Kqx>+BuGTWUqmcSOd>*3B2+@$UtBg;R>D_8Hbz!4Nl`vVUNKQo z+Cy4BNnJ5OQ9n;#KUZHZTunbiUn5e(wAfTDTFbQ1R5w=FAlX1KPS2vi!X(4QAi=;a z%givr(5b=6sou%4%F(UK&9TDKslv&v+ReYq-><{Zzti8d-qWYqC!jMRuq!a2Bf!7a zKcF?hque8)CBV1dH?TP{qBkO>JtVw4JhUS;t~)Mka#m_jYFbBHR!>$&XGUIMUe%1M zNgF2huIz1^-L&YyqJ_H`ZaB4J{qgnB-#@?o@b-~oN3LAGVw7rVkf?8#W@=wz=U(gf z{Q0xHcklf8{{8RYzrTL{`u6SH$B!T1ym|BT<;#Z;AKtie<3q9yHT zMdh`MHe?)ZJ|Uu;$Rg$Bl5ws}fQL)Pz^L`~44uFk9AA_(g=8eG+5!ZF(*hJUJS`YJ zSH7Gy*DPz!0|UlIEj{ucYia~%tQ1;olhU+fg3!aGy;_;u8eS?DI5fDFmdy!BIKURg zE^#fPQt875CHEqao*5UOJFpt3+nD^g?3keJG5Owtj*HGGn^|j&A~K3xIu2fEV`gHo F1^`Qa9C!c# literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/PL.gif b/frontends/dnet-is-application/src/assets/images/flags/PL.gif new file mode 100644 index 0000000000000000000000000000000000000000..08397c12f26802c36c77bc33dca1c6340d944ec2 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5&*4DnEu6|Zkb%UbfJAM6YT3VZwm3OMC-8InPqoMK1)O5d=))8IZgE~6L z_4K}4S)DR4IBR71(8A)Xndv1Hlk>*LKkV!tT3Y^ca=K+@^}yclij~zLH@BxwPXD~T zUb(sb_w{|}>G{UPR!Vq>32 zM*K}lc@-P`KQrTJM#is_k{{L8H!fbhaPs7tqenlze*NU`-AiZA{Qvp$-;W=EzJ2@l z;ltDW_aENAed+AkyLayV`}gnf-@kwU{Q3R+_pe{Se*XOVAD-tF7BZ``IMm?(VLyuLnjAIEqFIT7`h(PZmZ7 zhAsvjkOiPT!N75vfssSTV}rs$mrfo*jt$57{j7vhE*FQ$hNIjP zy5Z|0R!(B|7T1g0*CObV+9fQjXjY(*xY%Q|M$iI-NTm;+0s=xp3JnPloqOdy8Xhzp zbXqV;SVT;wAYfs0x13wYlLZ?OwH%NTmy$^^P;~B+b?*Bx<04ZlN28RSOn?C6;SOo1 UNk1lhbaLh7XG@mm;b5=^0QSmEq5uE@ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/PM.gif b/frontends/dnet-is-application/src/assets/images/flags/PM.gif new file mode 100644 index 0000000000000000000000000000000000000000..38556aabe6c9ac66c4692598febb8354f8876536 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5PZo~g%TbI-^r{oo`+q-w_tXWrY+_-f0>XoZk zTYB4f?Ad7(;^3bc6j2b_F{?ATC^sV~3w`OH9j&n!jj9eN*YerTvSS zO-f4jPs80F#S<#3lG-|o`zO{mG$qZQU*FcA+1ppXX;Z_xbyKEHa$LMHwz0vx zvpsP7w6sMFOLuHVQud29gPP!F|D1?v2(5Hm1D~9 z?(4t2WqN3v-iiIzKi>wtd+7J{X27Fs{(bGn7moQfR_h<$eMcU=hscQuGIbh+-}W6qxDP7j_z`s)M;||P_Tu* zy!mHstYdZ?b@+q@zV?E*C;8R z-MxG7wr#*D21oTMfgS>iKUo+V7#1<;fFwY9f`Q{S10#ow#|8yQ1(z0%h=fOnnRz5l z99}3Wx^Ol+*6?UvU|{J{(TpotXt>CeN03Rru&bn{kzG7>p38D4c$QrE#i8K3=8N;Y0D=x|ku_a6Ma4=W{06kGnD*ylh literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/PN.gif b/frontends/dnet-is-application/src/assets/images/flags/PN.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b088cedce8386ff6f273c4777fcfa9b6594ed23 GIT binary patch literal 547 zcmZ?wbh9u|6k_0Hc*Xz%?Ai-Cbr!Pe&g0da$fG}x-*C2|;T%Du1wzJC`AionnNE9T zt}bM`M8j%^lx?G?eUGMNyN%N{8Q1bMk7@&-Vmtq4(||O`z!v?WM9bjBlcA9=;hnd_ zgRLSQTq6rUM7r5Wdz3~`xfc@}7FYH-E-WD4)F~n4Swd)5V*RV6(6Z!N3zOqDQ|v5K zG<;G67N#bBO$~}n56?<(i^<+xoxPwrJG&&eEh&F;Uw&m?@x;s$+f9{|9jhYTs?#fL zcC4$PKdWKcf|ia0ZL{LqO9Q(LVtXRC^e$i3-=8%(`SzRz_ZKgFxOl~~W#@J+J9Kcx z{#)yJ{r~?T?C(KADE?$&0XakmM1bOifxV%@%)>&)KvTlfNk*)vS4_p&!N*tC#yP;A zgO!Pug=xN+j;xj;kAk7HG&j2_zr3I@tC*Fax1)x;zn3XHr>>luwGpG3xe_0*h!B^F zHan}nr;DvPQx7vM+YL5W<~!=HZgx`F#8}y1ynMkbpr|K#r)Li9m#<$rf6VUh`}4QI Hk--`ODY%cq literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/PR.gif b/frontends/dnet-is-application/src/assets/images/flags/PR.gif new file mode 100644 index 0000000000000000000000000000000000000000..14c2bcc128cc8589fa4d4d908aae1dcfcdc59902 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5g|3S>NAvZ2IJ59?tzP4yA34hl>jqS63{2 z`s9;~Lw8j8g1+uUH?F@537X^TS{EC)OiDJyKWOIk*~eC_Km76g-vodymYV{^RK3hg&xNK6T>L;e)4^Ej_<_)y-{NKV7^Qh@igfWR3Ekz*1PS7c?cD9T<} zRJ@^~GF?(~o~-mEef>v9`YY9xpPHI()zNxpV{y>f;DCX_H4BUPu1@cqoK9Goe{gf# zYi<3&)9t>S+iefmFG2pF{rx`&1iS;Hpn%um;YWf4kA((*&C0r&lXW&D{dsNm=icrI zEloeBP5m@=^4`vlfI|;j_bs|J=Fr@87?_fB*je{rks{A78(I z{q*V6yLa#2ym|Bb_3IZeUfjEP@AmE6H*Vaxa^=d!ixo$dMyE zckTqnEI5Wo37jFI_>+Z^fnh#_4oC$kPcU$tW?jqS7Q)-#KQni&RzyGPq4(NxQLt(WOb$ zbCO16Q-`OLy8kSWCl?+bVrOSva^l3JqddJ*W{)-qawxj6^6>MyY}}-JW|n2?10DzE z3rwt>a$*~999-Pa@6^WiS3tvq7B?mxt&4pXdDk&%-^{)^fC= zhro)TfNYYR@0Hzbaiv#RjNU+Bq$1tfVQlC{wj%wE&$xO`o|eO%4)>_>Q^Oiz9AS1CFHM$(E~GXDx#Rk^^u8cHq!+zx{To zrae&ywQ)$QNu!pa5vW(5IB^kh35JdlT{FjtB7E5;lP2eAIH1|Xfm3Ky`Gu!j)OCk> z7`=f_8MKs#2uGu~rOhouxrPOz?Dr;Hr`)__9Sar^35Z}Og9egGl~DC7un*8P^d$wq zdJkBDZK97uwnTv9Tu)nJE1Q6)a&pRg31huN;Q&fb49tkj`vad!M9lq%OiYk!YxC#gJEky(?5C96_a(BQ3T z+rGQ0@)^b_UX31XxY8HKq`N>V?}|ARlds2im;y@sTc^ACkH!dW@no55 z$G+2({jjglJU`9*VcI8*c^6r$><_Y;offrf!Mr0Pj3=bo_bQ1z)KWaoz;Ke0@dPvT zX;#(~tgNRvInQx%UEt-tEFf@AMC68q#CZvcJF>D56csPa%P*0Zex#=MR9kzEqT*Y9 z{a5<>FZK1;D=TkPQ`@1T@y^urt*Pl7Q`6mATKjZ#4(sV1(A7O|VDR3`>ZFn3F$04K z78V!HOwXB^oHjQ8VrTc+&hERD(^n^_t5#M&+}ysqx!tk1yKQgx(8=kim)A2lw_m=# zPu<*Jd3yf#_y6VZ|2rVyS3tl!AD@qYem?>OzXt|>4G8!W5b!N9aCJ=d+LRPve1YR_ zl%PTgDE?$&WMG)cpaU`slqVQCjxsQE$ari}ILN}KCc%)X%r{NLcR|R-BDa3UMlPio zj)RTI#58^91)Nl3^H+3Zk`MV%;B=Hn$#ag+&PPZ67PvOE1l?$0a^q9F8N` z*Nz_?M--A+`xrgs7+)@AJv-02^UoQc!2u?A Y(*t)Dk8n(wW0rZW!0^Pa1P2Cd0E4;tf&c&j literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/PW.gif b/frontends/dnet-is-application/src/assets/images/flags/PW.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca9033782235bcc18a8a56c8169999df6cdbc5d0 GIT binary patch literal 855 zcmYjQK}b|l6g}T&nn8o6_hkC0i;*NkTnwc!*2ZWs6Gu#47!3GLtt=bAH1QWg8X3$Y zNFy?EBVkdN&>|Oxi^=(qT8!v2WDqTh`MGH^ls3`p{y&Snt9Rc$@7(jweee8*#!!6^ z!y)_v{`_@~&zb4<&h&aT_p@~TMLNCF37|Oq66Oln8=#-kec{=+rqU$v8!)_h0GI%? ztDnM1Jp=nn`?I4<%Vlo1Cty%P0bJlV#9!n-4&(`8XBwtgd3P(Vf`=6yE(b!{3h)|u z4`fP}B>|H;{7;83Pb~H}FKoduu2c*owFtIAOf`g2+)NR6pKV2?T+EU4BRdgh8i-x2l?%K+=Slm^T#r~ac5-tIOgN1A6TpsyRb3PqyLjy5{R6dSiLRN-yOUKNbJ0t|0M7gatSINh literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/PY.gif b/frontends/dnet-is-application/src/assets/images/flags/PY.gif new file mode 100644 index 0000000000000000000000000000000000000000..414916d94898cd59256426fa6a12aa0431b03e59 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5*PK3i zYX8ovu<#@a zi3y5|^Ocq7tEx_ym#5A<-@kqP_Vw%6FVCL?4ZL{j)XCe|t{!J#s9|6@!OVP`mGuM=adKYZ<-IH*a1Q8a zLBTt+vJVs$&&$i7Qc|2HDS1js>71JCDGiO6`ucB8O>Y<(-Lg2S;$moZg+apKE zr>-uS?d=a+TmSO+{}mAMB_Lp(jm_tim{>)sSTY3_tV^C;Ir;f`z#_LU7NHwUI43XhWaiQ6m~v8Rsn_%q z9BY`Co)ppY7m7J~=>X?s4c{dJf*i+Ai|Hkci5y6J%Al?rf2iZ7l0k={qH~8vV#9%h z%nIIJGLDm69`MTuxOF%@R64{WXIJ&+!o)C4liX8F>@F^ZWual89Hnn zJ9Z#Jfi6yrHCLBHV~{~$i$hdS-X`xSX zqEK?0Ol+Z1a-UFeoK9|_QF6bMq_v-@w4tfDrmd@xoWQBGx}~nZthCw5(Cgdc|Nj5S z#>dpv)yBui)Ya7I=jPqr-1ztR{r&y=`ug|x_xASo@$vEO?Ck03>EYqw*x1C8ros^W6i;IhYe}Dh~{{R30A^8LW004dfEC2ui z01^NU000NEfB=GngoT8CeR^YGRuBjw8z3bsHAhf_eS3Fm8W}eO8y_SoF-1>Pf_!*x zXkHfz9vmYmFF{RGPJ(%HU~F3x1|1?MEjvq6QAmPe0c&qu5(NU2l~7bkK7wayWnx(t zCj=^`r%XaTf@p1UbXXM$2QNcSRZd1dI)ZFwb9P!03ta3_f(!|e95V#Hkz>cs6$%U* iSi1HD2Mrj4$keezrwfJ$4$2YXVM7KBLnsXe0suQ`DE0yX literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/RE.gif b/frontends/dnet-is-application/src/assets/images/flags/RE.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9e39b8a8f2132e4bd3e061a49615938ffc7baf4 GIT binary patch literal 863 zcmYjQT}TvB6#hnb-KC`L-dG0Lz(6EOVl#uag3=Z<*%i?jiv`Ej(#_T}H|9Y|U!tvq zEGh#dBngWmnJMbL+&Slb=bZ0;=gzU?^}(7B zh9dj`HVRxDzcz~M?!mSK=KwZ^9zmZ2dj@p>jX9_1KbKNBfS-Wo#VDWy%*wtCA^iaC z3&p2~W3wfNY&`{y5)$A7w;;X(cLk6qgykuinCI=kvYlwyWd$fT4tXGJp7E@soYv*vE;Lc|`HRTbfz z7r7=ugT-eE1A;+ddQG~Xb~V~~<(6mlCRo-YCnE+Ff~Sa0C2|JBHUy9tjUkOa1LsB(ihL<5?mXEC`*ctjEHm5h2koDf(fVza6-m` z@_(ziNW@7^6En8Z#MUu^ZvvkLOaV;bg*E`L`Xr6A)IBFFS``}v&eU?Lbxc@h9Xi1yV@*K* zrtq>IaW#7*OE#u79?EDrlGeCCtL>1xJ8AGZM~XnlSSlwBi}Zg$VqNV zb3^i%W;Smt?cH~F6T=xG+QM*VE5q5%jAu46p4-NJZaedtEzD;&vtHcJesC50+0C4X zR&!q2!*yjZ*R?&o=eF}6TFrZ7zreBee7BE?+&e09cDwkcT@nwE%O2ez`Q)tPlXHq! z_RGIGuXgQ#%Iizo?{4V7yQzO}m+q&VrVr0r{CI5l>ygu+r*8jVdHsLk|L;}6-P3MA zp9Z|W9dltT>(@J0=hw1c-OPJ;kHqt1Y9B9}{<`h-@|@eh2fkl#`u%wjct%^`s=4fa zSM8UWMI*Kdxl-C=nZ8Fw)>TJ5zRBM-|?sjvX zy;gdM>+|z%ZXd2c!y=Cm1+RGca<vYsa)Dx_k-!p_a=^@pL!g-gt| z)Iyf)i+ch)k08ekgCdr$8M-+yRFs~$_a6`ylHstJxTI55H}=|@lPnqha*ZN#1`-pL YPEFB?*|(&#d8Pk6Yqn%*9u5X;01E>#JOBUy literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/RS.gif b/frontends/dnet-is-application/src/assets/images/flags/RS.gif new file mode 100644 index 0000000000000000000000000000000000000000..80fc7976f699f33047afb7d58d76666a5000e0b6 GIT binary patch literal 535 zcmZ?wbhEHb6k_0Ec*el6&&=+Oq4BN4s0)VrFP1OdXKE*uclqs?Kj&f%-+uXf*20`2 z`h-yKMTUg4XKP#@&!087w(D#`7+?IMrmC4QHf=m(WOAoI@l2V~SqIyTz4B)o^p9Ct z%};GOVq(P*f4ViT_w&UocUxM{7#Kg^yy$FM*!eX3W$RB}oH1j?_A3|b%RZbq_2|$M zzQm*L^G{qb&^u#jblT4J&V(s<8Z)1tJn-)Lkuyd{cXA_M?b^W*ef*4(amS*w49TbY zk`6MYpTA&au+Q91sPMwuFTc+i8~^|RpJ50B#h)x-SL=XCP@FKZmozvvHCZw?w|6w_ ziyA1Ib~f8h(vwi(6Xar^G<&xFJXUEbNpV?*dCQmEtP+x8(lnFTS+#ky?KU|zesvaI z-fjE$TOYE}Fjq9O;y!fxw8J?b0V6{(VYYMEuRGpiS60>LFy_4V__6b|XIdf(&)>X# M_x{7jH;oL|0NcBur2qf` literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/RU.gif b/frontends/dnet-is-application/src/assets/images/flags/RU.gif new file mode 100644 index 0000000000000000000000000000000000000000..81c864f01a602fcd62a34424dd91e56b3fe4237b GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5TEfC1uD3G>BC~1Xg;u4AMb<){u z6)X1XH6AglKct>8!K7-7Me_l(x*cxQZ@TthaOyg0UAe}gVY^$`p@6w}{AOGYntwN7 z;;Hbt*L*s6WvzLbx%_V4y2m#kzIgur+l~8AUw`_+5VxE;VI^zaQqJU+oQcbMGdJ-h zEtf6dCtI{lzIcm%`x(>DGX~}B%^UYPO~2_h>5^mb3Ac%7{1@C0n0qUD*5!yrcf;pg zj$3*+ZRNe~2TvY8bNSfu<7XHcPB1W>WM;m=%6f*C^#mv9MPA+;0s@yLB<{${K2cP> zq#(aUT6%+`;wydq^~%b7G&DY$n(o%pID{|`&!0bk^5n_GhYxSu zxN+^;wJTSyT)K4W!i5Xx&Ye4Z_UxH6XLj%2J$LThDO0A@*VhB15*($Y1hFBY_>+Z^ zfngSd4oCwiPcU$tW?00w6!%@B>G6b}glc^e-FL8lg0B_WnWKNOd6i;DS9TTt=n5Es8*bP>lM#v|=L zqMmLOEG{~6@yc4~91-|&^t7mkSD!-SBcO3QQ5(+8P%_|P=h5<+;!*g}wU<}6>cNEx zjtVR+tZW<#0tXwK*!X1(A|^a&aIncf*JHSN8LzBeJ=52d$?1GDjd>R)XijePonza; T^7CTx^1eCdY{}9*91PX~O$1C+ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/RW.gif b/frontends/dnet-is-application/src/assets/images/flags/RW.gif new file mode 100644 index 0000000000000000000000000000000000000000..61b24dfe0f770b3bafa2a0c17ba446a3cee5c570 GIT binary patch literal 929 zcmYjQT}TvB7(KIox&=bpy|N9iM3ISv57MueL_dq!ma<9oPz#NvCb8H^(O?f{Y9$pV zV!8AX8Cw)(_)rgqgt;?BQPhS+g~VDSyGh`Kl%aIHGi%Ug9=`8#zH`oZW@g9E@{-b; z9Ax7cu-8S@N)#Y-n7X^Dww@k7qHY)Mt)}UpM5`!oAB}vVxtmnBnWDGp#7P=_N^93s z(RF(Lio%UF=c4ZYH1~%_Ka+nOMeow!Gb-CiVBY{EdL}ZQ>t??_FaRh3fy)A3S7re) zD-m|5A@P>iRmsY;NYOzKM0Rh02f$NcG)EblxyHbBn@cRV8>FeRzYdAbjF;3-JV|3~1vz!!m(fFV>>=n!1S0E`Lv z1d{eOl4^QZt_8maa}w!56M%1C>nL^u*1VYdQRf;@1tk7Hiq^nNfyq&?-h+5Gc;%4X zqe3$+i=}zCLUFuF{NvEA;U0@s+NOir#B7gXmD0|cV4`EzXR#!cm}$RSYw}r^k~!;= z7MO9qAEBvYoQo=Zmnj)rF<7yr!JXCXa*LZ%tILhGvg?pOc{-HN4wzPYm*v07hRSy< zkNr=$7o3KYrrZH`OgGUR+W0 z!pTl0R&lwYG%(WA>vH$x?`mu>+|%0TTBvtje#zU;yFLDi{M>khi*nkBM?am&IG?@Y hV14vr*X{Scp_Qku-Pp72c}CXarJ?>{Z)*!S{RQth5E1|Y literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/SA.gif b/frontends/dnet-is-application/src/assets/images/flags/SA.gif new file mode 100644 index 0000000000000000000000000000000000000000..cc9c0304ab8a89e6771a85f23820e59a14949051 GIT binary patch literal 1004 zcmZ?wbhEHb6k_0E_|5z~ITi;K9IH$jDsA%v{3ETEWU%#>!T~ z##YA0Udql{!O2y@#a+(LThGf|%gbBE%U{dS70e~jBp_5PBwQ^lQY9kMCLz%%As8(v z+bt_qD<#`0E7KyQI6+aqU0ym{S~5jarCn9ELsh+7U3-eQQmL|Hk)r-=eZ^cw{aN~I zRcd;Z^fan9Oc$7HH|l8BY3VlW>b2_Wx9b~p7-*Gi8MGUi^qClU8(YkEMEXtkOWBY%0lLm7l*NKVxo2>xtI36K#2m@^TmEcAV%a zSW?iqyRmF}S;v8n%B7W!Ya16_S+M5(n$6cY8%)$U>NGU#H+7unU_Z;weuiE2_NcTS zskvKomK|OSj6QHQjuPaAfZ|UUMh1py3_2jqpgh6Aagu?NL&jr+!a*iBFO5p$W9;p$ z%px%YijPl-G_qNV6eg>k?Bo%Y@?m(G#4%NyN%x6IvAf_r%UXt$oz5J-Q*``Tw!L6# z4_fM!#m9MLar#7gy)XsNluvCw5-yFOcpfDm4_IU$J>iXj#mh6w!tzQPD;_vEOu;U;hAmKbj#&Y;N#WSJ zq%QMFTN+iqCAnd5dh5Z=*8RDi2UDt7EZlrk&c4bvy4NSI&or>mAuJ_0H9oH{!=R2g zZ&QG4zoO?9wfJRr>B~J6mRhB)aVpyEpR>xxtxwh}N7|u8F>aBmZ?jHNmqGXhlgLSC zX$yf0yt0omL@wESCj1KagN zdJKa*4Z`}2BPW?gOfbn_>l8QLDu07p@?5**Id<7g-SSp?mTwIxT;o%|C9rH$K>U2| zhMjKB{bk;*%>DZV(`SlwZq{FO+AFuhvt}0Sj&lLC*Gud>Wm-{ZzF--{%{#smCfIJ? zoUm~n`|1_erw+?5o2PJQ55w8LjA!<;UOUQr1tO;##JonxX#*qs%UpIf^RSWXx6yfm5hgpf(@1_w>%W!*xJy&8WPK4v~C WW*qWhjiU0g?rAD)$5ouuA#>RlG%{Ea zN>^&FvG}ou%POUV;xgw-EUt)5_9v|OigRW2$0!b@q|TK@t4s-9XAeC)Hx;&*^XI(h zd7tNb-R*@P9v|b*NV2_ z*I_<_QXE>wWZ`0fhqdch)GwKf|zq$&;l#=iokW1 zKcGBl_wtt*n-_{#(BSL3H>uq{EbAKeY z{p_aSbLNKAQqBI?e!6vRF*R2Ib};|6|C_)ztxtMo*x!2o%c`?+{kv%gYxpD=8~~|MlzRmoN7pJ-U4D+PRAt zfBpIM@bTkw7cM+{{P@j>_p{c|Q!CJ9aA07zX68)dWYuEj&E(}v=Hqhb63P{l$d!=D zk&rJ_kWZKAl;u>fR#!|=)Xdk^%GI*yv9Rc{u&%ZCnCcNQH^8maEns#)_@eN*<#8!% zQZm+OWNpZ5UEHdop|Wt}!os4$4LhWA!>GH+UnHINy+kVf=XHpW@e`D z?ru?0k$ZM+-O`vc$o#8kG!wF{Q)2yr~fQXax0x$1n0fBQ85{D%uj!H`2k(GU* zsCZspey*hCX+_0j%E~YG^{?vby)`wxYhm%#$?1oi+apKE!`9Zn{QZ9i1bht$_z)cY zDLni~T-^7>#OKk`FJfZ8r>1^MP5GUbb^7q(WBc|!x^?U7*|R@BetiGp#oK4kZeP9n z=g*(--@kwR_U+TBPp@CUe*XOV)2C1G-Me?~+ORBx3{;mvokd{H8C+UFfh>9*Voh2)6&w?(9lp+RFsvKm6nzk z5D?(y*+@!BNh6QH~|^ zvs06lU3xSslT^LM8->d_G=<%`MO0k6R0^F~xyALFjC&3Urt~yu`poiJx#(%PgmDT> zo5w?^Rz3yhOA8_wFXNRq%e%*6@-fM^lUGQ|B47f;Ax1V1DII|s%}0CrL=6rcC~o(Y zu_$`=WToPUqnrZbE+;e^o-_7Z6u)_K^RT-Dm$a0|5rqVe3-j%a|NIenvUq}nkcS$%FBsLPK^w_uO@a(Wb|N5mgeDLum%8rLmWf^ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/SE.gif b/frontends/dnet-is-application/src/assets/images/flags/SE.gif new file mode 100644 index 0000000000000000000000000000000000000000..4096b9a3dad6a2a57198a399b2218fcd37ee03f2 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5z`<Li`3f34C2|0s%u!(*Rg7DVAWX9rn#0~dkcs53QnD6TsrIc47UlI>=ZOw zA!fNp(rT-aX1#>@A~}acN-oC~9Cj$!uUD{JA!XR1?s-ziWTK+gEM?m{20<5;EGKC= zFEtInqUEw&-)p^f%nd`IO{RgnEW?kP1@CcAzH1kI#@KtAd-?;1m}AcIr+u;?d8S=; zPq`3~|JWzna$5dO=pG|9?xyP zTG4-}v9)96nzi}G#q$;|nlx=%MRoO*>C-1qo7UXcHgDm=^2(yZf`Dr~cpn~-y|PQ; z-DUk#TMVx5HT(6z>G?T_SC`!WKlT6lAmG=dxF3&F&#vX#yDsD0frjIY`HwE-Keoq$9LA8+S_#P>inQ-IN!R|#a8cIGZ3KW^ywftDVT{v{qd74vO(42xsXOGF+VbeIy z9Lb!l>e0wxJIf{WysF(SgHWLv?EG`htN#4Se9U%E#=88~iB9DJ9w}qq8($>1sQE~m zrkq=1XzZrY%*4!6BG_``P$LVsh(bX^L&E_jeIJ_+#|%Ls-k?6&VgHG45Al zJgCfkSe5ml8tXv~&f{8KCv|xbY4e^j5V&X|aok+us*UUoN5%VI+K>G7p9Py<53zU? zWA`G;?tOyO#}v0~;dWm#eV?Rwe#!R#nj7#wJK$q(;M@GLw*}$#rN#e0ygeY#uwRk+ zh${Ob4X&d){D*V}j_3%TGZHyxA$`J9_N0~k9VfM0?%LLTE%;EZ&;8uUADyM&CpOgjx?b#WIkS7m`}*A1 z&BY%(D_^u#Y|l>kIi>AMZ^Q4+E9>K(z_yhWfL+cfGoO>-&r6|Ni~^`}gmkKYxDz{{8FMub)4E z{`m3Z+qZ9DzkdDn>C?xLAK$%u_vX!;*RNl{diCnXix*FyK7I1!$-{>a@7=q1`}XZy zw{G3IapT&xYgevZxpe8$#fuj&T)1%l{P}a|&YcAY{h2eTPMtb_{P>Y0NA~aEzh}>$ zojZ4K*sx*w^5wwD0!P{?L7fm#{K>+|z%YS92V@*5PcU$tVqoNu@z|hnP|K?*$FV8N znU$SW%4f%dhs>Ofnk6okhn{-$vU5tfY?yHHaEB1n$qzFov2gKma*H@DXlQii5LRM| zic~u4IZ;9}Ovb6&x1GFt_l@3LSaQCu5TNNJL@Diir-kjV%11 sCad>JndE<9@j7y1q61SKpXjf}>3p*pa^J`}Y{@vF+`NI8jfKG)0HGXXR{#J2 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/SH.gif b/frontends/dnet-is-application/src/assets/images/flags/SH.gif new file mode 100644 index 0000000000000000000000000000000000000000..c9879dd438057328984e5621ee79b0ee9d39521d GIT binary patch literal 511 zcmZ?wbh9u|6k_0Hc*Xz$Y0Rvd!t5z59JwM~X~H}ie7tGw{Kfi`nU|!bq-0Cv6iRiJ zvXYddj5U+|jY`~%s}jtMc3HZoSrr_$adEb7e_(IzuG1NRF~Q-ZXUP1 zJOjOZeEfQz2Y9^-@=gp(PY$1)966;hI%YvkRa1P=uj^GfzMys4Hay(CvCboX@{o9-&snl3 zwPIO$=f>ppd^zg^2DLO+?JQR9OfJ220kaZO^E^ejCPkNO(}>B&q1`4y&2E_s9TO%w zB~CW-DzFZ1bd2o`C|vHByD+q5nSai#fZW+mp~YFP8&dM>xb)J5%<|-2s`dOEjC{*1 zLh9{eJKfS}MU*d#s#v^q`$Y!5Y-WQzPSZkOt8!V-7X7Fx2EmPHk)2N2i!CBrEF)Xo zvgY`gtqv$%;hfatl{qD@VMAKmrkt)#Sch9^&!6p* z;@U3FyHAdPx17KZS%Do&qQ^C*4ya2WGEh2Wrg_;)`;fWz3|*DQMjGp_^ly1sFE-VA z=wr9b$!xu?@nt{9qaL=qT&#|G*}sVmcpl|{V*u{PiB;d~*)f1{`CfzZH9De#gW zP;m6-3(yHH=m=cmHC4qjs>LHfp|PH?A|c=ar;689HQS^q9RUqaOpJmFM#&9}J*R3o zW-U1p(BRm~GE3mX5e6njyQ)1BN{2awR6YAR{#;0KY+@Hua9NPRc(_eK$tpu2qJ^Vf z)GXu5jz(p6eg((6Hy0E?uyBfr2KfXODl+#78hSMpTy$C>Z&UK*$jsp5esUJIKi*vY z{H*VQVfYf8&LCCp8OGT+mM97@;}&m>TH!D=iM3nYB=^n=!(g{F({;rlXOPQod0eva^4ksk7 zJ9+NeWg8~0+COpCfh{|Z-`{iS!J!lX{{yuW0E$0ZSU^g2Km^E623Ds81-9lChvO^O zE$Q4;P`T`b)(#V&H@{PCxaJjH*AP=?Z99BIM{nMF7e>alPP08yCtH4DY2cGY8LR=W#zI^G literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/SK.gif b/frontends/dnet-is-application/src/assets/images/flags/SK.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea8da1e0f4ea7c9c12d56cce697ed8fa00e096d5 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5+nXu!o}g0tFt<{e*5wJ-G|Q)A3wWt z?IxpMu0cq%Mf_y5sBWj+rH<)y^gMIia^^XuO!2Q+>r=EipnO$8>57IxblUg>V zwQo`M?@|xx)K8k{mp?P6Ze>W}w9@GZK7alG?8U1SXU?x)yYAtWr^k*T|NiOYnWXqL z3=HR(nJ=)io?&G@%gK3-m-mc-z$FQZ8`4q_Wo54@$X`%VJgca1G#~ftrn%I7xbY}OHZp=JZ!|2S`D{b4z!FVV+ P{hYKJTe36{2ZJ>L)+s*& literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/SL.gif b/frontends/dnet-is-application/src/assets/images/flags/SL.gif new file mode 100644 index 0000000000000000000000000000000000000000..474ddc315913871ef7cefba2a6ae228addc5b9b1 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5de0V z2algT{r%_f&tJbkd-3Y#?YrkMUS^1#%No0oHD(@f`bvTHRT7!YQFCO zt{C61S-4!cbd5&FEYtR5dWB02N>^Ak?KY`gXW6jbta7c}v`bE%`~BzL2$*xtZ~A$! z2}hjD=LPib@oHERyWmn_$EMh6hjP~3&0c=FaQ$6|nEA|c3pf)O%9d_bN|~(Rc0?<8 zu36nir>Pg+CL9fzb2)G2l^3sGU%PSh%GIljmMpw=_eS0V$NDY)bsGaZw#W7EOtmOw zQ1)c7E@!r{k!k4~r~F0s zX;ZBt8jX^BtfT5I8a4(tuZ!&6ozSvAx^H)K&!&u7hf1u=7*xF&9I9FED_Ol-1pHbg zq9!R?MoDDOvZ&tR*1R>Kb#wUC16fB;9QyhD`I^U}j~zXJ=*O?G-+z92 z_u=)!$M>$?xP0Z>#W!zXK7an~$M^65{{8#&=g+TSzkdGw`R&`cPoF-$d-v|ut5;8- zK7I1!$-{>aZ``E!9 zt=yATm>#xRHmCK7>jW)|xOmBxN76WzMeJm8dcXqPnl~>5Szh?d+gJ2($Ot$HF7ceM z7ufYB;Kq(X#p8VPnhk$m RC^oh8@vg zMo@rXfNRV<@+qv0hZD;q12e&&?`8+4g1)E9z|5L!%(wq%-#ay%SP2G}gPG-pz_{{w zW)1(N19%Sn1~fZH039IWa@B+A3y|;pJUpnc6xqn$4m5rt0aj1}aae3+K$as!reboP zwl?xF_d&@Is|n%RXW%vP9@sb}eK4RClYgT3*631u-Qp%R?RH5oqDvr)oXI8WhGZks zj-X6PM$}47IpY~yvlk6!vy@+Dj&-)%$arJ+4a@)|U|7mX&!W~k6R!sIx5hwHLYypy zvVjUt7u*J_O$Z=w82vh-B9rAX?Z2C*n;I{;aueq#p|rw-SkJ{|dmer85clElh&j5G zy8){8fjMKWEy=nm^PS&<7}SdXK^fbOIc}1uK}S&p+OS zBke#N9KI898fYPr4pao-4}fxHH&FV26_4g13{N9s8ZDeLgW(6mSB5l$#wujy2cz5u zV3VPkAtjEHl5@49wMT`%g`A;rpcvHjrwjFf@o(?)7e7^Lx{l*t!Bq|;4Z=$uu@I8Y zpbZiJ0%}#=Fi4K43X-Xf;}?|am5@Oigr7}nG8^EQ)QN*tWnIe4Mg1_Zcc-jr_U6*d(-Y3O{BwIC(XUj(P8LDZkD5aRsrR^ zMU^*c;tNqJ1-dBplcG9VQ&fMCK7FU?5!%>Cw2pE+=*kOP=%d_& z6zryjU$mf8;{!^4C%^(2)Os93ydUg6U=B35j;-*pIRR7s&;SB=AU-`~4KS||P85Ou zlGl~1op+gLfLw@*o&&?c17IRYduYRAE`M*s(azChrFSP`nzgwNh>wEZRZKyx)z&;r z6Hc9J&5jdu<#eYqDr!*X7E2fr>3b<>%cUwTryy-e28q#>b~#R^EPYs}6?G0b` z_-qX~s~~F)SwAkTxjYW<87;0{bLeqv0bAs&q~xXqVnF;AXRZ^foxe}-h-X;B=Zf&v zuLZa9nZ=aOIv4?PS2F_tj^f-cIEE*oF#j)!j}mVsk`ksALK=`<*#JyR_$3m~XCy>A zSG9#u1lA1FhQ0&*e`=k;e!%{7?&7tV%auJ z^X!1;YE$?-RoBLPY*ywp7LI(F?~$xb$!QM1Yn%7mEWs2e6%sWTpJz$sv!Q5#S$BS9 zM966_%bi}nD%c)St)TOA?t~|^ z39E!CGR9giX8Hq%?t5F#!<$zzxczoNWr>0{O`;%Xwdbs_y)$zA`lEKSvm@}NU}{fx zR%J)Zc SN&P%65uv7VUYwxo*!CN`WDJ%7 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/SO.gif b/frontends/dnet-is-application/src/assets/images/flags/SO.gif new file mode 100644 index 0000000000000000000000000000000000000000..472e0770f18833521f0eb71904e914be1ff5a85a GIT binary patch literal 998 zcmZ?wbhEHb6k_0E_|5P)w%_1^a@t%7p^fZ-DFU-)}U~WQOSDa zl658}YfVemT9mK1s@|#|SZ-Ul!?tRpbIU%x$a<%`EuI|*eS402H1DuVpJ<-c;n%Sz zY|0t`jy>K@n;r6JIv34}nsFg~$|?J-NuHHU66Rlzn{(N_dU^bu%i;Y8ed|{FH>^or zbR)27UF?)&;oUofTQ+7ay%RU}SY+?+i0+*kOKxQ^znj1MQQV{hd8_W{uezT$=S=eS zqmk_!qS`l63O=ue(#Z;!@|XXKh;_bnkv%GHcJ&gD)rVzTdX|=-mDHW~@83_R!VMCvNXN z_fS1|m3IDW8Mkbs;x)!4Yb|ScnpbS}=sMzDx5l^)Gyf6x#IBl%dZceIQ#J7!)w>B0V4$*Iimz^LqPE-3nK$V2ZIjC z8c?2K;5f{{$RXpgLBY`=!R*HZrqs4p12!>_0~3ed8t*P&(^VMPo(08^Rqa) zxF(z|KGq^??|FAafbs=Jm(Enb7b}um{CLGx9XMPbA87EHWZt17>7>loB_PGK%1lCl G!5RSKyEd}` literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/SR.gif b/frontends/dnet-is-application/src/assets/images/flags/SR.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ed129939ed244ae4390ed817ac2c96e111e3fc1 GIT binary patch literal 842 zcmZ?wbhEHbZ kFPnqK2Zh5e{EBXKJT@vFZ51>$D!Fk%!KsyziHX4)09Z5&=>Px# literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/SS.gif b/frontends/dnet-is-application/src/assets/images/flags/SS.gif new file mode 100644 index 0000000000000000000000000000000000000000..97a385ffd0fff54d5e749347be295fa6d5e67c22 GIT binary patch literal 312 zcmZ?wbh9u|6k_0HxXJ(mw^(@@+4wf|Yq5))vdOrqtEy;es;g;faqH%Am~<M*JY!C+eUu(^#bne_&l}>dTtW+UVFzcm_J}HXYiD5;d%F>VvJ*^^CZ+;CQaLw zTo#zRCNys&S3x{)We7*B8FRZfdxrsgr{0v=fqHX%3>F0HEDSlc!|4D2|6o^;Nhtng zVF78?0TCcSF|dUmXkl>Bk?L>YT-=Z&q%7RolwhH-?uL%iqYDKZaz3d(df^I!le;cO z@GyPYF=zF~0K2(8b?48!$nl9Qs%vPrwRdRpiz%q6Do>a=X`-}}>hu{iXQ?_eSOWk_ C&QG5J literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/ST.gif b/frontends/dnet-is-application/src/assets/images/flags/ST.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a2888c106484a681eddb5a106fd703cb3b4030a GIT binary patch literal 946 zcmYjQT}TvB6#iyAx*{8G_b$tlCbme3Ewz||6-41;WhskBWcVo1Cb3CB zVvAZt^iV;qMTJ5}57zGV5dAGhL|AA@?Dj{HnB~yz&aMv~=Hc8k-}%mWzL~pmb9w3N zdKVn{1#GhsbyD~VIm+qlcM97m+)L(8DruxE*XZdJ%3Va}9~vy8ZTso<8w!+@X`{hg zRM1PV?KCw_7cV&+hlz^Fd_$(20@+m1O;kbQKJqow;0>4goXo$}wx7n{(bsGmx=ZFX zl`N;Fz$~Cch6?u!-c%(s=K@6oajPif84v;P17j}bfq@tUlhuLNT|FbaD~2ba>y5ds zh>m~_OD3PvZYXx9_;C=JRE#Jw3y!|2jOqqdriLXnRk&Y>nJOU%i;oZn1cSiHlyWvo z6)C(LwtwjbOIYGOXb0@ze#zrQ$Utoh0tCm5Lovp!lP7qEA8JbS30*dn?Z6s0>Y5OM zw(nhB&*XcH&?0lqT_2xm;CdZIqb6G7qMnOAa2`;i0JG?E)5L1=GAXz&fKed&lCzW( z3XpydV&JwtBH&JmaJLkK8~DaXrOqa31>h;oC;(!T)Z#pH6ObH9NX-8s@LAx4KvF;# z9*@uP75XccoSY;$U>0Y@O0xDu(kT!H2$eEkfjIDq%H_Y=^<0?;9Nc?s9R>DYv z$yT@4k9akB<*3|alNvJ&mgd<2C8bT`hw3gr>Ni-WB|4~nn(Y^?Qp!0R91qRr7%agg zW-8!mi1AsLls;>c7MMx>KSK40NiM3aU4BU0{BwR@EncilRI9FJ6t!;gA=Lx5G*Sh?LHC-n!cpXD+=QniOvYf8arrRnV8^~+V3)M=xOmALC zPq1cBSHxa5KGyxJxhpewX=w45K3~R}`Nh?Bk?mgN^!&h)i_7jrGmmHg{QN%REL)GY F{{U0O9ESh^ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/SV.gif b/frontends/dnet-is-application/src/assets/images/flags/SV.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea8925c8531ff6629481f60cbce1a71d1a5c4c9c GIT binary patch literal 901 zcmYLIUr19?82{ZhQ%TIuk;}zJs4X$@VWCA<4-Gy|6a58#6SaDF9tls>qEfUtGdx03PGpa;BL=YbXO zqx>Gq9w`Yi*BMcX*$5ihvO%b+iEu2_d}A2|obvdZDV!7PnYOxKiv$xx#sr53=nN(u zz<#)jfmu^<1F-{8i6TbFFOCfkgCoc_jqBi4IDst=8%IjIkBkJnG3`k8>eF7^tLEB?uGp*hvV(cy5nk7aML0!NC8Iv0KYJ8jW4mpdsg$W0UL%`rI z&R3wn(x~>f-ekzC1%y0Ri;AhR$MaiPZSp2g;J-r&P_FiEXQg+i*sA? z;nLF=JY~KRd#2hNVk74)A*Hgp)Ui1fQeIV^=yx?bhpfex+okTa^|9e2iog2t=+ygf gR%>}}WqS4JlL9iX4t;2-UVTRkPDSpNIi0xtA8ir++5i9m literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/SX.gif b/frontends/dnet-is-application/src/assets/images/flags/SX.gif new file mode 100644 index 0000000000000000000000000000000000000000..41c49114c994bb26edb4fa853e1d79a9189a6bf3 GIT binary patch literal 317 zcmZ?wbh9u|6k_0ExXJ(l(-;_LiZb-RV&M7D!0?}!myd6Os_L@;s;d8ujEqgz{|}D{ zkJz7)bL@XkR%+?2hKBS18yY4yrxmuXpE%+4|EW{^W~^H@f5DdKMD|4*KJae2F=-4 z_r8Dm_~-kZf4^S-{||Hm2|)2D3kyiO4u}BxiGeN3!86fAN2=Yx|IrDTLw-Ha1l>v_ zd4iPIES)*Ur7MRqttr6B;A-=Myxp-2PqR&qvSjzbJu|2 z|FwGz4EOHcd;b6Vdj^L0|K9`kem{2XI}rT;{-1&2KTzQ)7!84;76Lk;901A-3>*av z${aEt8xkDZne;SbPHad#%*i0*HHD*a(a}}`!;CvK5|rKhr8F5%I2bXvu(1e4C{z|X zFmtMU_Vq+6Ff`3zW0L8Zx$uzBG;Wm@DwEv;dpqof}xYhf{_$&@A1MI2a4g&EAuD>0z%+Cb6? zn!Uoowm#IYK--Xld}%xI9AZ||N!NhUoJ^QZ1)>1UCa0ym8G^28ioZ4uXB9+obHLT6 zwuD}v;T`}DQ=I3&!|;V+j$w)Cz`TXb2_}N;K@&rItBv)-99Gw$#E@DA-Au&|q#-Wp znO}q-|59m8JIy{(YvKLt@Hn7qpd4xm55e3HsdWl4^xjOVD$Vg+fPn|3={%q0v6&&2 zw(9&|-;ebnMq9a@8(#OwdRnDRl=5_1VV4rT-HJrmMJOs%U-@dw1KEw@;pZ zkvUCE_l#SgcHIu|ENNCkult({$c}D%-9lGhiS5vNm;LOmJCJq-l%p}Y^Ggr3`0bgQ z{32<4ud>j0>Rp~K-|7nZx=-CV)c9e_WSX{7Yvr=6#SC|(gXi3V=JBfOm%Sg21jqjX D94i$4 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/TC.gif b/frontends/dnet-is-application/src/assets/images/flags/TC.gif new file mode 100644 index 0000000000000000000000000000000000000000..b80c5d349f06548d476764b298dd46795c35a5d1 GIT binary patch literal 1004 zcmZ?wbhEHb6k_0E_|5Z zFflxF!;0MGeWNcepRJ$@Hs)Ru}f=@m!yJ7{qY=WYB zm63CeZ{otZ{KZ^KDZHwwLK>+e+IeES*%JB%vZkeq=B4^>ZJIWvdX6Q!_C+S{^#;ym zChj$+9<}yC9quvHokDv8Qx~{Lw1;LcaP+SXPMzi((-xOIjX^4gK{|#(Dw-@Q%WqfN~+L&G}T$g|bdx68n-R?9Y5+b-WKsL#N; z)Gln2gvd1%SazOfg|I~T@Y4iM2 zW(B6t3rL+4kT%CRX<9()%#`w#VR^HAS`*i=Xj?fmbl>W<7bjC69Ler#&Uv>#^31yQ zW9#d7Ew6dCGw#&v*sh3(I|~;8qY@mYqXe-bp!k!8k%3_rgAPaoC{HkOoMd3+knz}{ z;K(H#V8XERV3U%V?~)A0%WC`zjlu?^1qlk1Te!6rr0i@w)~DdiBr2oOkkHV;%I}fz z@{n7Hpi@0dUBdyz#&!-VpNNHwDMBh<9!(r;1Rk+83tAZ^thl(SL)CNYq(1^XnA+q8 zje|lo8MaN5<3G7RV3`<-*X^PPLE&Qz9` zHDzEgegX|PF*qQKwqWp*7_@PtA^DsClgYbv6g4T52X&plNN{od{2XO!7>HLQEGVA~?-DtAZXDiA85{Bdxv_ z9;;YfRhVm@ZPqbfn0*4%!3Y?pHiU;^vBttHL1}FOByN(E5d$PpCudWLMIDzd2;g1P zyCZ~}p6nf_-9Ce^XguI_E>8BL(FZrw8`DuuqSw>W!EM#m6y0p4S|eDS$~vN~iL$G3 z+!VrGH8VZNk|<*f2BR7SLO^(d5=#l*&fm{5E{!s{EE2Ac0#F^_NQm?FLCpuXI3xex zDDI5G6x;yE>|6|A89p)?3>uSVrh-u}1F*u7#Sk~Q5tmc3ye+sDMAncJbQ#FnuGNlO zK;NFbyr@!z8Z{h0io)a24GiTHZ!CXkJ*@4 z`H~o7#KY-M|0rt*&e5N9G0#_Juyo);GU@ ha@Z5AE&K8ET(JDXQ+NA?+zMg0GpAuT0KXrn{s2P&`Qrcp literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/TF.gif b/frontends/dnet-is-application/src/assets/images/flags/TF.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe3ee3d60b92203da38e2643568f3454314a5d88 GIT binary patch literal 863 zcmYjQQAiX~6g?w5>{3$pUMz!aU?37Cv6aDEL1~MbxFY&vvEZ0mTDGpaG9QBWlUWH_ zR0c*!Y*3UCksn4MgF6!jiGBtvp(U}CKYa+Tt@OGxQ`G%=bMHO(zVpt#bMjPmsG^l2 zA3uQ2JkRE@&HSo|a4gR~fGy#tFy_Ht03Cm0?&DaJv+T$AOSH4?G9n082ZiwQp8To080=B>I6>$xL~eL+Adw+}MtYb6F;?3jc!0 z)(g5=e1kcW1`A|0Lqd%U@&fbijw35 zofcowsNh614o@K3f-v-+x9K*S_s`)H;vKp_md+-))(26ni`KM=anX)~Vky-GMnWbq zl|V(;q7~!Xd7ux7F7k^U-9VQ!1R@+orp`Oq1AiOP3V-(=6q{&bdIv%Y#1r6zi~%M8 zMlm=ATW|}yBQ&vfP2iirCjm=96Cp*!AvnnZtOx`IGIkgl#jUl66jouZ!4-5F2!K2K zTtFRQ{+YY-G0s(P)e`<0$_~P`z^K%(k0ad(9?@w7YE;8CncJrllEaPgucMQ*<0gyP zdN!zEbK`Uc#c`5bDY`&S!aKQs)$uC>g~6D2U0<>Ahp4h z1BVKOy;ga(R!-gs@#OA)j*Y-D-M8%C@YqnAEt&mKczs79`-+sw$x8V6wvx`5YSq=P wa(N#db+JEKU&0WVXe`wxO^8Q+B;6_w=wOVs;-|0tnN&$}i2HUac!p=60#k#vaPc6jq-{e ziqdJ)N(IXLGxYVR>YL6n)vDAoondOwYGBZ0VAgBqwA{&QiIdwhH@5|D{u}(==DPW> z^$%DZ5U?g7U{!!%t$=d3qG`8@S+}XjDmUlZPJ!zK{8#$LRau#bvgEGdDP1Sfv{PZy z38Phaf>zuJ&RWcD7Q~dZlx@*f*V1Lom8&?)S8z6O5pLcfJ@J4_@igVyg<1>GTePn> zn045?f2;Yr+n)1}yKK1^yzY9y;?uHIcd;%#F1h)-!Sqe~3-*{Edg8SDq}}N^f&1?I zo_ZNNdk@d%D_Vyi*=@bxbncDcv4;WY--IsR&UgF_$FVb9XD;%cIxl(SuIby4VQ0>8 zoIT5V<%;0#+tT;$$-j7^`}(!f&Yjvvju?IY>hR--%lY$`4<5Mu`xo&4fAG6^{+~Vt z{rwyM`*--1Zsn!j90%ud?4QeVXrb`g^}3Ia`F^>Xd2WeFJp)5MGxHgC_OpC^^;}$6 zl$4e$Do)YVeD2~rS5NPlqvNmm`2X42KeDo}6cv4+K7CVV#qPG&kDE6AzkB!ZOAr9Y zFF2k@2`nL?_>+Z^fngzo4oD7^Cm1+RGca<%Z-f9>sk&f zrTNS>PCLQj^P!=!iHWJrXM&+~3$Ki2-UWey`(KG5|fUw^Rp#O^KdX&0|2C7Iivsp literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/TH.gif b/frontends/dnet-is-application/src/assets/images/flags/TH.gif new file mode 100644 index 0000000000000000000000000000000000000000..82e55c07c8fd2dd719a94900e256709e4af78e17 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5V1e8JmOAVBl8>p->P+4lMw#rI( zo0aZ*YyFM(Mq91*S38)l^RYkTX0^rJeqVs|VGr9)t~N{T%=)7IPQ?XX3ia9@8+0br zduLME#W0^OL7r=4gAPRcZ_7!zof3IEJK=g-^qIV*n~C8E^OA2Crrk-6J{lRYCM)4o zS@zwc^s5D_m&&s5lx5#YjoDe8d8so0T0{Arj=Dz`g*$7@_H{I#m_FfJP5GLs{b%|* z4{l!jcH4%x7tVb;dHng!>p!nw{dVWpj}^<#E?s=0Aiw?8$tMdJ9A7a1*yc?)4jy>A zY2)QnCtpsPvi97$lV{JKICJKBeSOW(pI;t6ymRf^#VJ!J{{R2`*ROBy-o1MM{PC45 z7k2O7@%{Uk8WrJcW#OZi@+WOoj@qhR^w2-!V|q8-eukay>&&3r=|SHrla40`oJb8i zm=y4{G5bV%*oC~956$_vtFtbYr!9#K`Z>8_T}JfFo~m7iDaWdEE;N^Xo!#|xYTK_R zQ@$*m^zYxlKY#vw`}XbAr%z9xK7I1!$-{>aZ``C&YO7cQIuy7Kt(J$v?S*suW@ zt>EY#CGdrS;!hSv28MYIIv_=$Ji)+mnt_o+#$$tmqebC|ABHL({jyd?&#vs8oPJ)u zG3COJ%EfKI(uT>0<``~v^POeHw6Wo2kZad;?dUBL4=<^n648ohStL=^a)L`hTqEa4 zz@gSY1&0ETCxr_hW zd9w?9@C#^g$Z}8)4TQ`@kC}+dUfE2ng&g$%7;?MJ#9cG-#7u0;g|cVBV(wZI*#qX_dKG(jeOq^4nN8>MX3F^%`0QdaO%?71u~jdqu=omLKrjeQZAyI+*=ys~P}=$cSj-}) zAPl5}mk^sGR2uNx5Wv4|bVeDsJjFlCI|FgPs#Cz37*4s+6hJk!+tW*WD!)~MHd<@$ z=B2F`t~WunYNBmPG;?tsnRlcJsb;0ego$#o7#Ca@zzh&sg@fD+_H*(HE29gN-xzN7!JPf+vmyb02}Rol$WP;%yhTRrysiP zRVqJRn;$xMxS(<4{Ro^H!Swy!hJqf4G*Ec)O~Vao)HibU$l}V_r}4%YWlkqf{{ezr B6;%KL literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/TK.gif b/frontends/dnet-is-application/src/assets/images/flags/TK.gif new file mode 100644 index 0000000000000000000000000000000000000000..87789f79f6154f7d346869622d6893ccf19e8b82 GIT binary patch literal 543 zcmZ?wbhEHb6k_0Hc*ek>tX$2&kiyHG$I6n2^Pf7~7P!^$aAqUh=LbF62MlLF9+L?NLfPWCJo zmUI!`td}8v%kp}BbP5D`viDiJ?Mo>N=sJ0Y;N*$=vY@V>70e##{N}nCvUi-srk&?m761rhcoL%uy3AYNtsG8 z14F8iP$2_D8pGfKia%Mv4$%RTpg3V*uW68QSLHWwk#v=};|mPb=?!GCFx3$C6mS;t zlL`v3mosM!ViFUVRj~B+ax<|C3S#HgH4X}NvNg0e6Y|hh(Ni+wWE7NU2~^jz;qlj3 z=1^1<=5|=mvQ;KvE>}Q+_M-I<*Y`epx}MpQ`7zV8M*%*p-nW<-CVczOHi4m$!5RR6 C^>~i} literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/TL.gif b/frontends/dnet-is-application/src/assets/images/flags/TL.gif new file mode 100644 index 0000000000000000000000000000000000000000..e92b48f9caef766e207096257d686f366cebff57 GIT binary patch literal 182 zcmZ?wbh9u|6k_0HIKlt|{}~uUc$j$j_<8vR#Kgq-#2LOzG3x2*I~XwjH)FK1w)=0* z_}`h))r~PeK0YFm;Zio^zjCJO{S5z?GX7u3_~16i7|7HC8pW*+1pkXLL@h1xl zNI(Zffb3*oHC|A_l9D-(ae@oit7Q#_foHOrjygGnUA?jLI4fg8ih+=Hp5cR^4GlNe Ru=%Ww3Z0~p&Be%I4FKCrHsJsO literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/TM.gif b/frontends/dnet-is-application/src/assets/images/flags/TM.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac548827fed926606a545012e0085f9aab69667f GIT binary patch literal 927 zcmYk5acEOV9LK*8Z;6$F-CYQeHVmC%D25>#rD`T!ee1NO5^CLFZ}3{9mJ;eK3eSS5 zvzsd_orI8zh)9{Rbt<;Be-r|i=Dq$gidyjxky6_#C28a6%0sISocEFn9{0y__xXMA z`~4mFx-OIH?c28ZvJ;u zomGSX2ID^w`(iMi@-_~5?e0*1K=nWJr&A=KQUlFI86f#vr|ol|LSMLXs?js%N!E~b z!ZW@!9-oURn@J(zw^L!|KCy3wBeRioDnP~rK=R#@*i=KEZ@xBsv~FkyhH>2Aj?6IV5MTtQc}sFpi9!NiOIC(Z2S>{O zq9KO*6@ehDYuxvkFCXFtz-PfNa0-rLTlynI>WaLUbT1@8vkos~9&mv<2SF@bXec5; zbkgcDX>nhU{>eI8a%{#B1^XAV=Oxr*P@tc5O&D(0wgGXm)_qMA%Q0rC;Ky|ypWsc5 zpFsI3DFc*z-YZ}?f0E`%86Kw!yI4U`^&Ni}gsaC{-qQP8PH98Gc zuHMy(2w<&VCO_Ai#&UIn{~N&_uyUZH)Tj4gq5-UaMC3T2nU+OMfxm}T^d|U0_4a6w zMe7~YQEhIehtqmt=X`X!Yo*enSt=M?kz*!Xp*hiKUC08<&J%%aGJnnZAt%eCXxl@S z+IDCA&WdgAxlpZ9B~-hFPgZKmwJw-eDa*$9M4UNqD~9tY+-uK5s(v7S-FczYy<@Zb zS5%m$uG4Gv>CP+evhA&tExP1(RfJV`vwSf!onnTb^D0VQVCP`N+s`a#cwGuB=)rlU-l- L{k*Vk1NMFdgmN!W literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/TN.gif b/frontends/dnet-is-application/src/assets/images/flags/TN.gif new file mode 100644 index 0000000000000000000000000000000000000000..2d0851c91669f1c450e5980ebc599280df4bf1ba GIT binary patch literal 1005 zcmZ?wbhEHb6k_0E_|5$a9_17dT@eaKupPxT(Z3Gl?EG!K*g1HyjmD*~(AVmz-}Xebz;N zxw+yhE9J+2`j7nd=bI~Tuv5F_t-skp<5{rjHYcrp?s~i3ba%Mu9P~6;>7aGk+wgj@ z#q|)2)BdI>{Y;Mf7{7_JJMC}wKEdfih}C8fqmLrB5-xqsHoYS2s$B#g}5+|z%Y$L2c#L4Cm1+RF)(t-cx+H` zWM(t@vf|Pb)>c+lA&&zAkJtno*>r9!_|)PvS2z4w%1(x+V*)BnifbB_j`B#@7xI05 z_{p`cU&WE7E#XsIr>q^5gypI)&-?n6U5hxL1Rm|2p*K-TGDzeEmz1en*#QBIr<{EH zQF6LUDj5Pw<~a>#0u&9p1o-%$yqFo{A*5ojgqSJy&g2Dnk2R5+>DLdp|deYJ8 z)Z!p6Dj^ae(C9bAsN!0Nt>dER13bJOG6e+>56>|6sM`~ec<3-&^9Eiv76xkom%cO? literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/TO.gif b/frontends/dnet-is-application/src/assets/images/flags/TO.gif new file mode 100644 index 0000000000000000000000000000000000000000..162a66fa50de7e2c2d1a65c56273fb7bb9ac2f84 GIT binary patch literal 591 zcmV-V0K8Vb-H4bUA8&m9fM8x7JR5Xm7D z)g% z;#5faUQqE{PVHDs?O9CtUs3d3Q1o6<_Fqx#T~P68UD0b}eoII8zq;MY$NJ>r#ti|+ z5Cg~;4agb|$tD`lD<9J_C&)1-kRuzdGb`LfIEgJN&`Ch&QAoH;Lwz(a|sZ55gQKHI7j+!h^;NK|er5I55pckto-6 d%xHl^&t^e?Xx@S~t5&-@IA6VTwWg|$!Fnm9 z%`!&orOdX=Sshlg+ArgDT+ZdZme*}Puge+%uT2txJ0$$p$%gJ$jM^_BvPC=Tn10$R z)9kYrS%>Y4uQ-)ocdNeX+i=IT;+%iu-GJu10Sz|-n{K)0ZI5X_p&hYw`pRQdmL8nB z>e!O47rJJw+jQve!HciY-uZIm(#tbjYoZo$!(#V+kAKbjs5}a0|M3s_^tG_Z?cbE z7wI?EFLXg@#;%NvEg5-x^RC{w`s>fH&tE^UUBC9#>sObrTvlyVG3zsR?{C?M+?_Rxn_4Mh}Cr_R{eE9IjjT_glUAuJY(uE5b&Ye4V=FFK>r%nMQ z7aYl>1ojY6{K>+|z_5Tp2P6&36AT=u85lWaJT@peS~an}m^t~-VO9=qxsVeV6kRwQ zo8O(#G+}6M1I}#F^k9rEJuq8|La4=W{0065*sQ>@~ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/TR.gif b/frontends/dnet-is-application/src/assets/images/flags/TR.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c4926e063d3520c658a7c6668080ac70101418d GIT binary patch literal 995 zcmZ?wbhEHb6k_0E_|5Q%KF#tJs-b)d-VL-2?mDaK*Y#!jDew+fuV+h z;RGY&aYn|I%*-d4nUArsoMvS`#mahumGw9)>lt?T6P%pKIXTa9ab4u)y}-+Rl9#uG zi|ew0z%>z(Q(|H_B_wW0NSu?9I4dDBK~V6Rq~sl0+1s+R4-^&eD=J=4kUuXkKTA?_ ziL~@1HMJ9}s!z4GPpGS}QB-`Tum4hCf4#Eu5=F%`+S=RH)NUB)@6gbAYijz&)O5F& z);=Ab!+LrLbajs#7_8IMdT(WQ(#Y_bfx#&wqq`Os7tKu1nV6h5HvVj9_sz-atCQ1J zE2|wwMnBx#zPq{IvA4TzZ}-U2@u8E`PcN@$Zf=LIt$+FYK6P`u?CAK))AP5#|1W?4 z-vI%?0s`Lo_ljeBq2YIX`;X4f7tPJb3kuFxRo$I2+Z^fuV^(2V^lQPcU#CU|{5s@z|hnkd-GYW#wVElN?+eDit0F zmANDudAuAJUS7u4&CQ{ZV-a}xq_{DYHBaGWcYbj`KB*J|!RF3sMzJjSBAgW_$Xf^s zMf~{CbVAf9X&Hx1!*U0CAyFThj|&#HPccYdqampAypPdNLf}M4^P(ryjiXs41b?`l zm3JskNZ|+!=ANbJ-}Ogeh8sJFb#;M&Y1foflN2mjlp0qhFomv;*vfR%(D^|ZH@jSh Zh2!E*apQ~WE4FFyS^U?qS literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/TT.gif b/frontends/dnet-is-application/src/assets/images/flags/TT.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5190e132cc087bb2ee989c5b24b0c2390636623 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5#(GGV^?)ktK@HARy1XZKc@OFEo--6U zV<>RMQ0St$#4$68t2VN?9TiX8%Aa*nzwf2}*iZkFpZl;rU} zH{eUQ|BG~=&p83FGyOj02ENY@_?R2`B0JzidEA%Uln=G3-TWO#;b>hV0!ot+l)VR2~z`#I1KR;hz zUoS5&4-XF~Cnq~QI|Bm)ZEbCJb#+-;SxHGrAt51NUS3vKR%T{qV9bJJc$B~y0*XIb z7#SGmGw6U+fbs+b$7u#e4jGRP3XWDhCb1VTIQGpKmiO8+F!i{mCTr!?`G&Gvl zxUHGcxR_Sq8QH-i&}mNCoS_|lk|%pt7p%ks=2*yDVQ?>sgUgDEH6g|q@EaKvnK zJ-fhJh@m8C!--x6&EP2f!r&F6%%Q=CciU!@2rF3?b?7aLSXsHLs zBNnDh&JU)_>U%W&_;j3)#j{_hpu*X${eXgDK#RdcCmsbGK83(T8xs1I8cl*41Qt3S X>ov+0u)UGc$*|arEm@j}gTWdAr-UHQ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/TV.gif b/frontends/dnet-is-application/src/assets/images/flags/TV.gif new file mode 100644 index 0000000000000000000000000000000000000000..304ba6f84c30463ce665cc21ca68eeb63b527193 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5c7j0wbc}ZLHGiOcdc{r*2Zd%e5H`i@e*4yGUPsjJ|NSn5I*_qdC z&%G?3ziaxwYdQ1x%sTOS(*7F@FT5#OvcF>Wu_-4W%{l*a*_AgFj@~Vszj4;tCrhrq zU3u$c|B5Xoi?@|7+}wZYTJ_RxrE}L#J$QM=&9@8AJz8_;=TwTz|ND`L5c{$E(&KuHAIBVe5&?)%$AJ zA8grix_kfS?gN**_FwAQeXe8o+5W@V(tBo2I(D;Q`m(&Ki>IHuGwbYw-rZ+rpM9|C z%Cjj4FRi@!dfnakt8ctqfA`(G+pkw#ew4R-SHX&173&W+?l|4B?L^b&Bb|HCweL7F z_u}Ink3JNx+SR@7@bVka7hSl!=FY3e6&o9tu9&cW=lYv>Hr=_u@WiR^&0D(Gui9|? z?5aygcR#tl?CgOFo0jc)a(UX$<@=vqIP&z!(HDn~Jl}u#>7Lm;C#*a%chP}qOAgIE z_+Z2G!&A<_T7UWdhS#k*FZ(K{q(nYnyI_BS?Zwo9FHJeCV|?#bq`mK|{IP5O;hgw4 zt!2B~>ks(YHX3UddwBt4797K)1kMmp{K>+|z%ZXd2c!a&Cm1+RGca<M|Sri?W(l~Ss8k?4Khzn^bJaq9EmsWpwLGVOkbGw+VQAWY! zXQz1e;~i9tR3`AsnA#rOqM6)wO3Wa!K<1FJ^MV;VUJY*~Cb^uF5~~+!Wl(W%bI|i{ vdBf54gi}n)^3@l|DeA4FjTv2UJ~*&SUI zSo-BAwHRr7@UyF^O1MV`6qss-`Z#Czwk?(xa{Bu9%NYiSvy6;q7#YtoGoN8*zQD?Q zhL!aqJNsEq&MRD8*LZo)@$%jf5I8R+bX!E^o`l3D35kcYvQHEhuPDgBP*YnjE&W*LKkV#&IXT_3vU*@|_s7lcsgu(`FRxc_ZvTCK-+6kz@$mTX@Bc3#;FFKf z-@w3cety3L1Ahhtd<+Qqo00+yVQ@%eArybIFfuTdGw6WiKykvrzM_Glskx=KMO|A@ zMOxofoW;`4)jK>rzsXQh%0fuVM3l+K*()d|ucS#wOHxow)kuWd$-_T6yEv!Gz}QSv zP1jt4)!jEHv#=noNlso_Rz^WXm~G0mqKw2QE&)z{UTz*f_NB|SIAWX1asynftu}An zo|76E)l?elW^3tiZTYQ zXPcVlT3QxaTbJ0{mfPD`Iyu!kI##>5G`PFBxVbfXd3AVtwnfJ*2nm^#lDZ~5d|Gt$ zti;5{DJe^XLYKL^cZ5f-3Jjhd5;iX(d3{3iIzRtjPJhM7NjW-M_E~c(Rg=v_ds742 z<3z$#G((MrY^0SF3?yBY6n(V38^fFnef{eq(`OeIE~?I(S5dUMws>(ZhoOK`ytQ+c zpLK>y;*{*9iP^dH%k9hD^A z*|)pYX||6|Kj)=Y{_jPkOv(2oiaFi_$&Qswou*OwMxm{IAuZElU25bxry zoE4KQh4{Gq{d}!0EtnV>loS;M0s{Q~{oUN$oSdBO?Ch+ptV~T!_4W0&wYAmM)D#sJ zWo2b0BqT&cM1+Kd1OxT_FV|?B#&EH5F;kk7_r-s=vB?K&U1?PTh)+vQhZX74&(eEeqH!!Olm?q+X1(EH?D z$DMb5_ukEW@ng?n@qI@n_a2cuc2@b~4WnacP3}K)*>}Y8#5wmjpTch454!s};^X(E zHy@MUe$IdMvGmL_hO;La&m3nwcbxgmG3E=WSkD||y?C1a>~YR3=eVw&=RJ3l_r@iG z^CyLFUlqA`Q{vKDiHEmkpWIWta$f$$Bems=q+dVNzHwQ7!)nEMFZ4I9Q{K5%?e2B` zJ=--ty)oUtOY6u1-GlpdjvvH54IkdIxO&0#(pi)9r;LAmw)^$P>DD!? z2e^s9|V(+w6d^p=`2`~+|DJ&q*yV*aj`oen?;^R$ApK6ImK;QvN8-GA8li2 zW|1gJSjfyNqUpjB@@UD)iHeSO41!KeI3}t3Op*|MvD8~kD{!8}M5Co#({y9D#B5ZW za9PDV>rjK^<7Iw}JZ7rsDzSJxSZ14Ztj6$iTHgZq={kl^U)=i-IOU(JQQWNNH{Wfl mfu)s5$9dVtqH{HZliB#>T&I{g8kwB%m$PC^mgeDLum%9JGJq*+3ehHeDbv2f`vwpo_O89>+|$^;H|p> z*KP#dx*d1xcIufk42zdAu&^*NF)^Gy!+7QlXXU?!*xx%${8Rxlkyf|kxv$|br_oK(_O{dTI z34w3A1I|~u9d>6p;>CQ#m-9?8@5x}HE3uN-6J^gP$S?GfeweNHv`BwVsPc|Dt;1;s zXLC(IH90-1cl+Ms|FJvZ=e&%4O1y{lB(C^c9`i7L7wdi_%z2NG^~+?xk7FgOsr+JzmZ~--az&numkI8UPqdHOBw| literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/UK.gif b/frontends/dnet-is-application/src/assets/images/flags/UK.gif new file mode 100644 index 0000000000000000000000000000000000000000..b44b08f69dc1a41b37409f74635e8b1cd1f2ed2a GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5+L(sH4K*PnXRyK-skGO-qB;H zo8LxfuMKYAIokRM{6dceM_r6gx)PguF*fyFbn;{`|LcVncgt!o7nYr>ZG1L&;kiXi zpB+7ZV#m%|d=hg6Wo8RX&l8rNBP=^tTyd$i>I!+y#mYMKm9&?s8*bD#-KuZ7LdW!g zjoW5Rrz5U@=lmlsgv1{34`1%;b2upKN=)j-}3^>$;h9u zY|V*9D~|^zOij+6&@o}1nR{(a&cfXCnVpljD43V2*;Hj!uPbd@CSXwFmo_IPXJKIa zwBnYP8Rawj<{!Cy^ZCm+pLz9)_>}#$or_DmcNEsonJ{UZZ%WUOy~kXl>elW!HGjqS z6PF&X-MDSm+Wi+FeLQ&j@{{-9pC3L{6%=%|r)O<*^O>bfk1kyJ;oQ0R7cN{naNzvD zeScoQ{POrQFn+=DJW5~*0mYvzj0_A58FWB$pgh6AahidVL&jr+!a@FNLW-v*yY(@# zMB^&3mm`FOG=#gdTy)$PfGl!6xFk7-T4+n!a0O*QdoB#j- literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/UM.gif b/frontends/dnet-is-application/src/assets/images/flags/UM.gif new file mode 100644 index 0000000000000000000000000000000000000000..903d9d9e68e84c2d7aeba68d596e730d229b65ef GIT binary patch literal 925 zcmXYwT}TvB7>3`ebyxba<(z37R*Ov*sn}vOD>aaQq|#h5?ZRNmF}2ieTXSO|qc+@& zrJJNABaMET{%E5pjf^hDoe2v8C?|`OP9xBZr0n0=~w}5x)uY6;RYOWn)e&`O^)Be-Ho* zsDU`aG0~55Nnm>7$2tim(gja8X`@nPHqbR)4p%GL6a_7O`k*3Pw1Qg{^ zUMJ!sAj4eABb4cal?dI2~2{v2J_+a)0Oa~)i7?}~y z$1Rm6FZbD|FMuQsa}vq`E2yFAK~hHs0i=(5w??SZAW16iZcWjI!W(uJqjUiN29!fS zriGib#1p@86u}nR5eUzQM5PPNC9}pb3y7>4c9#&Z18D(5co0HKTR0UEmBT<6;1AOy zB07LJfCJpHAK@z7%VSv91T@0Yu?j97b!4;!#UTVkpqvZm4!IxUT8O?;egk&Pny!g@WhLJt;LMbwW!N^D<{EfyjDuxNvYAbn z2%2>%m?evud&yWe$y*h$SuYi`=~1vLRI*89vs)=`AIjmloZV@)h*O`4^F&3L5>D6E zDy~@?o&nrmYsI{$s(a_C_>^$_ZWQ;Msp?lL8qlj6P-Pns${)BwJaD>lU>R@l7NL+W zyrDZJLuXrt7V<}I(}}L)awzZ8tXQUAxk|j|v{OxwL+x6z`U@(J7d#vL^qcld zwVd^9nGn)C(XefOVB6Z5_Qi4?=Z!nB$aYYAj|bIZ18d3Ns{v%bwv{X6m}&b66z zIb!l!iz(ZSrpynUy4h^{jne50wPs$kp1C7_=4QuP*Gp$F(wTe9VcxFn`ODoF-*aEQ z*J$bO>ZJ$Emah+7vEO9Xz2sF-jn_PmUVETv?J?VR_mkFL$X@@reEp7?jpwpAUboov zFm==6+)W3fH$Q3Kd@69uQ?sqlL$+Q`-g-5A+q3%ZXFPX4tKWImY1fmcUFVbcJhk2X zs$=iD)cx;D_CM`Aa4zuhi^+%2`y72Y<>;ljQ*Vk+zYah5G4uS#-1BdXF27H|_NDID z&yL$)EAD-t^yugGH~)bEoU(=hq4<-9lY!v`gAT~8pgh6A@t)$*TlOXj9=m&Atn zeGaycZEx5Yc=WJ5y=c_jw=7|I+0tJPITID<72Zpc3}QYi8s|PfVDxH6RtK0 zwXpFB7pOd~y1Hue>VSzqR2+{bd+ zaZTf4=27oHFoMWR0mifQeHL7wk$7mbx3IX1L&=2$ zjc4TD7oK)-baFk#cW0Ne&jN>Kee+BYEqoBr;Nbd>PeRA15^Aq7Cv+&2Ib#(K{wIvI-d-a9|R7;m{&reusgXM|Fz8 lAvS3r14m|FhYbuyIz0+a9C9rY2RoFl5*{(0U}0gf1^~5vt91YX literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/US.gif b/frontends/dnet-is-application/src/assets/images/flags/US.gif new file mode 100644 index 0000000000000000000000000000000000000000..130052f3f939dec270c044d663fb477db7b08ac9 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5zJ0?)jpUJB`hk8=E%dwuF^sEnUl$X+QeCdaP@^k0Y*kY195tn6Z@2m7 zMF+dv&dN$fm>EqC_Me%OxII5-UqkKL#=4W8Z5Kp@!=)r56y!6F3`)#QYrQ;|ySYw? zj#{3ReXzJ_Z++c)Tidq6q7!N9iwmoEEM0Sd#rg*c+3R|yo<5zCbS5MDOkT#dhU(X| zryXx@{JmlAVPoT?W@aa>tFaYkFz{J?{MFdlPXz_%lae0g=6V7vu1vp zK7Ds->D`{5-R0%S8|pvIo_(de>u6KctGRQ2EL(P_v-4?4yV?da^hJa69FIkP|Q-0@@Y-WMA;e%-t0(fW1w*R1(=;K0W{d*1Bc z{r$x8U#Cw4;};yyqXd=^Q2fcl$iT3WK?fuU$`cG6rx_SIWIQ$~92B=GS+U{bA{Q0c zZmGaqPhJXZG@2KESz&mjrCBp@Nx;e`S8s8Brf?3%M^0?qLjG@_NVdGVxYTC`%exPP zDQx^AVrybf9%AK@G)XSbPt5h;4DZ8;HOY?9rSOWk~x@*Y* literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/UY.gif b/frontends/dnet-is-application/src/assets/images/flags/UY.gif new file mode 100644 index 0000000000000000000000000000000000000000..b0284f81e5cdf22ad69a88fa9ef6254930bda8df GIT binary patch literal 1006 zcmeH`+fPyf0LG7IN{LNfwp?~$HKkT=t(UUPq?`KC?IGvfYH8MUms!><%CLq88lh&P z33CBzNr)l{!a)$u;h=CjCXzs?0Y%(G6w*f7d;dY-!}s(({eJrjicao7P?iqhfkj{? zu~=-*9Wt6QYOAvCE!HEOQ5gKqtZo?nqSjB}q04Gp6is}rfel?Jw>Pvaq)3P(#KbzU z1opG|8kK3j<1N(QrQr$@vFek?CN8S-g1Y;#6# z(S~l*W%rv@)r{f$Oyxa>>_L;_2}@VcHauzpAGd;Zj=q5du>@0%9NpbIe&^r}f7nf7 zidy(ckHXc=g+;mmZ|HO1sCQ5w>>9F5k$`Z-DIW{I;*IbJOq_Sxfe~xB*!V`EHdz_{b#f*mk{bmQz0u+yH-BUE1}5!(u^a+52A3zK)*7%$t1q~?{3{lTF3~t}tH4sj z?5}TAaHY0Bt+!W#Xvb|*rCtWYW~&o2V3^tN`w{&fSX61ph`7FbEYmg^8H4nO?_S@e z*=+qN{W(8Ht}Kp)Cq@6XF2iHL!bSvGNH3rw8J2S%rdaq%*WF zd)98tKbDBk$lXX1mQj-)Qi4*UY-YS}$(%0XQp((isStJ>v`;k;h$u4>QwPwMWodAa(?kq2hwF+Dz%fAl0T z_nOW+xoOgLHtXhJ(>rE54(l_YO}ST2j^)i@llMa2S(l7IH>-~6$=9Z%pM%TFZyyo> zB>sYkk89Pcoj?&*8nalJB_|Y~FE1O{KnX+)Gy>yR0H*|sG4{;%Ia0olr5%>kHZfb1kqXiE%z`7uZd(Fc@Af;#vkl zt3IYn^F!lGLEx)c%S|eAcH=(>L_D-Bs}Qk4jd)2HHHac49t3KEDBy>7TFWJDq%C`90h=RGMkF0Fjx_j1Yhn7e1i zuDM;vP%bjfIe4K_Sag6YAiHeV#c9iM1L+k|fx@NZC&L#8gCW6Gm1$svCxLGa6$}ND zMnM(*4QojL7_#%rhJFPqKrDYwqUpaY>YPSm#0YZV?!&zY)PV5BrHvrh3=&H76A*}H zDOE~?IRI$|e*G_gsJw52dHnpRGi97Uax!m~@6TO$q$nHUB`puiZ^=q1Ied#Cn8s*9j zCq^5dPKL&8Ya(;+o=$~tukQF;`T1P;?9ITbEd!C%{f|?TTlMyyi3gt^9-Zz_jXj(H QRF3C^n;S2EFHr15U;0t4D5Z@ zP}iKQaI3JoDhG03Q>Rwy{RqD=p{kRH|ps1W6RBrcE1Gy*8E5;J(kGys^b8ne zLX%9Ft!Q_h?b$8+wOx*=q=-uPbKl}U+(X0wA_1x&0_cPfBJojAkP$H%k&v+|KV-sB zEA>Yw0(J5r^<;<|3?ZOU6g;Mx3e!l#mf#3X7LHCu;nUIWjmHhjQ)Vq)H$&AaXapR; zjHFnIbE5Z&CN0B+GbTT!*;lhS7BV*$vVJVHc30UtIM1frPp3L++Qbn)3s^Yz*X?uS6tEHfRN9(S*^25<>BF>$K!Fk-7c5Q>2x|A4!hmH zwY9ajwq`b)jYcCu5C($*!!Wg4jUdR}+#C$U3WY)@lYt;8kx0hI#)Lv)UtixJeSbCn zuYVyxcl!DOKnIX?G(P$S5by=?35a0{Y11ci%gp?lJHai~ml5=|bW0JnHc{02VtzfC zclKgrTt=BcyC#!#lk;GY(!z^Ry$~Ze0-wp0INwD!IUbElWc6}V*;%A|N_a+qf?m-Q zom9vvan{hXd@~}GTSJL=EuG0%xG~zax*2Zx6G{X>wzZ+~OkNYClb)T!Ws>Z=Qrdl( zmr%e>9UxIy)JsqIcdB9wj3NCw?YUpCQF5tS^#P2g+yYutWI~C!@oG+fYbNJ%dR=c% M+w=m3Oahp{0ef?UW&i*H literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/VC.gif b/frontends/dnet-is-application/src/assets/images/flags/VC.gif new file mode 100644 index 0000000000000000000000000000000000000000..89cbca3b7193d3caa0a838e9b8ef07bfce4de237 GIT binary patch literal 938 zcmYLIUr19?82|0|p|gBg=ft>a#4L%3iXi*{veL>-MTZX(gEkneL~NBXAEKN}nMIk3 zTKEwDAxn#jUV?~a?KUE+g@}YiLey>#J;b2ZMyGQ&tHb4R@9%uy@B96}^WFUi_HEzc zU50%807$E&HtLw7SD&eDm^!*>^c|7bm-t1+J>+{pw2qc_QQu3N`$iAnQ{8Qh5VYlr00f7Cd@OGCMv-JPq@=mPfTl8mL4>-|U6G0RVZB6$2K+38JLWvb^Et-SlCytp*ad%8p5l+AMZhnR6p|G6z%hW!+(*C_phD5(29U@y z0(u6?Zk5Fe0}+-{;efVKRmGG_3KKgeBT6;w1l&Lw0>=>xf;Rz;@;zYp#*#iBbVK+9 zqA@1CTpYosQ%9c5TIrKg&YcnLXnJcVc~BA!0Zngtk}H{3KwHppv>|$bx}0cQUAnuoCxw349g!AYjTq2wnfzbj%AB3d9wRxUPC*%C-T% z8;B&pGB@xMCV+kfb@0q)^ug~V^6ax)AQOs3ic1Bki6tHO|1-5N0rmgU(E z%U}L!clg#z1q}2k!w8<%L;w_eB0CZ z+$GKRv)-qneB0{s!Sbua?a&uBx9InWUtCnYU+CT4YO`sb;cK;DqCJbZ2F9IU#JYDKJhaIf!poZ*M_g%JxIL$T@8R!5osJN? Y98(QrotBQsJuPq5&_wrqTPt?`0TZVYr2qf` literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/VE.gif b/frontends/dnet-is-application/src/assets/images/flags/VE.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b80760dc8a0227e68e30859c389ed5431da9f1b GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5Ax)5>p$ ziOUIxfX6;@*L~w22c_H$N)nQqC9OQi$ZDsd`7CGeW4I(#yqFm&$5yk=I$RptnlPVvB+8 zaufUYX3iU3gU&el9&`&n5)gAeAm(Ct(xtepYgr|C(+aO~NG=psnj)q;RZ4rQwB}41 z?b(V3D^!e^7`YtLv)iC)(&!j)*wO!hmHTSfkOLl}n?jRMC+6P?OFkT(c_upjNO0Vm zvc}8GrYjN)Zyq}#eC767WXbNcrmm^^%F@#~k-PV@|G$3$KYs>n z*=+swYv|)A0pGrbKY0@P@l)ilUvdBcXMK2|lbz0xk;ZWCQffz|L435qu1$${wk9q{ z!e^bNlb_|1Timo1fp$fPlC-pzZ&` zkvvLZ4*|uWEQ|~c3m9}j(x5!Sz;T*^kweB~gTg_Z`X75XDnIuT*A8Bl!|1H$E8SS} zr{+?yyYCF`;1wAkjo5gl&6)PUd0DLPC#e^?!9y@PjaSC1n1!$K(~{1Ka#m$O7?hrP z2&s8b;1DTXe2kq>qi#)tBMV!Hq)O5bfsVs&f}%DHo>)v&@(@uqN!gR3xPgU@Uq~(E z#)ZbFRvtCI9*#iA1Qtd%4jzpHhJ#G(0&*q^3lth1yxQ3qg;F#GRea`HrEXGrDX84o d#lgrG!V$RGd$vvHDih5~i(T20rFl3QtO1D;CBgsz literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/VG.gif b/frontends/dnet-is-application/src/assets/images/flags/VG.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a003c833f43b64904bc29848f9e9267d4afc1bb GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5=4VyRO)Q#|U$<-S zhO=9aPOa)qjY`_IXycwuC-jvgCU$Lz4y$#r$*(By&@o82buLvmDzJ2|HF0Ti3Yy{* zGe56tHG^=BtWlMuR;Ip7uaGn@s6p+3+Abn9l+I(rt+_a*0ZTB+&w4UUu1!mEWG3|BDy&Y*ix%pEHeY(6- z=SSvrq-GaqE<4}Xx-F&WKvv_v(3))lYtDA9xm-78M`~kFG%#|(kvvLZ4*|uWEQ|~c z3m9}j(x5!Sz;T*^kweB~gTg^>`9}sE2OFIhtGQ0Hn7Ao*f?}g6pUs2^4hLFz)C(Ro zeq8LM=)$BdV6b4p0R|3EmnR-3otKoQvsh+1Tv*7+!6O}Db8}-xu)3!%2j>=pN5`0i z>})bTE*=(C^P3pKAoL>1W0sI%+>Jm(XST&Y)3vVtP@Zr?O53XMLgJyvT)ZChOlpNL zxjvBAt9o@JaMSWrGmHyFBDt8X)9{e);zGM=zc}{rGazp>3XkX%klH%wK1_ZEyRt_ni-)O?mrq z?euxV^Ox#9d+WC6p#7Rnw%>m2IdW|Jp(6|}ZGu;Bntu2a@cOOqt2h384>%k?=C^u{ z+w~h!uivITeUVa9YW3)G>8rOj_aBtMe$#d3TFa*|bB>>Ac>Z$wwd)fsN<&@9jQ)^m+Wmt%cZ-k^U8|Gjd7Bf68ukv z1%LbY?c>Lf4oIij5+_`gS&z?PV=FF*6r;Z;#e&ooJ z{rmUt*|TTo&Yc@JY*@a0IWTg;kvvLZ4*|uWEQ|~c3m9}j(x5!Sz;T*^kweB~gTg`k zl5Yka2QnI`Sn8{#`3Cebyc@GSn)Fv!c@orhOV9CnK y4(^lmE^;uXc!;Ve=q=Eg(m7eZ(OM^V6^mvYk7??M0*%JZ;BJ4mWN97_25SJow2xi@ literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/VN.gif b/frontends/dnet-is-application/src/assets/images/flags/VN.gif new file mode 100644 index 0000000000000000000000000000000000000000..a48c11356f7fd57e4cbef2b3e7d618433204f897 GIT binary patch literal 999 zcmZ?wbhEHb6k_0E_|5Q%KBG&#)WIVH}6T@ejxkwwf3pwte4LVyu71- zVlDHvogzQ)c^zBMaQ}efn-iwT=dhkx$o~0|-SK9Ib46Syk{KV>s2%rW{MzL7z1{77 zxz%wqhO=H0_X8C_R`~rY47h9{@FOSij5PakL536JoHxw%-@90yk`lTmDe_21?KlI& zF$RWO28J32h7*j8#~B$OC9tV<~oX5F1&v9{G;N?BZ%iF=l zby+~*l#tL335jzO5@#hOCI|}Nk(IqIEBioE@q&WOzXt|>2?+QW82C0I;DVdmr||HP;o)E7;+{rE z{!B^vk&^NyHT839>hG*9V2prcW|W|L2q^w!VPs%vXV3xJ1j-W(97h-!Ib=LGC^(Ai zPupSm#4aXyw zGqY_9S-f64H=OSjG12k~*vRB6ZBurILnh(Hd2xOrIh6ng#Y1gYNCzU4fiz*mLOvq?xY;G3xJe)IA>BDIO q8Qq+Y9|f$w90E~WLn@U7Jo&_wdZ*ZMruT^J1kR9%$u&@5um%8%`uem0 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/VU.gif b/frontends/dnet-is-application/src/assets/images/flags/VU.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ba27152be140235550f66712bdf5c383132a947 GIT binary patch literal 964 zcmYLIO=uHA7=2ksQ^Q(yXNhaONGgknE+Ta;wHB;4)*8|hiw2cY(h^n;F~%yygH)3S zQ7Qg_SP&1jD%3wv5JBl7YO{iPFyO(1NJWvX2N4VyXWu{-CLAD?}1dBRyJV(AX`IcLFg2>aDOQ))JC6j7B-p zuah-$Y`@kT)<|5RSU`pcjj}-e+tgfA7d>RSQPx+9Cj)9QpsHRmVd^^X@70368d*R@ zQzISf6@k2Y7L4_4`bv>>tC6hX_llDqazCue5+P@d)+RZ@N9@7Cf3>Ahn zuopN4P=5C*a1jXb3K#{-RYpLWMXFm+D_bZ?f-}npVQ#9^)6OYuv~WhW3upl%fFG$N zD5gP^K!VpPZ(p$zqv;5knPQ0|>!a)d)*m}C$!E zuoM^tKRH7jFRGHWAoU6*eD8RNRD?*0rj9I2aj`afAfd(K1HL{4siSqf*WAj zkoZ+^Y6Qg|(5^h-I(WKZSyGi}D_np1-$n8-M=Yt!;SWW>PLD9Di_19`ni`+3x1^H9 zImeW9$|@v@|9J;Z5nyJllu{HRSkX04CIvS@W~`}jZ2 z4Zn%g3f+Re9OiV|Fgc=&I9+i}2U|7n)uv!P*FL^ zz;H}b^3$0!2ie&Vu(Dooc0S0#@#*yGbJo@ed3kpz>Yvil*~7qah==F%`SVT9*AMdX zz2Cq8f|bQl28Q2n-?Fl=`*iBm0#5a#5)wy5M0NvBV_-PI#I&E0@gNTm1H-ZtN=k?L z`A-`fo-sCNU|7k(u=@Rh1Ly7R&O17uP*z^dqj8v@e=h^WJ_d&W|Nrl2KnIFHS-?U% zAQI#!2DV%W=fnxj90l7N@=m63bsme}TJ1WDbVhw{c&xlmaLwc1ZT7|yOFS>wz-v@8n>#ruLX;YfU%)TZ%7Egn2;og;M}i(SD(FkHZscLy$Z% zb=4;ZhFS)O8fNA*yu4?*xH{zJFU!cx($u`HsJPt1;-RkY1UI+KVPP-4ymq9d{BZYJ zmyz{1GxKX^=I7el-^ImG%gZ0t)E*WRJ?H3hyQAyFX$FSl3=GE@7|t>>o@Qh`!_0hw znfVwq^J!MrQ>?7VSy|7pv!CGPyv)UQiHqw3&`Mt3%K`$YgoJL2h+Gp9xho-YLqg)L zgv1?L+1s+Rj};XkC@S7pRJ@=dzgSxOk(%0db@iv(+G`XQU+U|xQ&!%prgp82CLf@Jm3zx4^)+ z0RewgQh>1lj*U@*t|6fKlZBCip_xGkWGg67FmUW=VC0bT*r4FZFYj@oxF_DLRjtKt*F~M#zu|@I{?Ml*ZN=nPL zm76s*R$A+q+8Y%+7#F)+7Ft_x^tQ=$cHR=|k{TO(I4S8sR@RZ;0@tdlQ!6@54$o6L zzC`idO4-NT1z+yw{dSV||5=9rml^*5{|~j3N|fSH78a0EIv@h%CkD2V0}TZpI#R98 z4owF=WI8#IvlZ`5FymWZXmHYiXPQ$(<4TqJj4Ue_JMgpf@^xOZ+`-%}kZGb+sgcJb gTV10fSkBw5tRz*=$Rr>y#NX${Eygr;sw0Cn0GC2aVE_OC literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/YE.gif b/frontends/dnet-is-application/src/assets/images/flags/YE.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea105b6136f8cb87facd458d50a79e1f1dd23e1c GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5)l-az1>F8?VriNj`6w;dIy>q%a6 zQhgb0dd}DQeu%}*V2dv)ZmZml4+L7jP4)Vo6Y#De{Ao_eqwL_1r7=I6vL2KteQC-2 z`}yOaPai%$fBNt1=Z`O*?U!Y!5@DziVmPS4d{Bk+q$ckH9sUz0;yo&YS1n{)RfSJl z%0Kebe;?zt+0E!qgyWYC|MwXIUyC9?l*GNOO1*I8(CPhqZ=E~y{PxW|7teor`Fz>D zxj(*t|M&0T-@kwV{Q2|y_wQf7e*OIU^T&@L-@bkO^y$;PckkZ3dGq@9>sPN{J$?H0 z$&)7!A3nTy@7}Fjw{G0HaqZf*D_5>ux^(Hng$w7-ojVH*jx%RYojO%tUtd#Glb@fT zn3$N5kPsUi8xau^7#J835a93c@8{>|>+9>`;o;`y=H%q$=;&x`Yin(7ZDCCc-rKO>vp{S@RD=RB4EiEA-As`^Y%gf8j$;ryf%FN6Rj3aPdjS^H2 z0mYvzj0_CD3_2ilL3x6K<1_;!hm6Mtg@cm9W<3FkOe}3&LK+blE-1QiHky<$7zU|$ z@JkzI-MR7bar*>Crpk_pgG{aMJQjLS9(-tInJA*pV%Es;_~;~d4<#ATMJ=A(;)XID zG6Dy>#Emj8OyRuz)N6`**p3N;FH*RgnbI%J5PZyfdJ03xHVzME0k3HWX&2^5es=Yq z$`G`nAv3{Y!7Q_~FK3(z^vZqVAn3j7}3%ZFyFf9#e>`W_ aQ&tEl*c3mx6ZpYhfYF&PS(=A~!5RR+Ofud8 literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/YT.gif b/frontends/dnet-is-application/src/assets/images/flags/YT.gif new file mode 100644 index 0000000000000000000000000000000000000000..9e05e8e823b763b54a7cfc3b48afb42ae448c4a6 GIT binary patch literal 472 zcmZ?wbhEHb6k_0Ec*el+^yTN*8}=9k&MWEMx1E7Mr+L>ohuHo5_a8d6KcivSmhJmn zrtZ1m5Oie5!u`jO{{R2qI%@Gg26cu}K&22+{K*0~Ne4uN;)H?Sv_YV$nZLD7u%olN zrLDEIt6QMAuU~NDq{&mKO`Oa>Yx>;zb7oFmu%v%k@1pL7OBb(Nw`O@~BZD;nch5kj literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/YU.gif b/frontends/dnet-is-application/src/assets/images/flags/YU.gif new file mode 100644 index 0000000000000000000000000000000000000000..e43f90534edf4e84a805acd19ea27beceb451181 GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5FptK%_h;Zcc@b(*9bINu?8onyih|AHOfS!=yAR|gbq4KCi1+H_#G`%P3hb%OWTBhwYz;HLn(lNm-R(}1|MkLv)v>N;PM-Mn{oA+CpWeQD`TE84m(QLqQejx8 z$+|?7b%Tk(8cT^iE{dxh6jwPZPqI>6@1`-&N#k^w=?YK1ok1oWd<{1RnCuU;xSsBI zB;M(Gvg_^qfGgR43qtJnr+Hs3iP)OrbF?txeslV@hV%#Rx!0PrE}c7j_T-5(Cyt*! ze(c|`pLcKGxPJNa?;k&YeE*vp(-@bkO^y$;Pckf=kdiC__(C%M@7tWmn8g%x|nKP$OodQN8I5I~G(n3J-CkrD3!wd!;kTy`B zVBk2-z{nxvu|eUWpmN-U9~+z7xP+CwmSiYCZsTj@4!iN;U~>~UJD10t4uQpPd^}8w zXI?CP$iySUD`AtMnCR5XBgRt2;iPb+kxAOD;6(xh2a^D&9fyp7!bN4zX*#}5Pdp|r zbn2Ay6!Lg+K|pb;PGHxUjEf5yIwUxEs1#ffbFBUMvn>e35 z&B)K=+PYP}yGvo+T8rJg0(yGf^76ucd>oXO6&o8ojx#WvU}iqe%6fv8^#U*NWdVV6 z5)yZ0WgjRizSP%$Yijz{$?1oi+b@6r-vI$%0|Jh(Sdo^Rnw6E6l9Cb^7YB@Aa6FF^ zSVBPYCkrD3!$JlfkQ^vaFmRk^VC0bT*r0Gw)@sg;h=U0YOWb>8Tos$w z6vL78fHP3hzN~=3@{o#`sBZKo55XIpAxcgSAAT5YV(FTy7q=r}q0)!TiyUjNe9&0L za#q?b_tAlgo81;Hv@fr_BN24Wmy2E0p=QB@h0O}m^MlxNMy!Z8L@69EeO;`5J8ZT zWRyP!6)i&OPe1y%(p~(~hf;)rghI%!Kl(LjwZ-Y2&FXSFocn$}@AJIxdk-BxxNrZU z8`by$kVX`wiJ*5vUgAWJL?aYxBHsYrXeDo)LVhY~)GfWosWj4dgOU3Rd6U(B$0_P3 zcaYq1s_rC8QeUHc$0Z7N(y&IQWcO_kg$8K03Nu({_zjFA62gZ$^fCaR&-tC%Xpt2Y zNWgX$w3VX(BwTi3KyV1i*Vd1_b0{zw;v23pp{Y#ZKCX{rJXns8p$;$ss%0Sp0L=Dq^%06_(h6p*hV0(#j}IYQpN zi7YF#sE4**RmF5k2n($e5nUQufqtMH#sw@Sz~jJqc{ep&h#VfkI!2Lo{&IOKzyDTxT5I*v~?c28vAn%p7NJxF@OdWoMj{j7mSJ$ z>FNfu>jFlm%T@~+MehG2uqN<9sy8f@}SP`fd$SE^&y6TN3+Xh5a$mYSy6Icdn z!E?%fPHOwxf9Q(_k8mp}?avTufoXxsRF5%ybM!8eUEpYfY9@JCKj+(JU`AOYV#mE1RGuDiJvPt8&b_TsZIt(NXop literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/ZR.gif b/frontends/dnet-is-application/src/assets/images/flags/ZR.gif new file mode 100644 index 0000000000000000000000000000000000000000..6b98ee2600c6b0406378268682544feaf440de41 GIT binary patch literal 924 zcmYLIZAep57=Ctp&1nnto|21;@FU7ZMv#eLKhnvvp)w<)ANw(5ER$i&g!P5#r2Q(A zjI8j7_5oT5LKFr5SmZ7e5eg9!5*iY_{pd#wTI|y4oK5X;Io$i4_dM_OyzhID9e35% zb?t%;zX7TwiqQB+A~%gkXilM%&*)^7)?Kvk4z2to?_QdFNL3Nq)k|g#QIzJs&@~qY z9b`TvQz3JJ%)iusimDxCi_nMnv>u`0D_ZHGs(ZBli`pvb$s;oB$rhy#pDEZu{u(j` zl22(h9Yz?IZcrgZ3J4eE@(?%!hj=Vrj4mLhijeC5VjYSKx$a|V1S9TDd;og^9grt& zSkn(sD6sLi6026oL0Jj0Rq{jr1%rXL6 z2FY%1`;t21YDPr~l#Q%1#wjQa)C)#971RS>par4xSPFyn0zvT}D(YHF`B~Tt9tiQ^ z67ORCEDl{fJ1=sXeL~L6W7PF78YvbQMB_m3B1RuYlHcR|o*v_ByO@FNp4F+eT~`xw29kcwA7^RR5HlmpiXzC4ib3&de4X(Q z>7^iR-6NeowH_(%xnM9?#`+X=on`Ynr?xbg{vjEPD!IvjBG-Bu7Ms>OJJA$TwpH{` z%uYI^J9F!U%S}T{Vc!1jBek8eoE^I>OS%trmd#_k!()B$%`zOd)j5(2lSdcw%d2be zPA`^Q@~jo!*Pgyu^NoWCeA<=L=E2d%tB(7=GsBUa4Yzt4J!LJ?(ZZKKd+eR7Z(rnC Hh|us4ipT+g literal 0 HcmV?d00001 diff --git a/frontends/dnet-is-application/src/assets/images/flags/ZW.gif b/frontends/dnet-is-application/src/assets/images/flags/ZW.gif new file mode 100644 index 0000000000000000000000000000000000000000..9369ae099296719460aae51e4fd650a67fed104c GIT binary patch literal 1006 zcmZ?wbhEHb6k_0E_|5P$$QnJOBHFA=)&>+!ax9z8T)UXJYrSk{v-GTe`o(?9wKKKa78~@f zFz41`?>=pTE@ANuyxc!IA-hD{Dab4iaW5o^Y6!+}b`1HZ__%Xdp7ft^B zc6<87>EGXgZ(saYteEir{ksdNSWg{bII=JP?ThtCc4ywXTz&Jz^eyv?pRDmaTh4g8 zjPY_E*V!80yIm5mW@&$4Y4>ll@7oogzc&Yd+L3d;L;ceEGv^yDzbwz)HM@169@lMK zk>|c@J6+U{_~?E~usR=Xd_UgqZ@$;ZJfA-$f#)^Y4>L0CWoACk&c23=>!OIrehCRh zR@QrJYG<{zUt3wN($U#sWO&=o?z+9*K`X1TUS3850G>cq&`DA8 zOi6Kwsj0t-NvfM$oRd>tKtPtCpP|0KoUE*ilarx=!Pifp0s{g9{QceC+#WuBSYKan zZf?%Y%L|NRa8!>H=pmr^lZBCiVG)B4NCK267&uNdFmlLvY*29I64mLru|V-~JD-eR z1w*6a5st?Ba#u8ro*d_sG0S^$;oxHS2?|WAE}99cr)TQN?x=uwWQfS~RJt?H-H`~he zgvta*F{LOWo*S3h1s1yYN=Qnncq|ZM7reG%=jCI*GFD};&P-%}-s|9>u_|C@(vyx! oYW@o>5;v)E3N;FQoY6>p Date: Wed, 1 Feb 2023 11:51:23 +0100 Subject: [PATCH 35/43] file positions --- frontends/dnet-is-application/src/app/app.module.ts | 2 +- .../src/app/{pipes => common}/filter.pipe.ts | 2 +- .../dnet-is-application/src/app/{ => common}/is.model.ts | 0 .../dnet-is-application/src/app/{ => common}/is.service.ts | 0 .../src/app/contexts/contexts.component.ts | 5 ++--- .../src/app/dsm/dsm-results.component.html | 2 +- .../dnet-is-application/src/app/dsm/dsm.component.css | 6 ++++++ frontends/dnet-is-application/src/app/dsm/dsm.component.ts | 6 ++---- .../dnet-is-application/src/app/info/info.component.ts | 4 ++-- .../src/app/main-menu-panels/main-menu-panels.component.ts | 4 ++-- .../src/app/protocols/protocols.component.ts | 4 ++-- .../src/app/resources/resources.component.ts | 4 ++-- .../src/app/vocabularies/vocabularies.component.ts | 5 ++--- .../src/app/wf-history/wf-history.component.ts | 7 +++---- 14 files changed, 26 insertions(+), 25 deletions(-) rename frontends/dnet-is-application/src/app/{pipes => common}/filter.pipe.ts (88%) rename frontends/dnet-is-application/src/app/{ => common}/is.model.ts (100%) rename frontends/dnet-is-application/src/app/{ => common}/is.service.ts (100%) diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index d285bd2b..fb494434 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; -import { FilterPipe } from './pipes/filter.pipe'; +import { FilterPipe } from './common/filter.pipe'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; diff --git a/frontends/dnet-is-application/src/app/pipes/filter.pipe.ts b/frontends/dnet-is-application/src/app/common/filter.pipe.ts similarity index 88% rename from frontends/dnet-is-application/src/app/pipes/filter.pipe.ts rename to frontends/dnet-is-application/src/app/common/filter.pipe.ts index 9fa31760..fbcc2c95 100644 --- a/frontends/dnet-is-application/src/app/pipes/filter.pipe.ts +++ b/frontends/dnet-is-application/src/app/common/filter.pipe.ts @@ -18,7 +18,7 @@ export class FilterPipe implements PipeTransform { return items.filter(obj => { return Object.keys(obj).reduce((acc, curr) => { - return acc || String(obj[curr]).toLowerCase().includes(searchText); + return acc || JSON.stringify(obj[curr]).toLowerCase().includes(searchText); }, false); }); } diff --git a/frontends/dnet-is-application/src/app/is.model.ts b/frontends/dnet-is-application/src/app/common/is.model.ts similarity index 100% rename from frontends/dnet-is-application/src/app/is.model.ts rename to frontends/dnet-is-application/src/app/common/is.model.ts diff --git a/frontends/dnet-is-application/src/app/is.service.ts b/frontends/dnet-is-application/src/app/common/is.service.ts similarity index 100% rename from frontends/dnet-is-application/src/app/is.service.ts rename to frontends/dnet-is-application/src/app/common/is.service.ts diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.ts b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts index 37188d2a..1fc5e41f 100644 --- a/frontends/dnet-is-application/src/app/contexts/contexts.component.ts +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.ts @@ -1,11 +1,10 @@ import { Component, Inject,AfterViewInit, OnInit, ViewChild } from '@angular/core'; -import { ISService } from '../is.service'; +import { ISService } from '../common/is.service'; import { MatTableDataSource } from '@angular/material/table'; import { MatSort } from '@angular/material/sort'; -import { Context, ContextNode } from '../is.model'; +import { Context, ContextParam, ContextNode } from '../common/is.model'; import { ActivatedRoute, Params } from '@angular/router'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { ContextParam } from '../is.model'; @Component({ selector: 'app-contexts', diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html index 2668a6c1..6b2c6855 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html @@ -74,7 +74,7 @@

-
add api + diff --git a/frontends/dnet-is-application/src/app/dsm/dsm.component.css b/frontends/dnet-is-application/src/app/dsm/dsm.component.css index ea1bebd9..29425153 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm.component.css +++ b/frontends/dnet-is-application/src/app/dsm/dsm.component.css @@ -15,4 +15,10 @@ .dsm-result-table th { width: 20em; +} + +.dsm-result-table td button { + font-size: 0.8em !important; + padding: 0 !important; + height: 2.5em !important; } \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts index 701f6763..557322e8 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts +++ b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts @@ -1,16 +1,14 @@ import { Component, Inject, OnInit, ViewChild } from '@angular/core'; -import { BrowseTerm, Datasource, KeyValue } from '../is.model'; -import { ISService } from '../is.service'; +import { Page, BrowseTerm, Datasource, KeyValue } from '../common/is.model'; +import { ISService } from '../common/is.service'; import { ActivatedRoute, Params } from '@angular/router'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MatTableDataSource } from '@angular/material/table'; import { MatSort } from '@angular/material/sort'; import { combineLatest } from 'rxjs'; -import { Page } from '../is.model'; import { Router } from '@angular/router'; import { PageEvent } from '@angular/material/paginator'; - @Component({ selector: 'app-dsm-search', templateUrl: './dsm-search.component.html', diff --git a/frontends/dnet-is-application/src/app/info/info.component.ts b/frontends/dnet-is-application/src/app/info/info.component.ts index 37fa4280..2af2453d 100644 --- a/frontends/dnet-is-application/src/app/info/info.component.ts +++ b/frontends/dnet-is-application/src/app/info/info.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; -import { ISService } from '../is.service'; +import { ISService } from '../common/is.service'; import { MatTableDataSource } from '@angular/material/table'; -import { Module } from '../is.model'; +import { Module } from '../common/is.model'; export interface KeyValueDatasource { name: string; diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts index 06ca8953..a4452d44 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.ts @@ -1,6 +1,6 @@ import { Component, ViewChild } from '@angular/core'; -import { ResourceType } from '../is.model'; -import { ISService } from '../is.service'; +import { ResourceType } from '../common/is.model'; +import { ISService } from '../common/is.service'; import { MatAccordion } from '@angular/material/expansion'; diff --git a/frontends/dnet-is-application/src/app/protocols/protocols.component.ts b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts index 675a0fb6..b9e7ca17 100644 --- a/frontends/dnet-is-application/src/app/protocols/protocols.component.ts +++ b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; -import { ISService } from '../is.service'; +import { ISService } from '../common/is.service'; import { MatTableDataSource } from '@angular/material/table'; -import { Protocol, ProtocolParams } from '../is.model'; +import { Protocol, ProtocolParams } from '../common/is.model'; export interface ProtocolDatasource { protocol: string; diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.ts b/frontends/dnet-is-application/src/app/resources/resources.component.ts index c499e88d..1f4b93bc 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.ts +++ b/frontends/dnet-is-application/src/app/resources/resources.component.ts @@ -1,8 +1,8 @@ import { Component, Inject, OnInit } from '@angular/core'; -import { ISService } from '../is.service'; +import { ISService } from '../common/is.service'; import { ActivatedRoute } from '@angular/router'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { ResourceType, SimpleResource } from '../is.model'; +import { ResourceType, SimpleResource } from '../common/is.model'; import { FormControl, FormGroup } from '@angular/forms'; @Component({ diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts index 042678f9..f9bb1aec 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.ts @@ -1,11 +1,10 @@ import { Component, Inject, AfterViewInit, OnInit, ViewChild } from '@angular/core'; -import { ISService } from '../is.service'; +import { ISService } from '../common/is.service'; import { MatTable, MatTableDataSource } from '@angular/material/table'; import { MatSort } from '@angular/material/sort'; -import { Vocabulary, VocabularyTermSynonym } from '../is.model'; +import { Vocabulary, VocabularyTerm, VocabularyTermSynonym } from '../common/is.model'; import { ActivatedRoute } from '@angular/router'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { VocabularyTerm } from '../is.model'; import { FormControl, FormGroup } from '@angular/forms'; @Component({ diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts index bad0b50a..165070f3 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.ts @@ -1,12 +1,11 @@ import { Component, Inject,AfterViewInit, OnInit, ViewChild } from '@angular/core'; -import { ISService } from '../is.service'; +import { ISService } from '../common/is.service'; import { MatTableDataSource } from '@angular/material/table'; -import { MatSort } from '@angular/material/sort'; -import { WfHistoryEntry } from '../is.model'; +import { MatSort } from '@angular/material/sort'; +import { WfHistoryEntry, KeyValue } from '../common/is.model'; import { ActivatedRoute, Params } from '@angular/router'; import { combineLatest } from 'rxjs'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { KeyValue } from '../is.model'; @Component({ selector: 'app-wf-history', -- 2.17.1 From 0e3a3f11c683907642d2c5bd43d2fc95d0c22f77 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Wed, 1 Feb 2023 15:45:33 +0100 Subject: [PATCH 36/43] partial implementation of add Api Form --- .../src/app/app-routing.module.ts | 3 +- .../dnet-is-application/src/app/app.module.ts | 6 +- .../src/app/common/is.model.ts | 9 +- .../src/app/common/is.service.ts | 9 +- .../src/app/dsm/dsm-add-api.component.html | 1 - .../src/app/dsm/dsm-add-api.dialog.html | 96 +++++++++++++ .../src/app/dsm/dsm-results.component.html | 2 +- .../src/app/dsm/dsm.component.ts | 126 ++++++++++++++---- .../src/app/protocols/protocols.component.ts | 4 +- 9 files changed, 216 insertions(+), 40 deletions(-) delete mode 100644 frontends/dnet-is-application/src/app/dsm/dsm-add-api.component.html create mode 100644 frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html diff --git a/frontends/dnet-is-application/src/app/app-routing.module.ts b/frontends/dnet-is-application/src/app/app-routing.module.ts index f943a72f..d6808958 100644 --- a/frontends/dnet-is-application/src/app/app-routing.module.ts +++ b/frontends/dnet-is-application/src/app/app-routing.module.ts @@ -6,7 +6,7 @@ import { WfHistoryComponent } from './wf-history/wf-history.component'; import { ResourcesComponent } from './resources/resources.component'; import { VocabulariesComponent, VocabularyEditorComponent } from './vocabularies/vocabularies.component'; import { ContextViewerComponent, ContextsComponent } from './contexts/contexts.component'; -import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiComponent } from './dsm/dsm.component'; +import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent } from './dsm/dsm.component'; const routes: Routes = [ { path:"info" , component:InfoComponent }, @@ -19,7 +19,6 @@ const routes: Routes = [ { path:"voc_editor" , component:VocabularyEditorComponent }, { path:"dsm/search" , component:DsmSearchComponent }, { path:"dsm/results/:page/:size" , component:DsmResultsComponent }, - { path:"dsm/addApi" , component:DsmAddApiComponent }, { path:"dsm/api" , component:DsmApiComponent } ]; diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index fb494434..70619647 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -18,6 +18,7 @@ import { MatBadgeModule } from '@angular/material/badge'; import { MatCardModule } from '@angular/material/card'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input' +import { MatSelectModule } from '@angular/material/select' import { MatTableModule } from '@angular/material/table'; import { ProtocolsComponent } from './protocols/protocols.component'; import { MainMenuPanelsComponent } from './main-menu-panels/main-menu-panels.component'; @@ -29,7 +30,7 @@ import { ResourcesComponent, ResContentDialog, ResCreateNewDialog, ResMetadataDi import { MatSnackBarModule } from '@angular/material/snack-bar'; import { ContextsComponent, ContextViewerComponent, ContextParamsDialog } from './contexts/contexts.component'; import { VocabulariesComponent, VocabularyEditorComponent, VocDialog, VocTermDialog } from './vocabularies/vocabularies.component'; -import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiComponent, DsmBrowseDialog } from './dsm/dsm.component'; +import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiDialog, DsmBrowseDialog } from './dsm/dsm.component'; import { MatPaginatorModule } from '@angular/material/paginator'; @NgModule({ @@ -55,7 +56,7 @@ import { MatPaginatorModule } from '@angular/material/paginator'; DsmSearchComponent, DsmResultsComponent, DsmApiComponent, - DsmAddApiComponent, + DsmAddApiDialog, DsmBrowseDialog ], imports: [ @@ -75,6 +76,7 @@ import { MatPaginatorModule } from '@angular/material/paginator'; MatCardModule, MatFormFieldModule, MatInputModule, + MatSelectModule, MatTableModule, MatExpansionModule, MatDialogModule, diff --git a/frontends/dnet-is-application/src/app/common/is.model.ts b/frontends/dnet-is-application/src/app/common/is.model.ts index c7de0524..9440b454 100644 --- a/frontends/dnet-is-application/src/app/common/is.model.ts +++ b/frontends/dnet-is-application/src/app/common/is.model.ts @@ -25,7 +25,7 @@ export interface Module { files: string[]; } -export interface ProtocolParams { +export interface ProtocolParam { name: string label: string type: string @@ -35,7 +35,7 @@ export interface ProtocolParams { export interface Protocol { id: string - params: ProtocolParams[] + params: ProtocolParam[] } export interface WfHistoryEntry { @@ -140,3 +140,8 @@ export interface Page { number: number } +export interface DsmConf { + compatibilityLevels: string[], + contentDescTypes: string[], + protocols: Protocol[] +} diff --git a/frontends/dnet-is-application/src/app/common/is.service.ts b/frontends/dnet-is-application/src/app/common/is.service.ts index c04a34e0..f110c17e 100644 --- a/frontends/dnet-is-application/src/app/common/is.service.ts +++ b/frontends/dnet-is-application/src/app/common/is.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { Page, ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary, VocabularyTerm, KeyValue, BrowseTerm, Datasource } from './is.model'; +import { Page, DsmConf, ResourceType, Protocol, WfHistoryEntry, SimpleResource, Context, ContextNode, Vocabulary, VocabularyTerm, KeyValue, BrowseTerm, Datasource } from './is.model'; import { FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -185,6 +185,13 @@ export class ISService { }); } + dsmConf(onSuccess: Function) { + this.client.get('./ajax/dsm/conf').subscribe({ + next: data => onSuccess(data), + error: error => this.showError(error) + }); + } + dsmBrowsableFields(onSuccess: Function) { this.client.get('./ajax/dsm/browsableFields').subscribe({ next: data => onSuccess(data), diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.component.html deleted file mode 100644 index dee08cb9..00000000 --- a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.component.html +++ /dev/null @@ -1 +0,0 @@ -

dsm add api

diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html new file mode 100644 index 00000000..4dbb0b24 --- /dev/null +++ b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html @@ -0,0 +1,96 @@ +
+

Add a new API

+ +
+ + Datasource ID + + + + Datasource Name + + + + + + Api ID (prefix) + + + + + Api ID (suffix) + + This field is required + + + + Compatibility level + + {{i}} + + This field is required + + + + Content description + + {{i}} + + This field is + required + + + + Protocol + + {{i}} + + This field is required + + + + Base URL + + This field is required + + + + + Protocol: {{addApiForm.get('protocol')?.value}} - Parameter: {{p.name}} + + + + + + XPath for Metatadata Identifier + + This field is required + + +
+
+ + + + {{ addApiForm.errors?.['serverError'] }} + +
+
+ + \ No newline at end of file diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html index 6b2c6855..104c7d75 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html @@ -74,7 +74,7 @@

- + diff --git a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts index 557322e8..a1e75b22 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts +++ b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts @@ -1,5 +1,5 @@ import { Component, Inject, OnInit, ViewChild } from '@angular/core'; -import { Page, BrowseTerm, Datasource, KeyValue } from '../common/is.model'; +import { Page, BrowseTerm, Datasource, KeyValue, DsmConf, ProtocolParam } from '../common/is.model'; import { ISService } from '../common/is.service'; import { ActivatedRoute, Params } from '@angular/router'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; @@ -8,6 +8,8 @@ import { MatSort } from '@angular/material/sort'; import { combineLatest } from 'rxjs'; import { Router } from '@angular/router'; import { PageEvent } from '@angular/material/paginator'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { MatSelectChange } from '@angular/material/select'; @Component({ selector: 'app-dsm-search', @@ -67,23 +69,26 @@ export class DsmResultsComponent implements OnInit { this.pageSize = parseInt(params['size']); this.field = queryParams['field']; this.value = queryParams['value']; - - if (this.field) { - this.service.dsmSearchByField(this.field, this.value, this.currPage, this.pageSize, (page:Page) => { - this.results = page.content; - this.nResults = page.totalElements; - this.nPages = page.totalPages; - }); - } else { - this.service.dsmSearch(this.value, this.currPage, this.pageSize, (page:Page) => { - this.results = page.content; - this.nResults = page.totalElements; - this.nPages = page.totalPages; - }); - } + this.reload(); }); } + reload() { + if (this.field) { + this.service.dsmSearchByField(this.field, this.value, this.currPage, this.pageSize, (page:Page) => { + this.results = page.content; + this.nResults = page.totalElements; + this.nPages = page.totalPages; + }); + } else { + this.service.dsmSearch(this.value, this.currPage, this.pageSize, (page:Page) => { + this.results = page.content; + this.nResults = page.totalElements; + this.nPages = page.totalPages; + }); + } + } + changePage(event: PageEvent) { let path = '/dsm/results/' + event.pageIndex + '/' + event.pageSize; let qp = this.field ? @@ -94,6 +99,18 @@ export class DsmResultsComponent implements OnInit { queryParams: qp }); } + + openAddApiDialog(dsId:string, dsName:string) { + const dialogRef = this.dialog.open(DsmAddApiDialog, { + data: { dsId: dsId, dsName: dsName }, + width: '80%' + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) this.reload(); + }); + } + } @Component({ @@ -105,24 +122,12 @@ export class DsmApiComponent { } -@Component({ - selector: 'app-dsm-add-api', - templateUrl: './dsm-add-api.component.html', - styleUrls: ['./dsm.component.css'] -}) -export class DsmAddApiComponent { - -} - - - - @Component({ selector: 'dsm-browse-dialog', templateUrl: 'dsm-browse-dialog.html', styleUrls: ['./dsm.component.css'] }) -export class DsmBrowseDialog implements OnInit{ +export class DsmBrowseDialog implements OnInit { datasource: MatTableDataSource = new MatTableDataSource([]); colums: string[] = ['name', 'total']; @@ -148,4 +153,67 @@ export class DsmBrowseDialog implements OnInit{ onNoClick(): void { this.dialogRef.close(); } -} \ No newline at end of file +} + + +@Component({ + selector: 'dsm-add-api-dialog', + templateUrl: './dsm-add-api.dialog.html', + styleUrls: ['./dsm.component.css'] +}) +export class DsmAddApiDialog { + apiPrefix:string = ''; + + + apiIdControl = new FormControl(''); + + addApiForm = new FormGroup({ + apiId: this.apiIdControl, + compatibility : new FormControl(''), + contentdescription : new FormControl(''), + protocol : new FormControl(''), + baseurl : new FormControl(''), + metadataIdentifierPath : new FormControl('') + }); + + protocols:string[] = []; + compatibilityLevels:string[] = []; + contentDescTypes:string[] = []; + + protocolsMap:any = {}; + selProtParams:ProtocolParam[] = []; + + + constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { + this.apiPrefix = 'api_________::' + data.dsId + '::'; + this.service.dsmConf((conf:DsmConf) => { + this.compatibilityLevels = conf.compatibilityLevels; + this.contentDescTypes = conf.contentDescTypes; + conf.protocols.forEach((p) => { + this.protocols.push(p.id); + this.protocolsMap[p.id] = p.params; + }); + }); + } + + onChangeProtocol(e:MatSelectChange):void { + + if (this.protocolsMap[e.value]) { + this.selProtParams = this.protocolsMap[e.value]; + } else { + this.selProtParams = this.protocolsMap[e.value]; + } + } + + onSubmit():void { + //const api = DsmAddApiDialog.value; + //api.apiId = this.apiPrefix + api.apiId; IMPORTANT + //this.service.dsmAddApi(api, (data: void) => this.dialogRef.close(1), this.metadataForm); + + + } + + onNoClick(): void { + this.dialogRef.close(); + } +} diff --git a/frontends/dnet-is-application/src/app/protocols/protocols.component.ts b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts index b9e7ca17..788cb85e 100644 --- a/frontends/dnet-is-application/src/app/protocols/protocols.component.ts +++ b/frontends/dnet-is-application/src/app/protocols/protocols.component.ts @@ -1,11 +1,11 @@ import { Component } from '@angular/core'; import { ISService } from '../common/is.service'; import { MatTableDataSource } from '@angular/material/table'; -import { Protocol, ProtocolParams } from '../common/is.model'; +import { Protocol, ProtocolParam } from '../common/is.model'; export interface ProtocolDatasource { protocol: string; - datasource: MatTableDataSource; + datasource: MatTableDataSource; } @Component({ -- 2.17.1 From e620975813875d0a980ca23a9591afebcb94de44 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Thu, 2 Feb 2023 09:37:24 +0100 Subject: [PATCH 37/43] ui --- .../app/contexts/context-params-dialog.html | 2 +- .../src/app/contexts/contexts.component.html | 2 +- .../src/app/dsm/dsm-add-api.dialog.html | 116 +++++++++--------- .../src/app/dsm/dsm-browse-dialog.html | 2 +- .../src/app/dsm/dsm-results.component.html | 4 +- .../src/app/dsm/dsm-search.component.html | 2 +- .../src/app/info/info.component.html | 2 +- .../src/app/resources/content-dialog.html | 4 +- .../src/app/resources/metadata-dialog.html | 8 +- .../src/app/resources/new-dialog.html | 6 +- .../app/resources/resources.component.html | 5 +- .../src/app/vocabularies/voc-dialog.html | 6 +- .../src/app/vocabularies/voc-term-dialog.html | 14 +-- .../vocabularies/vocabularies.component.html | 2 +- .../vocabulary-editor.component.html | 2 +- .../src/app/wf-history/wf-dialog.html | 2 +- .../app/wf-history/wf-history.component.html | 2 +- 17 files changed, 93 insertions(+), 88 deletions(-) diff --git a/frontends/dnet-is-application/src/app/contexts/context-params-dialog.html b/frontends/dnet-is-application/src/app/contexts/context-params-dialog.html index 505a7e96..77187640 100644 --- a/frontends/dnet-is-application/src/app/contexts/context-params-dialog.html +++ b/frontends/dnet-is-application/src/app/contexts/context-params-dialog.html @@ -4,7 +4,7 @@

No parameters

- + {{p.name}} diff --git a/frontends/dnet-is-application/src/app/contexts/contexts.component.html b/frontends/dnet-is-application/src/app/contexts/contexts.component.html index 34dc5a8c..4b35ec73 100644 --- a/frontends/dnet-is-application/src/app/contexts/contexts.component.html +++ b/frontends/dnet-is-application/src/app/contexts/contexts.component.html @@ -1,6 +1,6 @@

Contexts

- + Filter diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html index 4dbb0b24..400efd87 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html @@ -2,45 +2,7 @@

Add a new API

- - Datasource ID - - - - Datasource Name - - - - - - Api ID (prefix) - - - - - Api ID (suffix) - - This field is required - - - - Compatibility level - - {{i}} - - This field is required - - - - Content description - - {{i}} - - This field is - required - - - + Protocol {{i}} @@ -48,26 +10,70 @@ This field is required - - Base URL - - This field is required - + + + API Description + + + + Datasource (ID: {{data.dsId}}) + + - - - Protocol: {{addApiForm.get('protocol')?.value}} - Parameter: {{p.name}} - - - + + Api ID (prefix) + + - - XPath for Metatadata Identifier - - This field is required - + + Api ID (suffix) + + This field is required + + + Compatibility level + + {{i}} + + This field is required + + + + Content description + + {{i}} + + This field is required + + + + + + + Configuration Parameters + + + + Base URL + + This field is required + + + + Protocol: {{addApiForm.get('protocol')?.value}} - Parameter: {{p.name}} + + + + + XPath for Metatadata Identifier + + This field is required + + +
+
diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html b/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html index 6376fe3d..a4df34ea 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-browse-dialog.html @@ -1,7 +1,7 @@

{{data.label}}

- + Filter diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html index 104c7d75..48ec88b9 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-results.component.html @@ -6,7 +6,7 @@ Returning all the datasources

- + Filter in current page (Total: {{(results | searchFilter: filterText).length}}) @@ -20,7 +20,7 @@ aria-label="Select page"> - + {{r.name}} {{r.otherName}} diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html b/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html index 5e133c45..96609e55 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-search.component.html @@ -1,7 +1,7 @@

Datasource Manager: Search

- + Search... diff --git a/frontends/dnet-is-application/src/app/info/info.component.html b/frontends/dnet-is-application/src/app/info/info.component.html index 8f905afb..89bb6a4f 100644 --- a/frontends/dnet-is-application/src/app/info/info.component.html +++ b/frontends/dnet-is-application/src/app/info/info.component.html @@ -1,6 +1,6 @@

Container Info

- + Filter diff --git a/frontends/dnet-is-application/src/app/resources/content-dialog.html b/frontends/dnet-is-application/src/app/resources/content-dialog.html index dea62e9d..fec72d7b 100644 --- a/frontends/dnet-is-application/src/app/resources/content-dialog.html +++ b/frontends/dnet-is-application/src/app/resources/content-dialog.html @@ -4,12 +4,12 @@
- + ID - + Content ({{data.contentType}}) This field is required diff --git a/frontends/dnet-is-application/src/app/resources/metadata-dialog.html b/frontends/dnet-is-application/src/app/resources/metadata-dialog.html index c5afdd28..4a4761e9 100644 --- a/frontends/dnet-is-application/src/app/resources/metadata-dialog.html +++ b/frontends/dnet-is-application/src/app/resources/metadata-dialog.html @@ -3,23 +3,23 @@
- + ID - + Type - + Name This field is required - + Description diff --git a/frontends/dnet-is-application/src/app/resources/new-dialog.html b/frontends/dnet-is-application/src/app/resources/new-dialog.html index c8c66a46..a9b95ca2 100644 --- a/frontends/dnet-is-application/src/app/resources/new-dialog.html +++ b/frontends/dnet-is-application/src/app/resources/new-dialog.html @@ -3,18 +3,18 @@
- + Name This field is required - + Description - + Content ({{data.contentType}}) This field is required diff --git a/frontends/dnet-is-application/src/app/resources/resources.component.html b/frontends/dnet-is-application/src/app/resources/resources.component.html index 3f9adc38..eae86cdb 100644 --- a/frontends/dnet-is-application/src/app/resources/resources.component.html +++ b/frontends/dnet-is-application/src/app/resources/resources.component.html @@ -2,13 +2,12 @@ - + Filter (Total: {{(resources | searchFilter: searchText).length}}) - - + {{r.name}} {{type.contentType}} diff --git a/frontends/dnet-is-application/src/app/vocabularies/voc-dialog.html b/frontends/dnet-is-application/src/app/vocabularies/voc-dialog.html index e08a107e..7b63b8a6 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/voc-dialog.html +++ b/frontends/dnet-is-application/src/app/vocabularies/voc-dialog.html @@ -3,19 +3,19 @@

New vocabulary

- + ID This field is required - + Name This field is required - + Description diff --git a/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html b/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html index 16c483ff..51834546 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html +++ b/frontends/dnet-is-application/src/app/vocabularies/voc-term-dialog.html @@ -3,19 +3,19 @@

New term

- + Code This field is required - + Name This field is required - + Encoding @@ -26,7 +26,7 @@ Term {{element.term}} - + New term @@ -37,7 +37,7 @@ Encoding {{element.encoding}} - + New encoding @@ -100,13 +100,13 @@ - + New term - + New encoding diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html index 7b5b855d..54e833d4 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabularies.component.html @@ -2,7 +2,7 @@ - + Filter diff --git a/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html b/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html index c921898a..1c7752b7 100644 --- a/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html +++ b/frontends/dnet-is-application/src/app/vocabularies/vocabulary-editor.component.html @@ -12,7 +12,7 @@ Download

- + Filter diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html b/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html index 8541884a..20039068 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html +++ b/frontends/dnet-is-application/src/app/wf-history/wf-dialog.html @@ -7,7 +7,7 @@ Duration: {{duration}}

- + Filter diff --git a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html index 4dd4008b..bafaa743 100644 --- a/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html +++ b/frontends/dnet-is-application/src/app/wf-history/wf-history.component.html @@ -1,6 +1,6 @@

Workflow History

- + Filter -- 2.17.1 From f776c2ca68102834dec5298602411192bc58a138 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Thu, 2 Feb 2023 12:32:55 +0100 Subject: [PATCH 38/43] dynamic form --- .../src/app/dsm/dsm-add-api.dialog.html | 11 ++--- .../src/app/dsm/dsm.component.ts | 43 +++++++++++-------- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html index 400efd87..38ea91ec 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html @@ -10,7 +10,7 @@ This field is required - + API Description @@ -27,7 +27,7 @@ Api ID (suffix) - + This field is required @@ -49,7 +49,7 @@ - + Configuration Parameters @@ -61,8 +61,9 @@
- Protocol: {{addApiForm.get('protocol')?.value}} - Parameter: {{p.name}} - + Protocol: {{selectedProtocol}} - Parameter: {{p.label}} + + Invalid value diff --git a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts index a1e75b22..eb25cb23 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts +++ b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts @@ -8,7 +8,7 @@ import { MatSort } from '@angular/material/sort'; import { combineLatest } from 'rxjs'; import { Router } from '@angular/router'; import { PageEvent } from '@angular/material/paginator'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { MatSelectChange } from '@angular/material/select'; @Component({ @@ -162,27 +162,27 @@ export class DsmBrowseDialog implements OnInit { styleUrls: ['./dsm.component.css'] }) export class DsmAddApiDialog { + selectedProtocol:string = ''; + apiPrefix:string = ''; - - apiIdControl = new FormControl(''); - - addApiForm = new FormGroup({ - apiId: this.apiIdControl, - compatibility : new FormControl(''), - contentdescription : new FormControl(''), - protocol : new FormControl(''), - baseurl : new FormControl(''), - metadataIdentifierPath : new FormControl('') - }); - protocols:string[] = []; compatibilityLevels:string[] = []; contentDescTypes:string[] = []; protocolsMap:any = {}; selProtParams:ProtocolParam[] = []; + paramPrefix:string = '__PARAM_'; + apiIdControl = new FormControl('', [Validators.required]); + addApiForm:FormGroup = new FormGroup({ + apiId: this.apiIdControl, + compatibility : new FormControl(''), + contentdescription : new FormControl(''), + protocol : new FormControl(''), + baseurl : new FormControl(''), + metadataIdentifierPath : new FormControl('') + }); constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, public service: ISService) { this.apiPrefix = 'api_________::' + data.dsId + '::'; @@ -197,20 +197,27 @@ export class DsmAddApiDialog { } onChangeProtocol(e:MatSelectChange):void { - + this.selectedProtocol = e.value; + + Object.keys(this.addApiForm.controls).forEach(k => { + if (k.startsWith(this.paramPrefix)) { + this.addApiForm.removeControl(k); + } + }); + if (this.protocolsMap[e.value]) { this.selProtParams = this.protocolsMap[e.value]; + this.selProtParams.forEach(p => this.addApiForm.addControl(this.paramPrefix + p.name, new FormControl(''))); } else { - this.selProtParams = this.protocolsMap[e.value]; + this.selProtParams = []; } } onSubmit():void { - //const api = DsmAddApiDialog.value; + //const api = this.addApiForm.value; //api.apiId = this.apiPrefix + api.apiId; IMPORTANT //this.service.dsmAddApi(api, (data: void) => this.dialogRef.close(1), this.metadataForm); - - + console.log(this.addApiForm.value); } onNoClick(): void { -- 2.17.1 From 90d7b7626ffdd9571cbc78cbdd114cf216adda44 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Thu, 2 Feb 2023 14:26:53 +0100 Subject: [PATCH 39/43] add API model --- .../src/app/common/is.model.ts | 17 ++++++++++ .../src/app/dsm/dsm.component.ts | 31 ++++++++++++++++--- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/frontends/dnet-is-application/src/app/common/is.model.ts b/frontends/dnet-is-application/src/app/common/is.model.ts index 9440b454..9158ee97 100644 --- a/frontends/dnet-is-application/src/app/common/is.model.ts +++ b/frontends/dnet-is-application/src/app/common/is.model.ts @@ -112,6 +112,23 @@ export interface Api { aggrTotal: number } +export interface ApiParam { + param:string, + value:string +} + +export interface ApiInsert { + id: string, + protocol: string, + datasource: string, + contentdescription: string, + removable: boolean, + compatibility: string, + metadataIdentifierPath: string, + baseurl: string, + apiParams: ApiParam[] +}; + export interface Organization { name:string, country:string diff --git a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts index eb25cb23..153c2119 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts +++ b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts @@ -1,5 +1,5 @@ import { Component, Inject, OnInit, ViewChild } from '@angular/core'; -import { Page, BrowseTerm, Datasource, KeyValue, DsmConf, ProtocolParam } from '../common/is.model'; +import { Page, BrowseTerm, Datasource, KeyValue, DsmConf, ProtocolParam, Api, ApiInsert } from '../common/is.model'; import { ISService } from '../common/is.service'; import { ActivatedRoute, Params } from '@angular/router'; import { MatDialog, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; @@ -165,6 +165,7 @@ export class DsmAddApiDialog { selectedProtocol:string = ''; apiPrefix:string = ''; + paramPrefix:string = '__PARAM_'; protocols:string[] = []; compatibilityLevels:string[] = []; @@ -172,7 +173,6 @@ export class DsmAddApiDialog { protocolsMap:any = {}; selProtParams:ProtocolParam[] = []; - paramPrefix:string = '__PARAM_'; apiIdControl = new FormControl('', [Validators.required]); addApiForm:FormGroup = new FormGroup({ @@ -214,10 +214,31 @@ export class DsmAddApiDialog { } onSubmit():void { - //const api = this.addApiForm.value; - //api.apiId = this.apiPrefix + api.apiId; IMPORTANT + let api:ApiInsert = { + id: this.apiPrefix + this.apiIdControl.value, + protocol: this.selectedProtocol, + datasource: this.data.dsId, + contentdescription: this.addApiForm.get('contentdescription')?.value, + removable: true, + compatibility: this.addApiForm.get('compatibility')?.value, + metadataIdentifierPath: this.addApiForm.get('metadataIdentifierPath')?.value, + baseurl: this.addApiForm.get('baseurl')?.value, + apiParams : [] + }; + + Object.keys(this.addApiForm.controls).forEach(k => { + if (k.startsWith(this.paramPrefix)) { + let val = this.addApiForm.get(k)?.value; + if (val) { + api.apiParams.push({ + param: k.substring(this.paramPrefix.length), + value: val + }); + } + } + }); + console.log(api); //this.service.dsmAddApi(api, (data: void) => this.dialogRef.close(1), this.metadataForm); - console.log(this.addApiForm.value); } onNoClick(): void { -- 2.17.1 From 78ffdd538a689a6867665b2e3c81d759984b1061 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 3 Feb 2023 11:45:21 +0100 Subject: [PATCH 40/43] typed params in new api form --- .../src/app/dsm/dsm-add-api.dialog.html | 81 ++++++++++++++----- .../src/app/dsm/dsm.component.ts | 26 +++--- .../app/protocols/protocols.component.html | 2 +- 3 files changed, 75 insertions(+), 34 deletions(-) diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html index 38ea91ec..309197d9 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html @@ -4,7 +4,7 @@
Protocol - + {{i}} This field is required @@ -12,7 +12,7 @@ - API Description + API Description @@ -24,52 +24,89 @@ Api ID (prefix) - + Api ID (suffix) - - This field is required + + This field is + required Compatibility level - + {{i}} - This field is required + This field is + required Content description - + {{i}} - This field is required + This field is + required - Configuration Parameters + Configuration Parameters Base URL - - This field is required - - - - Protocol: {{selectedProtocol}} - Parameter: {{p.label}} - - Invalid value + + This field is + required + + + + + {{selectedProtocol}} - {{p.label}} + (Comma separeted values) + (Numeric) + + + Invalid value + + + {{selectedProtocol}} - {{p.label}} (true/false) + + + true + false + + Invalid value + + + + + {{selectedProtocol}} - {{p.label}} (multiple choice) + + + 0 - TODO + 1 - TODO + 2 - TODO + 3 - TODO + + Invalid value + + + + XPath for Metatadata Identifier - - This field is required + + This field is + required @@ -79,9 +116,9 @@ - {{ addApiForm.errors?.['serverError'] }} + {{ addApiForm.errors?.['serverError'] }} -
+
- No parameters + No parameters
\ No newline at end of file -- 2.17.1 From 7f71c5f3d026e129d29965d5660714395c11cddc Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 3 Feb 2023 11:57:12 +0100 Subject: [PATCH 41/43] baseUrl regex --- .../dnet-is-application/src/app/dsm/dsm-add-api.dialog.html | 6 ++++-- frontends/dnet-is-application/src/app/dsm/dsm.component.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html index 309197d9..bc7fb221 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html +++ b/frontends/dnet-is-application/src/app/dsm/dsm-add-api.dialog.html @@ -60,8 +60,10 @@ Base URL - This field is - required + + Invalid URL + : This field is required + diff --git a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts index 32ac9477..563948b3 100644 --- a/frontends/dnet-is-application/src/app/dsm/dsm.component.ts +++ b/frontends/dnet-is-application/src/app/dsm/dsm.component.ts @@ -179,7 +179,7 @@ export class DsmAddApiDialog { compatibility : new FormControl('', [Validators.required]), contentdescription : new FormControl('', [Validators.required]), protocol : new FormControl('', [Validators.required]), - baseurl : new FormControl('', [Validators.required]), + baseurl : new FormControl('', [Validators.required, Validators.pattern('^(http|https|ftp|file|sftp|jar|mongodb):\/\/')]), metadataIdentifierPath : new FormControl('', [Validators.required]) }); -- 2.17.1 From a01a6386611af50e95125ed91ce71bd3c0a1ca84 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 3 Feb 2023 12:48:12 +0100 Subject: [PATCH 42/43] Home redirects to Info --- frontends/dnet-is-application/src/app/app-routing.module.ts | 1 + .../src/app/main-menu-panels/main-menu-panels.component.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/frontends/dnet-is-application/src/app/app-routing.module.ts b/frontends/dnet-is-application/src/app/app-routing.module.ts index d6808958..db17a49d 100644 --- a/frontends/dnet-is-application/src/app/app-routing.module.ts +++ b/frontends/dnet-is-application/src/app/app-routing.module.ts @@ -9,6 +9,7 @@ import { ContextViewerComponent, ContextsComponent } from './contexts/contexts.c import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent } from './dsm/dsm.component'; const routes: Routes = [ + { path:"" , redirectTo:'info', pathMatch: 'full' }, { path:"info" , component:InfoComponent }, { path:"resources/:type" , component:ResourcesComponent }, { path:"adv_resources/context" , component:ContextsComponent }, diff --git a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html index 795242d9..921a6b61 100644 --- a/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html +++ b/frontends/dnet-is-application/src/app/main-menu-panels/main-menu-panels.component.html @@ -8,7 +8,7 @@ Home -
...
+ Home -- 2.17.1 From 286a9a189db0079d4ef15e5f268a8c42e4ceddc6 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 3 Feb 2023 14:55:39 +0100 Subject: [PATCH 43/43] spinner --- .../src/app/app.component.html | 7 +++- .../src/app/app.component.ts | 3 +- .../dnet-is-application/src/app/app.module.ts | 21 +++++++--- .../src/app/common/spinner.service.ts | 38 +++++++++++++++++++ frontends/dnet-is-application/src/styles.css | 15 +++++++- 5 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 frontends/dnet-is-application/src/app/common/spinner.service.ts diff --git a/frontends/dnet-is-application/src/app/app.component.html b/frontends/dnet-is-application/src/app/app.component.html index 35186275..2b5ac62f 100644 --- a/frontends/dnet-is-application/src/app/app.component.html +++ b/frontends/dnet-is-application/src/app/app.component.html @@ -1,3 +1,7 @@ +
+ +
+
- \ No newline at end of file + + diff --git a/frontends/dnet-is-application/src/app/app.component.ts b/frontends/dnet-is-application/src/app/app.component.ts index 1a02c86c..d9d78bc2 100644 --- a/frontends/dnet-is-application/src/app/app.component.ts +++ b/frontends/dnet-is-application/src/app/app.component.ts @@ -2,6 +2,7 @@ import { Component, inject } from '@angular/core'; import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout'; import { Observable } from 'rxjs'; import { map, shareReplay } from 'rxjs/operators'; +import { SpinnerService } from './common/spinner.service'; @Component({ selector: 'app-root', @@ -17,7 +18,7 @@ export class AppComponent { shareReplay() ); - constructor(private breakpointObserver: BreakpointObserver) {} + constructor(private breakpointObserver: BreakpointObserver, public spinnerService: SpinnerService) {} } diff --git a/frontends/dnet-is-application/src/app/app.module.ts b/frontends/dnet-is-application/src/app/app.module.ts index 70619647..f881cb21 100644 --- a/frontends/dnet-is-application/src/app/app.module.ts +++ b/frontends/dnet-is-application/src/app/app.module.ts @@ -4,9 +4,9 @@ import { FilterPipe } from './common/filter.pipe'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { HttpClientModule } from '@angular/common/http'; +import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; import { InfoComponent } from './info/info.component'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { LayoutModule } from '@angular/cdk/layout'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatButtonModule } from '@angular/material/button'; @@ -32,6 +32,8 @@ import { ContextsComponent, ContextViewerComponent, ContextParamsDialog } from ' import { VocabulariesComponent, VocabularyEditorComponent, VocDialog, VocTermDialog } from './vocabularies/vocabularies.component'; import { DsmSearchComponent, DsmResultsComponent, DsmApiComponent, DsmAddApiDialog, DsmBrowseDialog } from './dsm/dsm.component'; import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { SpinnerHttpInterceptor } from './common/spinner.service'; @NgModule({ declarations: [ @@ -60,11 +62,13 @@ import { MatPaginatorModule } from '@angular/material/paginator'; DsmBrowseDialog ], imports: [ + BrowserModule, + BrowserAnimationsModule, + HttpClientModule, BrowserModule, AppRoutingModule, FormsModule, HttpClientModule, - NoopAnimationsModule, LayoutModule, MatToolbarModule, MatButtonModule, @@ -83,9 +87,14 @@ import { MatPaginatorModule } from '@angular/material/paginator'; MatSortModule, ReactiveFormsModule, MatSnackBarModule, - MatPaginatorModule + MatPaginatorModule, + MatProgressSpinnerModule ], - providers: [], - bootstrap: [AppComponent] + providers: [{ + provide: HTTP_INTERCEPTORS, + useClass: SpinnerHttpInterceptor, + multi: true + }], + bootstrap: [ AppComponent ] }) export class AppModule { } diff --git a/frontends/dnet-is-application/src/app/common/spinner.service.ts b/frontends/dnet-is-application/src/app/common/spinner.service.ts new file mode 100644 index 00000000..1aafe32e --- /dev/null +++ b/frontends/dnet-is-application/src/app/common/spinner.service.ts @@ -0,0 +1,38 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; +import { Observable } from 'rxjs'; +import { HttpInterceptor, HttpResponse } from '@angular/common/http'; +import { HttpRequest } from '@angular/common/http'; +import { HttpHandler } from '@angular/common/http'; +import { HttpEvent } from '@angular/common/http'; +import { tap } from 'rxjs/operators'; + +@Injectable({ providedIn: 'root' }) +export class SpinnerService { + visibility: BehaviorSubject; + + constructor() { this.visibility = new BehaviorSubject(false); } + + show() { this.visibility.next(true); } + hide() { this.visibility.next(false);} +} + +@Injectable() +export class SpinnerHttpInterceptor implements HttpInterceptor { + + constructor(private spinnerService: SpinnerService) { } + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + + this.spinnerService.show(); + + return next.handle(req) + .pipe(tap((event: HttpEvent) => { + if (event instanceof HttpResponse) { + this.spinnerService.hide(); + } + }, (error) => { + this.spinnerService.hide(); + })); + } +} diff --git a/frontends/dnet-is-application/src/styles.css b/frontends/dnet-is-application/src/styles.css index 734e3273..5076dbb1 100644 --- a/frontends/dnet-is-application/src/styles.css +++ b/frontends/dnet-is-application/src/styles.css @@ -94,4 +94,17 @@ th, td { margin-left: 2em !important; margin-right: 2em !important; font-size: 0.75em !important; -} \ No newline at end of file +} + +.spinner { + position: absolute; + width: 300px; + left: 0; + right: 0; + top: 40%; + margin: auto; + z-index: 10000; +} + +.spinner * { margin: auto; } + \ No newline at end of file -- 2.17.1