From 3eb6045deeac03c822da2d70735b4e5032874cf6 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 10 Mar 2020 10:57:02 -0400 Subject: [PATCH 001/120] initial commit --- .editorconfig | 13 + .gitignore | 46 + README.md | 27 + angular.json | 128 + browserslist | 12 + e2e/protractor.conf.js | 32 + e2e/src/app.e2e-spec.ts | 23 + e2e/src/app.po.ts | 11 + e2e/tsconfig.json | 13 + karma.conf.js | 32 + package-lock.json | 13238 +++++++++++++++++++++++++ package.json | 47 + src/app/app-routing.module.ts | 11 + src/app/app.component.html | 534 + src/app/app.component.scss | 0 src/app/app.component.spec.ts | 35 + src/app/app.component.ts | 10 + src/app/app.module.ts | 18 + src/assets/.gitkeep | 0 src/environments/environment.prod.ts | 3 + src/environments/environment.ts | 16 + src/favicon.ico | Bin 0 -> 948 bytes src/index.html | 13 + src/main.ts | 12 + src/polyfills.ts | 63 + src/styles.scss | 1 + src/test.ts | 25 + tsconfig.app.json | 14 + tsconfig.json | 23 + tsconfig.spec.json | 18 + tslint.json | 91 + 31 files changed, 14509 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 README.md create mode 100644 angular.json create mode 100644 browserslist create mode 100644 e2e/protractor.conf.js create mode 100644 e2e/src/app.e2e-spec.ts create mode 100644 e2e/src/app.po.ts create mode 100644 e2e/tsconfig.json create mode 100644 karma.conf.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/app/app-routing.module.ts create mode 100644 src/app/app.component.html create mode 100644 src/app/app.component.scss create mode 100644 src/app/app.component.spec.ts create mode 100644 src/app/app.component.ts create mode 100644 src/app/app.module.ts create mode 100644 src/assets/.gitkeep create mode 100644 src/environments/environment.prod.ts create mode 100644 src/environments/environment.ts create mode 100644 src/favicon.ico create mode 100644 src/index.html create mode 100644 src/main.ts create mode 100644 src/polyfills.ts create mode 100644 src/styles.scss create mode 100644 src/test.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.spec.json create mode 100644 tslint.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..e89330a61 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +# 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 + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..86d943a9b --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/README.md b/README.md new file mode 100644 index 000000000..19be5ffa0 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# TechUi + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.0.5. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/angular.json b/angular.json new file mode 100644 index 000000000..d8b3f5a08 --- /dev/null +++ b/angular.json @@ -0,0 +1,128 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "tech-ui": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/tech-ui", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": true, + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.scss" + ], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "6kb", + "maximumError": "10kb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "tech-ui:build" + }, + "configurations": { + "production": { + "browserTarget": "tech-ui:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "tech-ui:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.scss" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "tech-ui:serve" + }, + "configurations": { + "production": { + "devServerTarget": "tech-ui:serve:production" + } + } + } + } + }}, + "defaultProject": "tech-ui" +} diff --git a/browserslist b/browserslist new file mode 100644 index 000000000..80848532e --- /dev/null +++ b/browserslist @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js new file mode 100644 index 000000000..7c798cfff --- /dev/null +++ b/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + browserName: 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts new file mode 100644 index 000000000..8e1d3c66f --- /dev/null +++ b/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('tech-ui app is running!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts new file mode 100644 index 000000000..b68475e0f --- /dev/null +++ b/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo(): Promise { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText(): Promise { + return element(by.css('app-root .content span')).getText() as Promise; + } +} diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json new file mode 100644 index 000000000..39b800f78 --- /dev/null +++ b/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 000000000..0340dbacc --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, './coverage/tech-ui'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..95f39e8a3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,13238 @@ +{ + "name": "tech-ui", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.900.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.900.5.tgz", + "integrity": "sha512-4du29cYI5awsZ34xoS9WWSbEv7HazIlsQWaee/fRdvv4WmyB1w6geLMLHveGT2cYL/lhxsMUdYyDMa6sXcYeFA==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.0.5", + "rxjs": "6.5.3" + }, + "dependencies": { + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-angular": { + "version": "0.900.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.900.5.tgz", + "integrity": "sha512-WCfmQNTzQNgdh8baeNJm5uIhXbWp62e+upsZzh6eJ1ZrIeJSPJxE5mI1VvqBoAQH3hKjuAaAW3axpWGar4kJjw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.900.5", + "@angular-devkit/build-optimizer": "0.900.5", + "@angular-devkit/build-webpack": "0.900.5", + "@angular-devkit/core": "9.0.5", + "@babel/core": "7.7.7", + "@babel/generator": "7.7.7", + "@babel/preset-env": "7.7.7", + "@ngtools/webpack": "9.0.5", + "ajv": "6.10.2", + "autoprefixer": "9.7.1", + "babel-loader": "8.0.6", + "browserslist": "4.8.3", + "cacache": "13.0.1", + "caniuse-lite": "1.0.30001020", + "circular-dependency-plugin": "5.2.0", + "copy-webpack-plugin": "5.1.1", + "core-js": "3.6.4", + "coverage-istanbul-loader": "2.0.3", + "cssnano": "4.1.10", + "file-loader": "4.2.0", + "find-cache-dir": "3.0.0", + "glob": "7.1.5", + "jest-worker": "24.9.0", + "karma-source-map-support": "1.4.0", + "less": "3.10.3", + "less-loader": "5.0.0", + "license-webpack-plugin": "2.1.3", + "loader-utils": "1.2.3", + "magic-string": "0.25.4", + "mini-css-extract-plugin": "0.8.0", + "minimatch": "3.0.4", + "open": "7.0.0", + "parse5": "4.0.0", + "postcss": "7.0.21", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "3.1.0", + "regenerator-runtime": "0.13.3", + "rimraf": "3.0.0", + "rollup": "1.25.2", + "rxjs": "6.5.3", + "sass": "1.23.3", + "sass-loader": "8.0.0", + "semver": "6.3.0", + "source-map": "0.7.3", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.16", + "speed-measure-webpack-plugin": "1.3.1", + "style-loader": "1.0.0", + "stylus": "0.54.7", + "stylus-loader": "3.0.2", + "terser": "4.5.1", + "terser-webpack-plugin": "2.3.3", + "tree-kill": "1.2.2", + "webpack": "4.41.2", + "webpack-dev-middleware": "3.7.2", + "webpack-dev-server": "3.9.0", + "webpack-merge": "4.2.2", + "webpack-sources": "1.4.3", + "webpack-subresource-integrity": "1.3.4", + "worker-plugin": "3.2.0" + }, + "dependencies": { + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.900.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.900.5.tgz", + "integrity": "sha512-BdmvD58DnAAf6/o/fRzU2l+2g4IwuIJf8x/rd9AGWd7fHrcwgJDhB9rYetB7JqYR8uOWk+AFElDpvNOj8YUy0w==", + "dev": true, + "requires": { + "loader-utils": "1.2.3", + "source-map": "0.7.3", + "tslib": "1.10.0", + "typescript": "3.6.4", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "typescript": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", + "integrity": "sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.900.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.900.5.tgz", + "integrity": "sha512-4fYZNg8X73wTjlXV37m0BRVMa27GSwhAupgv5cb9Q3Vys9sYxEUL+GJetXDxypA5YbMj5xX/xqyU9TPtvXhgRg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.900.5", + "@angular-devkit/core": "9.0.5", + "rxjs": "6.5.3" + }, + "dependencies": { + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/core": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.0.5.tgz", + "integrity": "sha512-9TPQPzfSRbV5wVEnfo1d1CS+oVXROfE7VnBRuRMilFnNhuc29wX3zvBQRTreDVyxJetLBEb9sRlcKYGaJzpKPw==", + "dev": true, + "requires": { + "ajv": "6.10.2", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.4", + "rxjs": "6.5.3", + "source-map": "0.7.3" + }, + "dependencies": { + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/schematics": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.0.5.tgz", + "integrity": "sha512-PbOYoy4YyEbR6f1jO18Rt3fJuyaaTJ3bFmws5qWGGNK2yZiP/hnSaM3VffOwoL4sgyKkI2FNKSPiQZgTl8b0Tg==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.0.5", + "ora": "4.0.2", + "rxjs": "6.5.3" + }, + "dependencies": { + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular/animations": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.0.5.tgz", + "integrity": "sha512-WGs4Jxw5sr8GCpxMcwEVuZnDIkdNp9qtmuI2j13v/XAaMjvJ7jssCj9+JG5uI8joCi7PFVAWokPT1DdPwWb13Q==" + }, + "@angular/cli": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.0.5.tgz", + "integrity": "sha512-hRGpmIwnm908eW5sA4zrVkCGaIUHYLSNu5koaLulK0jj5Iy+vkieDiBuAkD2uVvG7M59s4s4u+L0DMetIpvZQg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.900.5", + "@angular-devkit/core": "9.0.5", + "@angular-devkit/schematics": "9.0.5", + "@schematics/angular": "9.0.5", + "@schematics/update": "0.900.5", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "^4.1.1", + "ini": "1.3.5", + "inquirer": "7.0.0", + "npm-package-arg": "6.1.1", + "npm-pick-manifest": "3.0.2", + "open": "7.0.0", + "pacote": "9.5.8", + "read-package-tree": "5.3.1", + "rimraf": "3.0.0", + "semver": "6.3.0", + "symbol-observable": "1.2.0", + "universal-analytics": "^0.4.20", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + } + } + }, + "@angular/common": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.0.5.tgz", + "integrity": "sha512-AwZKYK5M/3762woK+3290JnBdlBvZXqxX5vVze6wk23IiBlwIV+l79+Lyfjo/4s031kibq47taaZdC7qkkBkNA==" + }, + "@angular/compiler": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.5.tgz", + "integrity": "sha512-TeyhRGefTOtA9N3udMrvheafoXcz/dvTTdZLcieeZQxm1SSeaQDUQ/rUH6QTOiHVNMtjOCrZ9J5rk1A4mPYuag==" + }, + "@angular/compiler-cli": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.0.5.tgz", + "integrity": "sha512-lFlasm8UBApTq4/MkxnYrRAMfpOvvg3YYBEMibuEGlaJjW/Xd1JcisUuFiooCxCIKF5phyORHmxjywGPhHqQgQ==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "fs-extra": "4.0.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "semver": "^6.3.0", + "source-map": "^0.6.1", + "sourcemap-codec": "^1.4.8", + "yargs": "13.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "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 + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "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 + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "yargs": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", + "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@angular/core": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.5.tgz", + "integrity": "sha512-7VznrYjaAIzeq/zQ7v6tbeoOI7JJKgChKwG7s8jRoEpENu+w2pRlRdyQul88iJLsXgObR+/TfBNm/K+G4cqAFw==" + }, + "@angular/forms": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.0.5.tgz", + "integrity": "sha512-579PXAfT92J4mghjWKiZ3Zj3xee4h3RP70YHSlsfbi94MONvryWDrnXxvUZ0zJJCVnEJQ7x+nGEp3wwWqR12Jw==" + }, + "@angular/language-service": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.0.5.tgz", + "integrity": "sha512-9ykFNYZpWdoggFPK3LuTJobBZjoCEQP6kKt88ZZV7GTMIXoE7iY413KfhINoXdMwxIAbba0xlPMR/4p6jFAa4Q==", + "dev": true + }, + "@angular/platform-browser": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.0.5.tgz", + "integrity": "sha512-24QGcQXthYXB/wT8okJjxqss/JOk4A6O1/Fmva79k0AvwtYkl2tikcyEc5T3xZtjoi8g32AN9nbZAobtkxlqTA==" + }, + "@angular/platform-browser-dynamic": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.0.5.tgz", + "integrity": "sha512-NRfsAwbgxOvEcpqlERDAG0wap5xJa0wKwnudTCnyvf4B0D6kLkT1Idjqv22NDW5rfM2oDWaZ/qpgpDnAo6/ZBQ==" + }, + "@angular/router": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.0.5.tgz", + "integrity": "sha512-Sz3DQUxlzAk9aZ9eVtZRh6xF5SMg/Gb3rc5I7dL1M+mycSNoFJ4HPTXleZkKM69mMkKQ5fEtza4x26MSlF+O9w==" + }, + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/core": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.7.tgz", + "integrity": "sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.7", + "@babel/helpers": "^7.7.4", + "@babel/parser": "^7.7.7", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", + "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "dev": true, + "requires": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-call-delegate": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz", + "integrity": "sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.7" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.6.tgz", + "integrity": "sha512-bPyujWfsHhV/ztUkwGHz/RPV1T1TDEsSZDsN42JPehndA+p1KKTh3npvTadux0ZhCrytx9tvjpWNowKby3tM6A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-regex": "^7.8.3", + "regexpu-core": "^4.6.0" + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz", + "integrity": "sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.8.6", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helpers": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", + "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.7.tgz", + "integrity": "sha512-9JWls8WilDXFGxs0phaXAZgpxTZhSk/yOYH2hTHC0X1yC7Z78IJfvR1vJ+rmJKq3I35td2XzXzN6ZLYlna+r/A==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", + "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.6.tgz", + "integrity": "sha512-k9r8qRay/R6v5aWZkrEclEhKO6mc1CCQr2dLsVHBmOQiMpN6I2bpjX3vgnldUWeEI1GHVNByULVxZ4BdP4Hmdg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-split-export-declaration": "^7.8.3", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", + "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.6.tgz", + "integrity": "sha512-M0pw4/1/KI5WAxPsdcUL/w2LJ7o89YHN3yLkzNjg7Yl15GlVGgzHyCU+FMeAxevHGsLVmUqbirlUIKTafPmzdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", + "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", + "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", + "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", + "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.7.tgz", + "integrity": "sha512-brYWaEPTRimOctz2NDA3jnBbDi7SVN2T4wYuu0aqSzxC3nozFZngGaw29CJ9ZPweB7k+iFmZuoG3IVPIcXmD2g==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.8.7", + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", + "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/preset-env": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.7.tgz", + "integrity": "sha512-pCu0hrSSDVI7kCVUOdcMNQEbOPJ52E+LrQ14sN8uL2ALfSqePZQlKrOy+tM4uhEdYlCHi4imr8Zz2cZe9oSdIg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.7.4", + "@babel/plugin-proposal-dynamic-import": "^7.7.4", + "@babel/plugin-proposal-json-strings": "^7.7.4", + "@babel/plugin-proposal-object-rest-spread": "^7.7.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.7", + "@babel/plugin-syntax-async-generators": "^7.7.4", + "@babel/plugin-syntax-dynamic-import": "^7.7.4", + "@babel/plugin-syntax-json-strings": "^7.7.4", + "@babel/plugin-syntax-object-rest-spread": "^7.7.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", + "@babel/plugin-syntax-top-level-await": "^7.7.4", + "@babel/plugin-transform-arrow-functions": "^7.7.4", + "@babel/plugin-transform-async-to-generator": "^7.7.4", + "@babel/plugin-transform-block-scoped-functions": "^7.7.4", + "@babel/plugin-transform-block-scoping": "^7.7.4", + "@babel/plugin-transform-classes": "^7.7.4", + "@babel/plugin-transform-computed-properties": "^7.7.4", + "@babel/plugin-transform-destructuring": "^7.7.4", + "@babel/plugin-transform-dotall-regex": "^7.7.7", + "@babel/plugin-transform-duplicate-keys": "^7.7.4", + "@babel/plugin-transform-exponentiation-operator": "^7.7.4", + "@babel/plugin-transform-for-of": "^7.7.4", + "@babel/plugin-transform-function-name": "^7.7.4", + "@babel/plugin-transform-literals": "^7.7.4", + "@babel/plugin-transform-member-expression-literals": "^7.7.4", + "@babel/plugin-transform-modules-amd": "^7.7.5", + "@babel/plugin-transform-modules-commonjs": "^7.7.5", + "@babel/plugin-transform-modules-systemjs": "^7.7.4", + "@babel/plugin-transform-modules-umd": "^7.7.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", + "@babel/plugin-transform-new-target": "^7.7.4", + "@babel/plugin-transform-object-super": "^7.7.4", + "@babel/plugin-transform-parameters": "^7.7.7", + "@babel/plugin-transform-property-literals": "^7.7.4", + "@babel/plugin-transform-regenerator": "^7.7.5", + "@babel/plugin-transform-reserved-words": "^7.7.4", + "@babel/plugin-transform-shorthand-properties": "^7.7.4", + "@babel/plugin-transform-spread": "^7.7.4", + "@babel/plugin-transform-sticky-regex": "^7.7.4", + "@babel/plugin-transform-template-literals": "^7.7.4", + "@babel/plugin-transform-typeof-symbol": "^7.7.4", + "@babel/plugin-transform-unicode-regex": "^7.7.4", + "@babel/types": "^7.7.4", + "browserslist": "^4.6.0", + "core-js-compat": "^3.6.0", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/runtime": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.7.tgz", + "integrity": "sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz", + "integrity": "sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz", + "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.6", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/generator": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.7.tgz", + "integrity": "sha512-DQwjiKJqH4C3qGiyQCAExJHoZssn49JTMJgZ8SANGgVFdkupcUhLOdkAeoC6kmHZCPfoDG5M0b6cFlSN5wW7Ew==", + "dev": true, + "requires": { + "@babel/types": "^7.8.7", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz", + "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@ngtools/webpack": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.0.5.tgz", + "integrity": "sha512-xe0rGpme04MNRK/PpPOx8cza9k8F/XuAOmxC3Tk4dIgigqIzYsP6v6N/At8vPRDrf88X4ZyR94lL5RrUYf/KNQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.0.5", + "enhanced-resolve": "4.1.1", + "rxjs": "6.5.3", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@schematics/angular": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.0.5.tgz", + "integrity": "sha512-OUCC5J5+9v2tc3O/GL+2E9LfIXeqYCo/gdOTgb+jSos0aQQ7wnXOmufuoOsgt0KrWpAt34MIBktLNUF1n+RgcQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.0.5", + "@angular-devkit/schematics": "9.0.5" + } + }, + "@schematics/update": { + "version": "0.900.5", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.900.5.tgz", + "integrity": "sha512-Nte+9DfQHQkrgqZPX1viccs6UXL+FDGHkTIB/KTisJAvC4s+o9hjKAoCldWBsPi9/p5rXPNZ+EWmXx7vSLGSNQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.0.5", + "@angular-devkit/schematics": "9.0.5", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "npm-package-arg": "^7.0.0", + "pacote": "9.5.8", + "rxjs": "6.5.3", + "semver": "6.3.0", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "npm-package-arg": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz", + "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.2", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@types/estree": { + "version": "0.0.42", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.42.tgz", + "integrity": "sha512-K1DPVvnBCPxzD+G51/cxVIoc2X8uUVl1zpJeE6iKcgHMj4+tbat5Xu4TjV7v2QSDbIeAfLi2hIk+u2+s0MlpUQ==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.8.tgz", + "integrity": "sha512-q/L59BjgE6VJtuIM4iDEEwT7xdSWVHMqC+td9sft5RfgHpDZ4Gdn0vLV59wKZ7PjGuVLCL7aNCdoiw5u6ZKSgA==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", + "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.12.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.29.tgz", + "integrity": "sha512-yo8Qz0ygADGFptISDj3pOC9wXfln/5pQaN/ysDIzOaAWXt73cNHmtEC8zSO2Y+kse/txmwIAJzkYZ5fooaS5DQ==", + "dev": true + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/webpack-sources": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.6.tgz", + "integrity": "sha512-FtAWR7wR5ocJ9+nP137DV81tveD/ZgB1sadnJ/axUGM3BUVfRPx8oQNMtv3JNfTeHx3VP7cXiyfR/jmtEsVHsQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@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 + }, + "@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 + }, + "@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 + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + }, + "adm-zip": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", + "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "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 + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", + "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", + "dev": true, + "requires": { + "browserslist": "^4.7.2", + "caniuse-lite": "^1.0.30001006", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.21", + "postcss-value-parser": "^4.0.2" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "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 + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", + "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001017", + "electron-to-chromium": "^1.3.322", + "node-releases": "^1.1.44" + } + }, + "browserstack": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", + "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "dev": true, + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001020", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz", + "integrity": "sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "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, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", + "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "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 + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", + "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "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, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codelyzer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.1.tgz", + "integrity": "sha512-awBZXFcJUyC5HMYXiHzjr3D24tww2l1D1OqtfA9vUhEtYr32a65A+Gblm/OvsO+HuKLYzn8EDMw1inSM3VbxWA==", + "dev": true, + "requires": { + "app-root-path": "^2.2.1", + "aria-query": "^3.0.0", + "axobject-query": "2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "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, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "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 + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + } + } + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "dev": true + }, + "core-js-compat": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", + "dev": true, + "requires": { + "browserslist": "^4.8.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "coverage-istanbul-loader": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/coverage-istanbul-loader/-/coverage-istanbul-loader-2.0.3.tgz", + "integrity": "sha512-LiGRvyIuzVYs3M1ZYK1tF0HekjH0DJ8zFdUwAZq378EJzqOgToyb1690dp3TAUlP6Y+82uu42LRjuROVeJ54CA==", + "dev": true, + "requires": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.0", + "loader-utils": "^1.2.3", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.6.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", + "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2", + "regexpu-core": "^4.6.0" + } + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", + "dev": true + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "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 + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", + "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.37" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.374", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.374.tgz", + "integrity": "sha512-M4Y9onOJ4viRk3A4M/LH+r9+1zQioRZJvGJn/S/o7KaBJQLgFiaHMUlDwM0QMJd5ki6hFxKiWdC6jp5Ub0zMmw==", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "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 + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "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 + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "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, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.2.0.tgz", + "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "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, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz", + "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "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, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "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, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "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 + }, + "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, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", + "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "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, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "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 + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz", + "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==", + "dev": true, + "requires": { + "lru-cache": "^5.1.1" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-escaper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", + "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "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, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "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 + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "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 + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "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 + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "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, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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 + }, + "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 + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "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, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", + "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "minimatch": "^3.0.4", + "once": "^1.4.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "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 + } + } + }, + "istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", + "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true + }, + "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 + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "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 + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.3.0.tgz", + "integrity": "sha512-NSPViHOt+RW38oJklvYxQC4BSQsv737oQlr/r06pCM+slDOr4myuI1ivkRmp+3dVpJDfZt2DmaPJ2wkx+ZZuMQ==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "braces": "^3.0.2", + "chokidar": "^3.0.0", + "colors": "^1.1.0", + "connect": "^3.6.0", + "core-js": "^3.1.3", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.14", + "log4js": "^4.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.3.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "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 + } + } + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "requires": { + "which": "^1.2.1" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz", + "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==", + "dev": true, + "requires": { + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "^3.3" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.2.tgz", + "integrity": "sha512-ILBPsXqQ3eomq+oaQsM311/jxsypw5/d0LnZXj26XkfThwq7jZ55A2CFSKJVA5VekbbOGvMyv7d3juZj0SeTxA==", + "dev": true + }, + "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, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "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 + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "less": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/less/-/less-3.10.3.tgz", + "integrity": "sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + } + }, + "license-webpack-plugin": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.3.tgz", + "integrity": "sha512-vTSY5r9HOq4sxR2BIxdIXWKI+9n3b+DoQkhKHedB3TdSxTfXUDRxKXdAj5iejR+qNXprXsxvEu9W+zOhgGIkAw==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "log4js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "dev": true, + "requires": { + "date-format": "^2.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.0", + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" + } + }, + "loglevel": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "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, + "requires": { + "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "magic-string": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz", + "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + } + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "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 + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, + "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 + }, + "mini-css-extract-plugin": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "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, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.51.tgz", + "integrity": "sha512-1eQEs6HFYY1kMXQPOLzCf7HdjReErmvn85tZESMczdCNVWP3Y7URYLBAyYynuI7yef1zj4HN5q+oB2x67QU0lw==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "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 + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "npm-registry-fetch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.3.tgz", + "integrity": "sha512-WGvUx0lkKFhu9MbiGFuT9nG2NpfQ+4dCJwRwwtK2HK5izJEvwDxMeUyqbuMS7N/OkpVCqDorV6rO5E4V9F8lJw==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.0.tgz", + "integrity": "sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ==", + "dev": true, + "requires": { + "is-wsl": "^2.1.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "ora": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.2.tgz", + "integrity": "sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pacote": { + "version": "9.5.8", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.8.tgz", + "integrity": "sha512-0Tl8Oi/K0Lo4MZmH0/6IsT3gpGf9eEAznLXEQPKgPq7FscnbUOyopnVpwXlnQdIbCUaojWy1Wd7VMyqfVsRrIw==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^3.0.0", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "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 + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + } + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "protractor": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.3.tgz", + "integrity": "sha512-7pMAolv8Ah1yJIqaorDTzACtn3gk7BamVKPTeO5lqIGOrfosjPgXFx/z1dqSI+m5EeZc2GMJHPr5DYlodujDNA==", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6" + }, + "dependencies": { + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "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 + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz", + "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-package-json": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", + "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "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, + "requires": { + "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" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.7" + } + }, + "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 + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.2.tgz", + "integrity": "sha512-V4+lGplCM/ikqi5/mkkpJ06e9Bujq1NFmNLvsCs56zg3ZbzrnUzAtizZ24TXxtRX/W2jcdScwQCnbL0CICTFkQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "dev": true + }, + "regjsparser": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", + "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "1.25.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.25.2.tgz", + "integrity": "sha512-+7z6Wab/L45QCPcfpuTZKwKiB0tynj05s/+s2U3F2Bi7rOLPr9UcjUwO7/xpjlPNXA/hwnth6jBExFRGyf3tMg==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + } + }, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "requires": { + "tslib": "^1.9.0" + } + }, + "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 + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.23.3.tgz", + "integrity": "sha512-1DKRZxJMOh4Bme16AbWTyYeJAjTlrvw2+fWshHHaepeJfGq2soFZTnt0YhWit+bohtDu4LdyPoEj6VFD4APHog==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.0.tgz", + "integrity": "sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "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, + "requires": { + "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" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz", + "integrity": "sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "streamroller": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", + "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "date-format": "^2.0.0", + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.14" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "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, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "style-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", + "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "stylus": { + "version": "0.54.7", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", + "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", + "dev": true, + "requires": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.3", + "mkdirp": "~0.5.x", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.0.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "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, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "terser": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.5.1.tgz", + "integrity": "sha512-lH9zLIbX8PRBEFCTvfHGCy0s9HEKnNso1Dx9swSopF3VUnFLB8DpQ61tHxoofovNC/sG0spajJM3EIIRSTByiQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.3.tgz", + "integrity": "sha512-gWHkaGzGYjmDoYxksFZynWTzvXOAjQ5dd7xuTMYlv4zpWlLSb6v0QLSZjELzP5dMs1ox30O1BIPs9dgqlMHuLQ==", + "dev": true, + "requires": { + "cacache": "^13.0.1", + "find-cache-dir": "^3.2.0", + "jest-worker": "^25.1.0", + "p-limit": "^2.2.2", + "schema-utils": "^2.6.4", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.4.3", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "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 + }, + "jest-worker": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", + "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "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, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "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 + }, + "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, + "requires": { + "find-up": "^4.0.0" + } + }, + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + }, + "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 + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "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, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "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 + }, + "ts-node": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", + "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, + "tslint": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.18.0.tgz", + "integrity": "sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + }, + "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, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", + "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", + "dev": true + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universal-analytics": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", + "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "dev": true, + "requires": { + "debug": "^3.0.0", + "request": "^2.88.0", + "uuid": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "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 + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "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, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "4.41.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", + "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "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 + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", + "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.4", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.25", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.4.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.3.4.tgz", + "integrity": "sha512-6XbGYzjh30cGQT/NsC+9IAkJP8IL7/t47sbwR5DLSsamiD56Rwv4/+hsgEHsviPvrEFZ0JRAQtCRN3UsR2Pw9g==", + "dev": true, + "requires": { + "webpack-sources": "^1.3.0" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-3.2.0.tgz", + "integrity": "sha512-W5nRkw7+HlbsEt3qRP6MczwDDISjiRj2GYt9+bpe8A2La00TmJdwzG5bpdMXhRt1qcWmwAvl1TiKaHRa+XDS9Q==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "zone.js": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.2.tgz", + "integrity": "sha512-UAYfiuvxLN4oyuqhJwd21Uxb4CNawrq6fPS/05Su5L4G+1TN+HVDJMUHNMobVQDFJRir2cLAODXwluaOKB7HFg==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..ba16a065c --- /dev/null +++ b/package.json @@ -0,0 +1,47 @@ +{ + "name": "tech-ui", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "~9.0.5", + "@angular/common": "~9.0.5", + "@angular/compiler": "~9.0.5", + "@angular/core": "~9.0.5", + "@angular/forms": "~9.0.5", + "@angular/platform-browser": "~9.0.5", + "@angular/platform-browser-dynamic": "~9.0.5", + "@angular/router": "~9.0.5", + "rxjs": "~6.5.4", + "tslib": "^1.10.0", + "zone.js": "~0.10.2" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.900.5", + "@angular/cli": "~9.0.5", + "@angular/compiler-cli": "~9.0.5", + "@angular/language-service": "~9.0.5", + "@types/node": "^12.11.1", + "@types/jasmine": "~3.5.0", + "@types/jasminewd2": "~2.0.3", + "codelyzer": "^5.1.2", + "jasmine-core": "~3.5.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~4.3.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage-istanbul-reporter": "~2.1.0", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.4.2", + "protractor": "~5.4.3", + "ts-node": "~8.3.0", + "tslint": "~5.18.0", + "typescript": "~3.7.5" + } +} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts new file mode 100644 index 000000000..06c734263 --- /dev/null +++ b/src/app/app-routing.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + + +const routes: Routes = []; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule] +}) +export class AppRoutingModule { } diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 000000000..0c510c671 --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + {{ title }} app is running! + + + + + +
+ + +

Resources

+

Here are some links to help you get started:

+ + + + +

Next Steps

+

What do you want to do next with your app?

+ + + +
+
+ + + New Component +
+ +
+ + + Angular Material +
+ +
+ + + Add PWA Support +
+ +
+ + + Add Dependency +
+ +
+ + + Run and Watch Tests +
+ +
+ + + Build for Production +
+
+ + +
+
ng generate component xyz
+
ng add @angular/material
+
ng add @angular/pwa
+
ng add _____
+
ng test
+
ng build --prod
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/app.component.scss b/src/app/app.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts new file mode 100644 index 000000000..bc73cff60 --- /dev/null +++ b/src/app/app.component.spec.ts @@ -0,0 +1,35 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + 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 'tech-ui'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('tech-ui'); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement; + expect(compiled.querySelector('.content span').textContent).toContain('tech-ui app is running!'); + }); +}); diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 000000000..e0ba82b20 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'] +}) +export class AppComponent { + title = 'tech-ui'; +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 000000000..2c3ba2995 --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,18 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; + +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; + +@NgModule({ + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + AppRoutingModule + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts new file mode 100644 index 000000000..3612073bc --- /dev/null +++ b/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 000000000..7b4f817ad --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,16 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..997406ad22c29aae95893fb3d666c30258a09537 GIT binary patch literal 948 zcmeAS@N?(olHy`uVBq!ia0y~yV31*8V36ZrV_;ygKUz1Rfq{Xuz$3Dlfq`2Hgc&d0 zt^32kz?|mk;uzx5IW^qdM>tSq@8_3ird$#$b)PtmGj%avUXLD+Sz&S#OH+=Bed~^k zE(t5$l#lUxmp*pmH4IGd;gaZCq}bXq{|D!ekIpR10+!S`*{d|ox^icu@gBap=gxSl z)qcKL`~J+{;`cM7wI-iz2<>oODaSCydtP5^))gz^vCs#x@S-}tn_vPR|kz1LqIe!rYt))!zS zvoY(Akln64y_z>0QjMl1s!cRVJi24!LcTlil2T>5&o<0i>smExzc#e(SB@ zpT5qXq@xuU7Pi&!lysUFld}wm*K3YgSJ&p#-Wvt7zg$RJsLW@&^@+eF`2?fN5XBd} zYR&gAzj?o-u2HA8y}zpX#FqnS-c)`HnSE9~tZm`$gD*b2i2bTRB57S0T%Iz2GuuD?dAA3DV$B=lZOvyH z6r$};vfMbhvpd#2)ab(g!yh-Ek7Z~$GM#H>zhpq@2A(^5;i*}LzgRN!Zg8aEKBmo3 zU~_+0pvT;%56#ba?9GZ^(LVK@^z27^d%wKo4BR!RsX!tAv-hD-_1uOUt()YuJC_P2 zIa#nij44Xwx_+jyrA#kp&fiDVG#=mia(wT_^268u`LO+C{8`>(vCFyVAp-*ggQu&X J%Q~loCIA*?vmyWh literal 0 HcmV?d00001 diff --git a/src/index.html b/src/index.html new file mode 100644 index 000000000..eaa508f86 --- /dev/null +++ b/src/index.html @@ -0,0 +1,13 @@ + + + + + TechUi + + + + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 000000000..c7b673cf4 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); diff --git a/src/polyfills.ts b/src/polyfills.ts new file mode 100644 index 000000000..03711e5d9 --- /dev/null +++ b/src/polyfills.ts @@ -0,0 +1,63 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/src/styles.scss b/src/styles.scss new file mode 100644 index 000000000..90d4ee007 --- /dev/null +++ b/src/styles.scss @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 000000000..50193eb0f --- /dev/null +++ b/src/test.ts @@ -0,0 +1,25 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: { + context(path: string, deep?: boolean, filter?: RegExp): { + keys(): string[]; + (id: string): T; + }; +}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 000000000..f758d9820 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..8c4ef3bba --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "target": "es2015", + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true + } +} diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 000000000..6400fde7d --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 000000000..c8d70f152 --- /dev/null +++ b/tslint.json @@ -0,0 +1,91 @@ +{ + "extends": "tslint:recommended", + "rules": { + "array-type": false, + "arrow-parens": false, + "deprecation": { + "severity": "warning" + }, + "component-class-suffix": true, + "contextual-lifecycle": true, + "directive-class-suffix": true, + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-conflicting-lifecycle": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-inputs-metadata-property": true, + "no-output-native": true, + "no-output-on-prefix": true, + "no-output-rename": true, + "no-outputs-metadata-property": true, + "template-banana-in-box": true, + "template-no-negated-async": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true + }, + "rulesDirectory": [ + "codelyzer" + ] +} \ No newline at end of file From 1d249a877e748fcacbbb5404d1729ee61ab69b5f Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 10 Mar 2020 22:51:50 -0400 Subject: [PATCH 002/120] start of StatusList component --- package-lock.json | 21 + package.json | 2 + src/app/app.component.html | 536 +----------------- src/app/app.component.scss | 9 + src/app/app.component.ts | 2 +- src/app/app.module.ts | 14 +- src/app/folder.ts | 6 + src/app/mock-folders.ts | 9 + .../status-list-folder-datasource.ts | 80 +++ .../status-list/status-list.component.html | 22 + .../status-list/status-list.component.scss | 3 + .../status-list/status-list.component.spec.ts | 34 ++ src/app/status-list/status-list.component.ts | 34 ++ src/app/system-config.service.spec.ts | 16 + src/app/system-config.service.ts | 18 + src/index.html | 2 + src/styles.scss | 31 + 17 files changed, 302 insertions(+), 537 deletions(-) create mode 100644 src/app/folder.ts create mode 100644 src/app/mock-folders.ts create mode 100644 src/app/status-list/status-list-folder-datasource.ts create mode 100644 src/app/status-list/status-list.component.html create mode 100644 src/app/status-list/status-list.component.scss create mode 100644 src/app/status-list/status-list.component.spec.ts create mode 100644 src/app/status-list/status-list.component.ts create mode 100644 src/app/system-config.service.spec.ts create mode 100644 src/app/system-config.service.ts diff --git a/package-lock.json b/package-lock.json index 95f39e8a3..d7bb3f943 100644 --- a/package-lock.json +++ b/package-lock.json @@ -205,6 +205,22 @@ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.0.5.tgz", "integrity": "sha512-WGs4Jxw5sr8GCpxMcwEVuZnDIkdNp9qtmuI2j13v/XAaMjvJ7jssCj9+JG5uI8joCi7PFVAWokPT1DdPwWb13Q==" }, + "@angular/cdk": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.1.2.tgz", + "integrity": "sha512-x5niyE0iYrbVtLYjJFw2MoS+OoSbJn6y/G2pNScviDwyjBBgqRh4YgUox2kMhdPumkvuh+eA6blZoE9qpvSo2w==", + "requires": { + "parse5": "^5.0.0" + }, + "dependencies": { + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + } + } + }, "@angular/cli": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.0.5.tgz", @@ -368,6 +384,11 @@ "integrity": "sha512-9ykFNYZpWdoggFPK3LuTJobBZjoCEQP6kKt88ZZV7GTMIXoE7iY413KfhINoXdMwxIAbba0xlPMR/4p6jFAa4Q==", "dev": true }, + "@angular/material": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.1.2.tgz", + "integrity": "sha512-8uwwkSnsg/YlhqxD/+0Cj+1S97Xf5WUcgxSEXmC1r0/AD+o6PGL5ImIk4n+3tdgYqm7MoJZQthlIB2J0EVLjVw==" + }, "@angular/platform-browser": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.0.5.tgz", diff --git a/package.json b/package.json index ba16a065c..b056971dd 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,12 @@ "private": true, "dependencies": { "@angular/animations": "~9.0.5", + "@angular/cdk": "^9.1.2", "@angular/common": "~9.0.5", "@angular/compiler": "~9.0.5", "@angular/core": "~9.0.5", "@angular/forms": "~9.0.5", + "@angular/material": "^9.1.2", "@angular/platform-browser": "~9.0.5", "@angular/platform-browser-dynamic": "~9.0.5", "@angular/router": "~9.0.5", diff --git a/src/app/app.component.html b/src/app/app.component.html index 0c510c671..9af6f4b83 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,534 +1,2 @@ - - - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - {{ title }} app is running! - - - - - -
- - -

Resources

-

Here are some links to help you get started:

- - - - -

Next Steps

-

What do you want to do next with your app?

- - - -
-
- - - New Component -
- -
- - - Angular Material -
- -
- - - Add PWA Support -
- -
- - - Add Dependency -
- -
- - - Run and Watch Tests -
- -
- - - Build for Production -
-
- - -
-
ng generate component xyz
-
ng add @angular/material
-
ng add @angular/pwa
-
ng add _____
-
ng test
-
ng build --prod
-
- - - - - - - - - - - -
- - - - - - - - - - - - \ No newline at end of file +

{{title}}

+ \ No newline at end of file diff --git a/src/app/app.component.scss b/src/app/app.component.scss index e69de29bb..6df0acfc4 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -0,0 +1,9 @@ +/* Structure */ +table { + width: 100%; +} + +.mat-form-field { + font-size: 14px; + width: 100%; +} \ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts index e0ba82b20..fed51e5c5 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -6,5 +6,5 @@ import { Component } from '@angular/core'; styleUrls: ['./app.component.scss'] }) export class AppComponent { - title = 'tech-ui'; + title = 'Tech UI'; } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 2c3ba2995..83c230204 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -3,14 +3,24 @@ import { NgModule } from '@angular/core'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { StatusListComponent } from './status-list/status-list.component'; +import { MatTableModule } from '@angular/material/table'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatSortModule } from '@angular/material/sort'; @NgModule({ declarations: [ - AppComponent + AppComponent, + StatusListComponent, ], imports: [ BrowserModule, - AppRoutingModule + AppRoutingModule, + BrowserAnimationsModule, + MatTableModule, + MatPaginatorModule, + MatSortModule, ], providers: [], bootstrap: [AppComponent] diff --git a/src/app/folder.ts b/src/app/folder.ts new file mode 100644 index 000000000..0ca038740 --- /dev/null +++ b/src/app/folder.ts @@ -0,0 +1,6 @@ +export interface Folder { + id: string; + label: string; + + // TODO add additional properties +} \ No newline at end of file diff --git a/src/app/mock-folders.ts b/src/app/mock-folders.ts new file mode 100644 index 000000000..06d699b87 --- /dev/null +++ b/src/app/mock-folders.ts @@ -0,0 +1,9 @@ +import { Folder } from './folder'; + +export const FOLDERS: Folder[] = [ + { id: 'GXWxf-3zgnU', label: 'Downloads' }, + { id: 'PXWxf-3zgnU', label: 'Music' }, + { id: 'QXWxf-3zgnU', label: 'Photos' }, + { id: 'RXWxf-3zgnU', label: 'Movies' }, + { id: 'SXWxf-3zgnU', label: 'Folder 5' }, +]; \ No newline at end of file diff --git a/src/app/status-list/status-list-folder-datasource.ts b/src/app/status-list/status-list-folder-datasource.ts new file mode 100644 index 000000000..b072477a6 --- /dev/null +++ b/src/app/status-list/status-list-folder-datasource.ts @@ -0,0 +1,80 @@ +import { DataSource } from '@angular/cdk/collections'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { map } from 'rxjs/operators'; +import { Observable, of as observableOf, merge } from 'rxjs'; +import { Folder } from '../folder'; +import { SystemConfigService } from '../system-config.service'; +import { FOLDERS } from '../mock-folders'; + +/** + * Data source for the StatusList view. This class should + * encapsulate all logic for fetching and manipulating the displayed data + * (including sorting, pagination, and filtering). + */ +export class StatusListFolderDataSource extends DataSource { + data: Folder[] = FOLDERS; + paginator: MatPaginator; + sort: MatSort; + + constructor(private systemConfigService: SystemConfigService) { + super(); + } + + /** + * Connect this data source to the table. The table will only update when + * the returned stream emits new items. + * @returns A stream of the items to be rendered. + */ + connect(): Observable { + // Combine everything that affects the rendered data into one update + // stream for the data-table to consume. + const dataMutations = [ + observableOf(this.data), + this.paginator.page, + this.sort.sortChange + ]; + + return merge(...dataMutations).pipe(map(() => { + return this.getPagedData(this.getSortedData([...this.data])); + })); + } + + /** + * Called when the table is being destroyed. Use this function, to clean up + * any open connections or free any held resources that were set up during connect. + */ + disconnect() { } + + /** + * Paginate the data (client-side). If you're using server-side pagination, + * this would be replaced by requesting the appropriate data from the server. + */ + private getPagedData(data: Folder[]) { + const startIndex = this.paginator.pageIndex * this.paginator.pageSize; + return data.splice(startIndex, this.paginator.pageSize); + } + + /** + * Sort the data (client-side). If you're using server-side sorting, + * this would be replaced by requesting the appropriate data from the server. + */ + private getSortedData(data: Folder[]) { + if (!this.sort.active || this.sort.direction === '') { + return data; + } + + return data.sort((a, b) => { + const isAsc = this.sort.direction === 'asc'; + switch (this.sort.active) { + case 'label': return compare(a.label, b.label, isAsc); + case 'id': return compare(+a.id, +b.id, isAsc); + default: return 0; + } + }); + } +} + +function compare(a: string | number, b: string | number, isAsc: boolean) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); +} diff --git a/src/app/status-list/status-list.component.html b/src/app/status-list/status-list.component.html new file mode 100644 index 000000000..b8dda2cd5 --- /dev/null +++ b/src/app/status-list/status-list.component.html @@ -0,0 +1,22 @@ +
+ + + + + + + + + + + + + + + +
Id{{row.id}}Label{{row.label}}
+ + + +
\ No newline at end of file diff --git a/src/app/status-list/status-list.component.scss b/src/app/status-list/status-list.component.scss new file mode 100644 index 000000000..5050fb6e0 --- /dev/null +++ b/src/app/status-list/status-list.component.scss @@ -0,0 +1,3 @@ +.full-width-table { + width: 100%; +} diff --git a/src/app/status-list/status-list.component.spec.ts b/src/app/status-list/status-list.component.spec.ts new file mode 100644 index 000000000..daa23d2ba --- /dev/null +++ b/src/app/status-list/status-list.component.spec.ts @@ -0,0 +1,34 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableModule } from '@angular/material/table'; + +import { StatusListComponent } from './status-list.component'; + +describe('StatusListComponent', () => { + let component: StatusListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ StatusListComponent ], + imports: [ + NoopAnimationsModule, + MatPaginatorModule, + MatSortModule, + MatTableModule, + ] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(StatusListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should compile', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/status-list/status-list.component.ts b/src/app/status-list/status-list.component.ts new file mode 100644 index 000000000..9a4e830a6 --- /dev/null +++ b/src/app/status-list/status-list.component.ts @@ -0,0 +1,34 @@ +import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { MatTable } from '@angular/material/table'; +import { StatusListFolderDataSource } from './status-list-folder-datasource'; +import { Folder } from '../folder'; +import { SystemConfigService } from '../system-config.service'; + +@Component({ + selector: 'app-status-list', + templateUrl: './status-list.component.html', + styleUrls: ['./status-list.component.scss'] +}) +export class StatusListComponent implements AfterViewInit, OnInit { + @ViewChild(MatPaginator) paginator: MatPaginator; + @ViewChild(MatSort) sort: MatSort; + @ViewChild(MatTable) table: MatTable; + dataSource: StatusListFolderDataSource; + + /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ + displayedColumns = ['id', 'name']; + + constructor(private systemConfigService: SystemConfigService) { }; + + ngOnInit() { + this.dataSource = new StatusListFolderDataSource(this.systemConfigService); + } + + ngAfterViewInit() { + this.dataSource.sort = this.sort; + this.dataSource.paginator = this.paginator; + this.table.dataSource = this.dataSource; + } +} diff --git a/src/app/system-config.service.spec.ts b/src/app/system-config.service.spec.ts new file mode 100644 index 000000000..7f2beb10a --- /dev/null +++ b/src/app/system-config.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { SystemConfigService } from './system-config.service'; + +describe('SystemConfigService', () => { + let service: SystemConfigService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(SystemConfigService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts new file mode 100644 index 000000000..852af0d09 --- /dev/null +++ b/src/app/system-config.service.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@angular/core'; + +import { Observable, of } from 'rxjs'; + +import { Folder } from './folder'; +import { FOLDERS } from './mock-folders'; + +@Injectable({ + providedIn: 'root' +}) +export class SystemConfigService { + + constructor() { } + + getFolders(): Observable { + return of(FOLDERS); + } +} diff --git a/src/index.html b/src/index.html index eaa508f86..96b91058b 100644 --- a/src/index.html +++ b/src/index.html @@ -6,6 +6,8 @@ + + diff --git a/src/styles.scss b/src/styles.scss index 90d4ee007..7f8d3bdaf 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1 +1,32 @@ + +// Custom Theming for Angular Material +// For more information: https://material.angular.io/guide/theming +@import '~@angular/material/theming'; +// Plus imports for other components in your app. + +// Include the common styles for Angular Material. We include this here so that you only +// have to load a single css file for Angular Material in your app. +// Be sure that you only ever include this mixin once! +@include mat-core(); + +// Define the palettes for your theme using the Material Design palettes available in palette.scss +// (imported above). For each palette, you can optionally specify a default, lighter, and darker +// hue. Available color palettes: https://material.io/design/color/ +$tech-ui-primary: mat-palette($mat-indigo); +$tech-ui-accent: mat-palette($mat-pink, A200, A100, A400); + +// The warn palette is optional (defaults to red). +$tech-ui-warn: mat-palette($mat-red); + +// Create the theme object (a Sass map containing all of the palettes). +$tech-ui-theme: mat-light-theme($tech-ui-primary, $tech-ui-accent, $tech-ui-warn); + +// Include theme styles for core and each component used in your app. +// Alternatively, you can import and @include the theme mixins for each component +// that you are using. +@include angular-material-theme($tech-ui-theme); + /* 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; } From 031fd72dfdc3e76595de1817ab7ee207e1cf4bc2 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 11 Mar 2020 11:01:11 -0400 Subject: [PATCH 003/120] start of toggle to switch between devices and folders data table --- src/app/app.module.ts | 5 ++++ src/app/device.ts | 6 +++++ .../{mock-folders.ts => mock-config-data.ts} | 8 ++++++ .../status-list-folder-datasource.ts | 9 +++---- .../status-list/status-list.component.html | 1 + src/app/status-list/status-list.component.ts | 9 ++++++- .../status-toggle.component.html | 4 +++ .../status-toggle.component.scss | 0 .../status-toggle.component.spec.ts | 25 +++++++++++++++++++ .../status-toggle/status-toggle.component.ts | 15 +++++++++++ src/app/system-config.service.ts | 8 +++++- 11 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 src/app/device.ts rename src/app/{mock-folders.ts => mock-config-data.ts} (55%) create mode 100644 src/app/status-toggle/status-toggle.component.html create mode 100644 src/app/status-toggle/status-toggle.component.scss create mode 100644 src/app/status-toggle/status-toggle.component.spec.ts create mode 100644 src/app/status-toggle/status-toggle.component.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 83c230204..ed878b408 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -8,11 +8,15 @@ import { StatusListComponent } from './status-list/status-list.component'; import { MatTableModule } from '@angular/material/table'; import { MatPaginatorModule } from '@angular/material/paginator'; import { MatSortModule } from '@angular/material/sort'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { StatusToggleComponent } from './status-toggle/status-toggle.component'; + @NgModule({ declarations: [ AppComponent, StatusListComponent, + StatusToggleComponent, ], imports: [ BrowserModule, @@ -21,6 +25,7 @@ import { MatSortModule } from '@angular/material/sort'; MatTableModule, MatPaginatorModule, MatSortModule, + MatButtonToggleModule ], providers: [], bootstrap: [AppComponent] diff --git a/src/app/device.ts b/src/app/device.ts new file mode 100644 index 000000000..152e73d8a --- /dev/null +++ b/src/app/device.ts @@ -0,0 +1,6 @@ +export interface Device { + id: string; + name: string; + + // TODO add additional properties +} \ No newline at end of file diff --git a/src/app/mock-folders.ts b/src/app/mock-config-data.ts similarity index 55% rename from src/app/mock-folders.ts rename to src/app/mock-config-data.ts index 06d699b87..2976df5b4 100644 --- a/src/app/mock-folders.ts +++ b/src/app/mock-config-data.ts @@ -1,4 +1,5 @@ import { Folder } from './folder'; +import { Device } from './device'; export const FOLDERS: Folder[] = [ { id: 'GXWxf-3zgnU', label: 'Downloads' }, @@ -6,4 +7,11 @@ export const FOLDERS: Folder[] = [ { id: 'QXWxf-3zgnU', label: 'Photos' }, { id: 'RXWxf-3zgnU', label: 'Movies' }, { id: 'SXWxf-3zgnU', label: 'Folder 5' }, +]; + +export const DEVICES: Device[] = [ + { id: '001', name: 'macbook' }, + { id: '002', name: 'bedroom computer' }, + { id: '003', name: 'server in closet' }, + { id: '004', name: 'random' }, ]; \ No newline at end of file diff --git a/src/app/status-list/status-list-folder-datasource.ts b/src/app/status-list/status-list-folder-datasource.ts index b072477a6..e723b2daa 100644 --- a/src/app/status-list/status-list-folder-datasource.ts +++ b/src/app/status-list/status-list-folder-datasource.ts @@ -1,23 +1,22 @@ import { DataSource } from '@angular/cdk/collections'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; + import { map } from 'rxjs/operators'; import { Observable, of as observableOf, merge } from 'rxjs'; import { Folder } from '../folder'; -import { SystemConfigService } from '../system-config.service'; -import { FOLDERS } from '../mock-folders'; /** * Data source for the StatusList view. This class should * encapsulate all logic for fetching and manipulating the displayed data * (including sorting, pagination, and filtering). */ -export class StatusListFolderDataSource extends DataSource { - data: Folder[] = FOLDERS; +export class StatusListFolderDataSource extends DataSource { + data: any[]; paginator: MatPaginator; sort: MatSort; - constructor(private systemConfigService: SystemConfigService) { + constructor() { super(); } diff --git a/src/app/status-list/status-list.component.html b/src/app/status-list/status-list.component.html index b8dda2cd5..348c4e65c 100644 --- a/src/app/status-list/status-list.component.html +++ b/src/app/status-list/status-list.component.html @@ -1,3 +1,4 @@ +
diff --git a/src/app/status-list/status-list.component.ts b/src/app/status-list/status-list.component.ts index 9a4e830a6..395f700b7 100644 --- a/src/app/status-list/status-list.component.ts +++ b/src/app/status-list/status-list.component.ts @@ -2,10 +2,12 @@ import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { MatTable } from '@angular/material/table'; + import { StatusListFolderDataSource } from './status-list-folder-datasource'; import { Folder } from '../folder'; import { SystemConfigService } from '../system-config.service'; + @Component({ selector: 'app-status-list', templateUrl: './status-list.component.html', @@ -23,7 +25,12 @@ export class StatusListComponent implements AfterViewInit, OnInit { constructor(private systemConfigService: SystemConfigService) { }; ngOnInit() { - this.dataSource = new StatusListFolderDataSource(this.systemConfigService); + this.dataSource = new StatusListFolderDataSource(); + this.systemConfigService.getDevices().subscribe( + data => { + this.dataSource.data = data; + } + ); } ngAfterViewInit() { diff --git a/src/app/status-toggle/status-toggle.component.html b/src/app/status-toggle/status-toggle.component.html new file mode 100644 index 000000000..97a944d48 --- /dev/null +++ b/src/app/status-toggle/status-toggle.component.html @@ -0,0 +1,4 @@ + + Folders + Devices + \ No newline at end of file diff --git a/src/app/status-toggle/status-toggle.component.scss b/src/app/status-toggle/status-toggle.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/status-toggle/status-toggle.component.spec.ts b/src/app/status-toggle/status-toggle.component.spec.ts new file mode 100644 index 000000000..329733ba3 --- /dev/null +++ b/src/app/status-toggle/status-toggle.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { StatusToggleComponent } from './status-toggle.component'; + +describe('StatusToggleComponent', () => { + let component: StatusToggleComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ StatusToggleComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(StatusToggleComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/status-toggle/status-toggle.component.ts b/src/app/status-toggle/status-toggle.component.ts new file mode 100644 index 000000000..538e93e31 --- /dev/null +++ b/src/app/status-toggle/status-toggle.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-status-toggle', + templateUrl: './status-toggle.component.html', + styleUrls: ['./status-toggle.component.scss'] +}) +export class StatusToggleComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} \ No newline at end of file diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index 852af0d09..daf8e2bb3 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -3,7 +3,8 @@ import { Injectable } from '@angular/core'; import { Observable, of } from 'rxjs'; import { Folder } from './folder'; -import { FOLDERS } from './mock-folders'; +import { Device } from './device'; +import { FOLDERS, DEVICES } from './mock-config-data'; @Injectable({ providedIn: 'root' @@ -15,4 +16,9 @@ export class SystemConfigService { getFolders(): Observable { return of(FOLDERS); } + + getDevices(): Observable { + return of(DEVICES); + } + } From 61b4de581da4cb7ae8537abe2fcdd14506f28931 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 11 Mar 2020 16:00:59 -0400 Subject: [PATCH 004/120] create folder and device list components refactor status-list to contain device and folder list --- package-lock.json | 1795 ++++++++++++++++- package.json | 1 + src/app/app.module.ts | 13 +- src/app/device-list/device-list-datasource.ts | 79 + .../device-list/device-list.component.html | 22 + .../device-list/device-list.component.scss | 3 + .../device-list/device-list.component.spec.ts | 34 + src/app/device-list/device-list.component.ts | 41 + .../folder-list-datasource.ts} | 8 +- .../folder-list/folder-list.component.html | 22 + .../folder-list/folder-list.component.scss | 3 + .../folder-list/folder-list.component.spec.ts | 34 + src/app/folder-list/folder-list.component.ts | 41 + .../status-list/status-list.component.html | 24 +- .../status-list/status-list.component.scss | 3 - .../status-list/status-list.component.spec.ts | 17 +- src/app/status-list/status-list.component.ts | 34 +- .../status-toggle.component.html | 4 +- .../status-toggle/status-toggle.component.ts | 20 +- 19 files changed, 2045 insertions(+), 153 deletions(-) create mode 100644 src/app/device-list/device-list-datasource.ts create mode 100644 src/app/device-list/device-list.component.html create mode 100644 src/app/device-list/device-list.component.scss create mode 100644 src/app/device-list/device-list.component.spec.ts create mode 100644 src/app/device-list/device-list.component.ts rename src/app/{status-list/status-list-folder-datasource.ts => folder-list/folder-list-datasource.ts} (92%) create mode 100644 src/app/folder-list/folder-list.component.html create mode 100644 src/app/folder-list/folder-list.component.scss create mode 100644 src/app/folder-list/folder-list.component.spec.ts create mode 100644 src/app/folder-list/folder-list.component.ts diff --git a/package-lock.json b/package-lock.json index d7bb3f943..f0d9e9b0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1653,6 +1653,11 @@ "through": ">=2.2.7 <3" } }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1666,14 +1671,27 @@ "acorn": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "dev": true + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==" }, "adm-zip": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", - "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", - "dev": true + "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==" }, "after": { "version": "0.8.2", @@ -1733,12 +1751,45 @@ "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "dev": true }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, + "alter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", + "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", + "requires": { + "stable": "~0.1.3" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", @@ -1806,6 +1857,11 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "archy": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz", + "integrity": "sha1-kQ9Dv2YUH8M1VkWXq8GJ30Sz014=" + }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -1953,6 +2009,16 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "ast-traverse": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", + "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY=" + }, + "ast-types": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", + "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==" + }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -2007,6 +2073,34 @@ "postcss-value-parser": "^4.0.2" } }, + "autoprefixer-core": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/autoprefixer-core/-/autoprefixer-core-3.1.2.tgz", + "integrity": "sha1-reXOni2dcbt//DHWlvpeh66+tjQ=", + "requires": { + "caniuse-db": "^1.0.30000006", + "postcss": "~2.2.5" + }, + "dependencies": { + "postcss": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-2.2.6.tgz", + "integrity": "sha1-wENE4kSeRYa5Vfvkp093CA2EVx8=", + "requires": { + "js-base64": "~2.1.5", + "source-map": "~0.1.40" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -2071,8 +2165,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -2129,6 +2222,11 @@ } } }, + "base62": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/base62/-/base62-0.1.1.tgz", + "integrity": "sha1-e0F0wvlESXU7EcJlHAg9qEGnsIQ=" + }, "base64-arraybuffer": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", @@ -2199,6 +2297,14 @@ "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", "dev": true }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, "blocking-proxy": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", @@ -2291,7 +2397,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2306,6 +2411,11 @@ "fill-range": "^7.0.1" } }, + "breakable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", + "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=" + }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -2454,6 +2564,23 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "builder-autoprefixer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/builder-autoprefixer/-/builder-autoprefixer-1.0.4.tgz", + "integrity": "sha1-nNjDdqbXoXIAvYyjMbUfIwDhrHA=", + "requires": { + "autoprefixer-core": "^3.1.1" + } + }, + "builder-es6-module-to-cjs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/builder-es6-module-to-cjs/-/builder-es6-module-to-cjs-1.1.0.tgz", + "integrity": "sha1-efMpfRjEe7iLQ5R1OPoccnQnHuM=", + "requires": { + "es6-module-jstransform": "^0.1.2", + "is-module": "^1.0.0" + } + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -2580,6 +2707,11 @@ "lodash.uniq": "^4.5.0" } }, + "caniuse-db": { + "version": "1.0.30001033", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001033.tgz", + "integrity": "sha512-2ZReq+OHqHhsIQSiv8OVNhQ6Ht9eYJpwblZydHV8nI44Od6J5YUl3J9Wxvjry/v969jCHH5fR9+C6FwJ41XbOQ==" + }, "caniuse-lite": { "version": "1.0.30001020", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz", @@ -2598,6 +2730,15 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2609,6 +2750,16 @@ "supports-color": "^5.3.0" } }, + "chanel": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chanel/-/chanel-2.2.0.tgz", + "integrity": "sha1-JlKVsouSqoIAX4Zd0VpIlMQ42Tw=", + "requires": { + "co": "*", + "generator-supported": "*", + "to-descriptor": "*" + } + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -2768,6 +2919,11 @@ "shallow-clone": "^3.0.0" } }, + "co": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", + "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=" + }, "coa": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", @@ -2816,6 +2972,40 @@ } } }, + "cogent": { + "version": "git://github.com/timaschew/cogent.git#2246bd071392f5053a3a110024fd608a40a593ba", + "from": "git://github.com/timaschew/cogent.git#fix-redirects", + "requires": { + "debug": "*", + "generator-supported": "~0.0.1", + "netrc": "~0.1.3", + "proxy-agent": "^1.1.0", + "raw-body": "^1.1.2", + "statuses": "^1.0.2", + "write-to": "^1.0.0" + }, + "dependencies": { + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" + }, + "iconv-lite": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.8.tgz", + "integrity": "sha1-xgGadZXyzvynAuq2lKAQvNkpjSA=" + }, + "raw-body": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.4.tgz", + "integrity": "sha1-zMfd/Ea3KGHN1btDPIQLcLbyf1Q=", + "requires": { + "bytes": "1.0.0", + "iconv-lite": "0.4.8" + } + } + } + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -2879,8 +3069,7 @@ "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 + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "commondir": { "version": "1.0.1", @@ -2888,30 +3077,477 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "commoner": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", + "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", + "requires": { + "commander": "^2.5.0", + "detective": "^4.3.1", + "glob": "^5.0.15", + "graceful-fs": "^4.1.2", + "iconv-lite": "^0.4.5", + "mkdirp": "^0.5.0", + "private": "^0.1.6", + "q": "^1.1.2", + "recast": "^0.11.17" + }, + "dependencies": { + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=" + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, "compare-versions": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true }, + "component": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/component/-/component-1.1.0.tgz", + "integrity": "sha1-NgSaold5i37lcUKWHhjgdnkYyao=", + "requires": { + "co": "^3.0.0", + "commander": "^2.2.0", + "component-build": "^1.2.2", + "component-consoler": "^2.0.0", + "component-flatten": "^1.0.1", + "component-ls": "^2.1.0", + "component-outdated2": "^1.0.4", + "component-pin": "^1.0.4", + "component-remotes": "^1.2.0", + "component-resolver": "^1.3.0", + "component-search2": "^1.1.1", + "component-updater": "^1.0.4", + "component-watcher": "^1.0.1", + "debug": "*", + "mkdirp": "~0.3.5", + "rimraf": "^2.2.6", + "semver": "^2.2.1", + "superagent": "~0.17.0", + "tiny-lr-fork": "0.0.5", + "win-fork": "~1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" + } + } + }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", "dev": true }, + "component-build": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/component-build/-/component-build-1.2.2.tgz", + "integrity": "sha1-1bwl0lIE35On2aN6LeAE4RmkpXw=", + "requires": { + "builder-autoprefixer": "^1.0.3", + "builder-es6-module-to-cjs": "^1.1.0", + "component-builder": "^1.1.12", + "debug": "*" + } + }, + "component-builder": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-builder/-/component-builder-1.2.1.tgz", + "integrity": "sha1-o5fBg3na9RH4Woy5TKDZIcHdsaQ=", + "requires": { + "chanel": "^2.0.0", + "co": "^3.1.0", + "component-flatten": "^1.0.1", + "component-manifest": "^1.0.0", + "component-require2": "^1.0.1", + "cp": "^0.1.1", + "debug": "*", + "generator-supported": "~0.0.1", + "graceful-fs": "^2.0.3", + "mkdirp": "^0.3.5", + "requires": "^1.0.0", + "syntax-error": "^1.1.1" + }, + "dependencies": { + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" + }, + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" + } + } + }, + "component-consoler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/component-consoler/-/component-consoler-2.0.0.tgz", + "integrity": "sha1-Peq/BGwjm2EGNi7JaJQGNruhTCM=", + "requires": { + "debug": "*" + } + }, + "component-downloader": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/component-downloader/-/component-downloader-1.2.0.tgz", + "integrity": "sha1-b/Z/9xyEaoWKrjGog1X5vxrUO20=", + "requires": { + "chanel": "^2.0.1", + "co": "^3", + "component-consoler": "^2.0.0", + "component-remotes": "^1.1.1", + "debug": "*", + "decompress": "~0.2.0", + "generator-supported": "~0.0.1", + "graceful-fs": "^2.0.2", + "mkdirp": "~0.3.5", + "rimraf": "^2.2.6", + "semver": "^2.2.0", + "unglob": "~0.1.2", + "write-to": "^1.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" + }, + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" + } + } + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "component-flatten": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/component-flatten/-/component-flatten-1.0.1.tgz", + "integrity": "sha1-W0n0msRcuIxDAyuXozb1P4fNbIw=", + "requires": { + "semver": "^2.2.1" + }, + "dependencies": { + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" + } + } + }, "component-inherit": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "dev": true }, + "component-ls": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/component-ls/-/component-ls-2.1.0.tgz", + "integrity": "sha1-wR7ez4mDbd6JBkrQT+JK3YClERI=", + "requires": { + "archy": "~0.0.2" + } + }, + "component-manifest": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-manifest/-/component-manifest-1.0.0.tgz", + "integrity": "sha1-SNy7HqPGiHYifmra/PNxJbC81XI=", + "requires": { + "debug": "*", + "generator-supported": "~0.0.1", + "graceful-fs": "^2.0.1", + "unglob": "~0.1.1" + }, + "dependencies": { + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" + } + } + }, + "component-outdated2": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/component-outdated2/-/component-outdated2-1.0.5.tgz", + "integrity": "sha1-IGbA9Cx1w18tS/3iv5/s4M5GPRQ=", + "requires": { + "component-consoler": "^2.0.0", + "component-flatten": "^1.0.1", + "component-remotes": "^1.1.5", + "generator-supported": "~0.0.1", + "semver": "^2.2.1" + }, + "dependencies": { + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" + } + } + }, + "component-pin": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/component-pin/-/component-pin-1.0.5.tgz", + "integrity": "sha1-v6lOAepCB18ufU17X3i2Yt24NY0=", + "requires": { + "component-consoler": "^2.0.0", + "component-flatten": "^1.0.1", + "component-remotes": "^1.1.5", + "generator-supported": "~0.0.1", + "semver": "^2.2.1" + }, + "dependencies": { + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" + } + } + }, + "component-remotes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/component-remotes/-/component-remotes-1.2.0.tgz", + "integrity": "sha1-PQeYpR5ziZxs5VnZN2Olb8eh2IM=", + "requires": { + "co": "^3", + "cogent": "git://github.com/timaschew/cogent.git#fix-redirects", + "component-consoler": "^2.0.0", + "component-validator": "^1.0.0", + "debug": "*", + "generator-supported": "~0.0.1", + "graceful-fs": "^2.0.2", + "semver": "^2.2.1" + }, + "dependencies": { + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" + }, + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" + } + } + }, + "component-require2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/component-require2/-/component-require2-1.1.1.tgz", + "integrity": "sha1-POrqGYc8HG74X1O48572koWvXMU=" + }, + "component-resolver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-resolver/-/component-resolver-1.3.0.tgz", + "integrity": "sha1-79grBa9krRJ4W5h8AfCsQfAKaNw=", + "requires": { + "chanel": "^2.0.2", + "co": "^3", + "component-consoler": "^2.0.0", + "component-downloader": "^1.2.0", + "component-flatten": "^1.0.1", + "component-remotes": "^1.2.0", + "component-validator": "^1.1.1", + "debug": "*", + "generator-supported": "~0.0.1", + "graceful-fs": "^2.0.1", + "semver": "^2.2.1", + "unglob": "~0.1.2" + }, + "dependencies": { + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" + }, + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" + } + } + }, + "component-search2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/component-search2/-/component-search2-1.1.1.tgz", + "integrity": "sha1-kmeDygb2Hvdd7YW7ZVuq3i/J65E=", + "requires": { + "JSONStream": "~0.8.0", + "bytes": "~0.3.0", + "cogent": "~0.4.0", + "component-consoler": "^2.0.0", + "debug": "*", + "event-stream": "^3.1.1", + "generator-supported": "~0.0.1", + "stream-to-array": "^1.0.0" + }, + "dependencies": { + "JSONStream": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", + "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + "requires": { + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + } + }, + "bytes": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.3.0.tgz", + "integrity": "sha1-eOLg4ox/nHuYjqiu4NtNX6mUGTU=" + }, + "cogent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/cogent/-/cogent-0.4.3.tgz", + "integrity": "sha1-UAdE8R2D6cD8Q+9vlem5zHFaCFQ=", + "requires": { + "debug": "*", + "generator-supported": "~0.0.1", + "netrc": "~0.1.3", + "proxy-agent": "^1.1.0", + "raw-body": "^1.1.2", + "statuses": "^1.0.2", + "write-to": "^1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.8.tgz", + "integrity": "sha1-xgGadZXyzvynAuq2lKAQvNkpjSA=" + }, + "jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=" + }, + "raw-body": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.4.tgz", + "integrity": "sha1-zMfd/Ea3KGHN1btDPIQLcLbyf1Q=", + "requires": { + "bytes": "1.0.0", + "iconv-lite": "0.4.8" + }, + "dependencies": { + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" + } + } + } + } + }, + "component-updater": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/component-updater/-/component-updater-1.0.5.tgz", + "integrity": "sha1-CHd/ZxzodeE+MHwdghfC6l8aSsQ=", + "requires": { + "component-consoler": "^2.0.0", + "component-flatten": "^1.0.1", + "component-remotes": "^1.1.5", + "generator-supported": "~0.0.1", + "semver": "^2.2.1" + }, + "dependencies": { + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" + } + } + }, + "component-validator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/component-validator/-/component-validator-1.1.1.tgz", + "integrity": "sha1-+lD+t/WL7IndaXktE6Mn4lJgjl4=", + "requires": { + "component-consoler": "^2.0.0" + } + }, + "component-watcher": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/component-watcher/-/component-watcher-1.0.3.tgz", + "integrity": "sha1-wl6AF0sLQFVJXX7xJnmGJm2QxTU=", + "requires": { + "debug": "*", + "sane": "0" + } + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -2956,8 +3592,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -3054,6 +3689,11 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, + "cookiejar": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-1.3.0.tgz", + "integrity": "sha1-3QCzVnkCHpnL1OhVua0EGRNHR2U=" + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -3186,8 +3826,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "5.2.1", @@ -3226,6 +3865,11 @@ } } }, + "cp": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/cp/-/cp-0.1.1.tgz", + "integrity": "sha1-OUanbBpT/+DmhZPzQcEkszbB8G0=" + }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", @@ -3529,6 +4173,11 @@ "assert-plus": "^1.0.0" } }, + "data-uri-to-buffer": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.4.tgz", + "integrity": "sha1-RuE6udqOMJdFyNAc5UchPr2y/j8=" + }, "date-format": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", @@ -3539,7 +4188,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, "requires": { "ms": "^2.1.1" } @@ -3553,8 +4201,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", @@ -3562,6 +4209,47 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "decompress": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-0.2.5.tgz", + "integrity": "sha1-0hMjPv4GbM2A2RTXk/GzDNmEuEc=", + "requires": { + "adm-zip": "^0.4.3", + "ext-name": "^1.0.0", + "get-stdin": "^0.1.0", + "mkdirp": "^0.3.5", + "nopt": "^2.2.0", + "rimraf": "^2.2.2", + "stream-combiner": "^0.0.4", + "tar": "^0.1.18", + "tempfile": "^0.1.2" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "tar": { + "version": "0.1.20", + "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", + "integrity": "sha1-QpQLrltfIsdEg2mRJvnz8nRJyxM=", + "requires": { + "block-stream": "*", + "fstream": "~0.1.28", + "inherits": "2" + } + } + } + }, "deep-equal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", @@ -3576,6 +4264,11 @@ "regexp.prototype.flags": "^1.2.0" } }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, "default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", @@ -3662,6 +4355,111 @@ } } }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "defs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", + "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=", + "requires": { + "alter": "~0.2.0", + "ast-traverse": "~0.1.1", + "breakable": "~1.0.0", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "simple-fmt": "~0.1.0", + "simple-is": "~0.2.0", + "stringmap": "~0.2.2", + "stringset": "~0.2.1", + "tryor": "~0.1.2", + "yargs": "~3.27.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", + "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", + "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", + "requires": { + "camelcase": "^1.2.1", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" + } + } + } + }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "requires": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + } + } + }, "del": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", @@ -3755,6 +4553,27 @@ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, + "detective": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", + "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", + "requires": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" + } + } + }, + "dethroy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dethroy/-/dethroy-1.0.2.tgz", + "integrity": "sha1-yCADMXaT3LzaP3UrAYLjvxbdRCE=" + }, "dezalgo": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", @@ -3883,6 +4702,11 @@ "is-obj": "^2.0.0" } }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -3932,6 +4756,11 @@ "minimalistic-crypto-utils": "^1.0.0" } }, + "emitter-component": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.0.0.tgz", + "integrity": "sha1-8E3Rj8PcPpp0y8DzELCIZm5MAW8=" + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4159,6 +4988,22 @@ "is-symbol": "^1.0.2" } }, + "es6-module-jstransform": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/es6-module-jstransform/-/es6-module-jstransform-0.1.4.tgz", + "integrity": "sha1-OtHj6qt0UY9a8jwQFPGCjF6WfAI=", + "requires": { + "esprima-fb": "~3001.1.0-dev-harmony-fb", + "jstransform": "~3.0.0" + }, + "dependencies": { + "esprima-fb": { + "version": "3001.1.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", + "integrity": "sha1-t303q8046gt3Qmu4vCkizmtCZBE=" + } + } + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -4186,6 +5031,26 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", @@ -4199,8 +5064,7 @@ "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 + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esrecurse": { "version": "4.2.1", @@ -4214,14 +5078,12 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -4229,6 +5091,31 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, + "event-stream": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", + "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", + "requires": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + }, + "dependencies": { + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + } + } + }, "eventemitter3": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", @@ -4398,11 +5285,27 @@ } } }, + "ext-list": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-0.2.0.tgz", + "integrity": "sha1-NhTV8pn0pZKolinn3oJfF3TRmr0=", + "requires": { + "got": "^0.2.0" + } + }, + "ext-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-1.0.1.tgz", + "integrity": "sha1-GCgzVtxAo5NFXFRGDwWZzpfTDgw=", + "requires": { + "ext-list": "^0.2.0", + "underscore.string": "~2.3.3" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", @@ -4519,6 +5422,11 @@ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, "fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", @@ -4762,6 +5670,11 @@ "mime-types": "^2.1.12" } }, + "formidable": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz", + "integrity": "sha1-Kz9MQRy7X91pXESEPiojUUpDIxo=" + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -4783,6 +5696,11 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -4828,8 +5746,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.1.2", @@ -4838,12 +5755,78 @@ "dev": true, "optional": true }, + "fstream": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", + "integrity": "sha1-czfwWPu7vvqMn1YaKMqwhJICyYg=", + "requires": { + "graceful-fs": "~3.0.2", + "inherits": "~2.0.0", + "mkdirp": "0.5", + "rimraf": "2" + }, + "dependencies": { + "graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "requires": { + "natives": "^1.1.3" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "generator-supported": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/generator-supported/-/generator-supported-0.0.1.tgz", + "integrity": "sha1-kivSIBpsONj6y4FdWT2KA8iYwpk=" + }, "genfun": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", @@ -4856,6 +5839,11 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "get-stdin": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-0.1.0.tgz", + "integrity": "sha1-WZivJKr8gC0VyCxoVlfuuLENSpE=" + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -4865,6 +5853,39 @@ "pump": "^3.0.0" } }, + "get-uri": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-0.1.4.tgz", + "integrity": "sha1-NfinlUwSn7Ey/y3fXtgaV8uKnlQ=", + "requires": { + "data-uri-to-buffer": "0", + "debug": "2", + "extend": "3", + "file-uri-to-path": "0", + "ftp": "~0.3.5", + "readable-stream": "2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "file-uri-to-path": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-0.0.2.tgz", + "integrity": "sha1-N83RtbkFQEs/BeGyNkW+aU/3D4I=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -4884,7 +5905,6 @@ "version": "7.1.5", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4943,11 +5963,25 @@ } } }, + "got": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/got/-/got-0.2.0.tgz", + "integrity": "sha1-0Awkiyn9zK6pQN+coJlev/MbUaU=", + "requires": { + "object-assign": "^0.3.0" + }, + "dependencies": { + "object-assign": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-0.3.1.tgz", + "integrity": "sha1-Bg4qKifXwNd+x3t48Rqkf9iACNI=" + } + } + }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "handle-thing": { "version": "2.0.0", @@ -5304,7 +6338,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -5421,7 +6454,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -5430,8 +6462,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", @@ -5541,8 +6572,7 @@ "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ip-regex": { "version": "2.1.0", @@ -5606,8 +6636,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { "version": "1.1.5", @@ -5713,6 +6742,11 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=" + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -5830,8 +6864,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isbinaryfile": { "version": "3.0.3", @@ -6068,6 +7101,11 @@ } } }, + "js-base64": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=" + }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -6168,6 +7206,31 @@ "verror": "1.10.0" } }, + "jstransform": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-3.0.0.tgz", + "integrity": "sha1-olkats7o2XvzvoMNv6IxO4fNZAs=", + "requires": { + "base62": "0.1.1", + "esprima-fb": "~3001.1.0-dev-harmony-fb", + "source-map": "0.1.31" + }, + "dependencies": { + "esprima-fb": { + "version": "3001.1.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", + "integrity": "sha1-t303q8046gt3Qmu4vCkizmtCZBE=" + }, + "source-map": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz", + "integrity": "sha1-n3BNDWnZ4TioG63267T94z0VHGE=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, "jszip": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", @@ -6293,6 +7356,11 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -6339,6 +7407,15 @@ "pify": "^4.0.1" } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "license-webpack-plugin": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.3.tgz", @@ -6437,6 +7514,11 @@ "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", "dev": true }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6558,6 +7640,14 @@ } } }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, "mamacro": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", @@ -6579,6 +7669,11 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=" + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -6851,7 +7946,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6968,7 +8062,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" }, @@ -6976,8 +8069,7 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } }, @@ -7009,8 +8101,7 @@ "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 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { "version": "6.2.3", @@ -7060,6 +8151,11 @@ "to-regex": "^3.0.1" } }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -7072,6 +8168,16 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" + }, + "netrc": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/netrc/-/netrc-0.1.4.tgz", + "integrity": "sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ=" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -7143,6 +8249,32 @@ "semver": "^6.3.0" } }, + "nopt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz", + "integrity": "sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc=", + "requires": { + "abbrev": "1" + } + }, + "noptify": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz", + "integrity": "sha1-WPZUpz2XU98MUdlobckhBKZ/S7s=", + "requires": { + "nopt": "~2.0.0" + }, + "dependencies": { + "nopt": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz", + "integrity": "sha1-ynQW8gpeP5w7hhgPlilfo9C1Lg0=", + "requires": { + "abbrev": "1" + } + } + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -7455,7 +8587,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -7513,6 +8644,19 @@ } } }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, "ora": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.2.tgz", @@ -7653,6 +8797,64 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "pac-proxy-agent": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-0.2.0.tgz", + "integrity": "sha1-rZApCdkvT+fMLl9Z9b9QYbz6cbI=", + "requires": { + "agent-base": "~1.0.1", + "debug": "2", + "extend": "~1.2.1", + "get-uri": "~0.1.0", + "pac-resolver": "~1.2.1", + "proxy-agent": "1", + "stream-to-array": "~1.0.0" + }, + "dependencies": { + "agent-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-1.0.2.tgz", + "integrity": "sha1-aJDT+yFwBLYrcPiSjg+uX4lSpwY=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "extend": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", + "integrity": "sha1-oPX9bPyDpf5J72mNYOyKYk3UV2w=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "pac-resolver": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-1.2.6.tgz", + "integrity": "sha1-7QOvDFtZM1Bb3T8H91F1Rm1efPs=", + "requires": { + "co": "~3.0.6", + "degenerator": "~1.0.0", + "netmask": "~1.0.4", + "regenerator": "~0.8.13", + "thunkify": "~2.1.1" + }, + "dependencies": { + "co": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/co/-/co-3.0.6.tgz", + "integrity": "sha1-FEXyJsXrlWE45oyawwFn6n0ua9o=" + } + } + }, "pacote": { "version": "9.5.8", "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.8.tgz", @@ -7853,8 +9055,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -7897,6 +9098,14 @@ } } }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "requires": { + "through": "~2.3" + } + }, "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", @@ -8558,6 +9767,11 @@ "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", "dev": true }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", @@ -8567,8 +9781,7 @@ "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "process": { "version": "0.11.10", @@ -8579,8 +9792,7 @@ "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 + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise": { "version": "7.3.1", @@ -8805,6 +10017,94 @@ "ipaddr.js": "1.9.1" } }, + "proxy-agent": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-1.1.1.tgz", + "integrity": "sha1-/LHu9eWJZcmV+TjwKdcp/IGFi5U=", + "requires": { + "http-proxy-agent": "0", + "https-proxy-agent": "0", + "lru-cache": "~2.5.0", + "pac-proxy-agent": "0", + "socks-proxy-agent": "1" + }, + "dependencies": { + "agent-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-1.0.2.tgz", + "integrity": "sha1-aJDT+yFwBLYrcPiSjg+uX4lSpwY=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "http-proxy-agent": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-0.2.7.tgz", + "integrity": "sha1-4X/aZfCQLZUs55IeYsf/iGJlWl4=", + "requires": { + "agent-base": "~1.0.1", + "debug": "2", + "extend": "3" + } + }, + "https-proxy-agent": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-0.3.6.tgz", + "integrity": "sha1-cT+jjl01P1DrFKNC/r4pAz7RYZs=", + "requires": { + "agent-base": "~1.0.1", + "debug": "2", + "extend": "3" + } + }, + "lru-cache": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.2.tgz", + "integrity": "sha1-H92tk4quEmPOE4aAvhs/WRwKtBw=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "smart-buffer": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" + }, + "socks": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", + "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", + "requires": { + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" + } + }, + "socks-proxy-agent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-1.0.2.tgz", + "integrity": "sha1-Z+BrRH/lY3QX/eVzPL/f7J/+EX8=", + "requires": { + "agent-base": "~1.0.1", + "extend": "~1.2.1", + "socks": "~1.1.5" + }, + "dependencies": { + "extend": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", + "integrity": "sha1-oPX9bPyDpf5J72mNYOyKYk3UV2w=" + } + } + } + } + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -8879,8 +10179,7 @@ "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, "qjobs": { "version": "1.2.0", @@ -9034,7 +10333,6 @@ "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, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9066,6 +10364,39 @@ "picomatch": "^2.0.7" } }, + "recast": { + "version": "0.10.33", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", + "integrity": "sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc=", + "requires": { + "ast-types": "0.8.12", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "ast-types": { + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", + "integrity": "sha1-oNkOQ1G7iHcWyD/WN+v4GK9K38w=" + }, + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", + "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "reduce-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz", + "integrity": "sha1-4Mk1QsV0UhvqE98PlIjtgqt3xdo=" + }, "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -9087,6 +10418,32 @@ "regenerate": "^1.4.0" } }, + "regenerator": { + "version": "0.8.46", + "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.46.tgz", + "integrity": "sha1-FUwydoY2HtUsrWmyVF78U6PQdpY=", + "requires": { + "commoner": "~0.10.3", + "defs": "~1.1.0", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "private": "~0.1.5", + "recast": "0.10.33", + "regenerator-runtime": "~0.9.5", + "through": "~2.3.8" + }, + "dependencies": { + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", + "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=" + }, + "regenerator-runtime": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz", + "integrity": "sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck=" + } + } + }, "regenerator-runtime": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", @@ -9175,8 +10532,7 @@ "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "request": { "version": "2.88.2", @@ -9218,6 +10574,11 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "requires": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/requires/-/requires-1.0.2.tgz", + "integrity": "sha1-djBOghNFYi/j+sCwcRoeTygo8Po=" + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -9294,6 +10655,14 @@ "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, "rimraf": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", @@ -9353,8 +10722,7 @@ "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 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -9368,8 +10736,33 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/sane/-/sane-0.8.1.tgz", + "integrity": "sha1-JDpLIECBvlWTwKIrC7sRVzUS/Mc=", + "requires": { + "minimatch": "~0.2.14", + "walker": "~1.0.5", + "watch": "~0.10.0" + }, + "dependencies": { + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } }, "sass": { "version": "1.23.3", @@ -9719,12 +11112,27 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "simple-fmt": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", + "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=" + }, + "simple-is": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", + "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=" + }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -10234,6 +11642,14 @@ "chalk": "^2.0.1" } }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "requires": { + "through": "2" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -10279,8 +11695,7 @@ "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "static-extend": { "version": "0.1.2", @@ -10306,8 +11721,7 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "stream-browserify": { "version": "2.0.2", @@ -10319,6 +11733,14 @@ "readable-stream": "^2.0.2" } }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "requires": { + "duplexer": "~0.1.1" + } + }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", @@ -10348,6 +11770,11 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "stream-to-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-1.0.0.tgz", + "integrity": "sha1-lBZrsp8+ok8ILS+M0+uyzA1uyiw=" + }, "streamroller": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", @@ -10440,11 +11867,20 @@ "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, "requires": { "safe-buffer": "~5.1.0" } }, + "stringmap": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", + "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=" + }, + "stringset": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", + "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=" + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -10556,6 +11992,49 @@ "when": "~3.6.x" } }, + "superagent": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-0.17.0.tgz", + "integrity": "sha1-qtzVD75ak+cZkRGNeb8HFNYlu6g=", + "requires": { + "cookiejar": "1.3.0", + "debug": "~0.7.2", + "emitter-component": "1.0.0", + "extend": "~1.2.1", + "formidable": "1.0.14", + "methods": "0.0.1", + "mime": "1.2.5", + "qs": "0.6.5", + "reduce-component": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" + }, + "extend": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", + "integrity": "sha1-oPX9bPyDpf5J72mNYOyKYk3UV2w=" + }, + "methods": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/methods/-/methods-0.0.1.tgz", + "integrity": "sha1-J3yQ+L7zlwlkWoNxxRw7bGSOBow=" + }, + "mime": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.5.tgz", + "integrity": "sha1-nu0HMCKov14WyFZsaGe4gyv7+hM=" + }, + "qs": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz", + "integrity": "sha1-KUsmjksNQlD23eGbO4s0k13/FO8=" + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -10592,6 +12071,14 @@ "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "requires": { + "acorn-node": "^1.2.0" + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -10640,6 +12127,21 @@ } } }, + "tempfile": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-0.1.3.tgz", + "integrity": "sha1-fWtxAEcznTn4RzJ6BW2t8YMQMBA=", + "requires": { + "uuid": "~1.4.0" + }, + "dependencies": { + "uuid": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-1.4.2.tgz", + "integrity": "sha1-RTAZ9oaWam34PNxSROfJkOzDMvw=" + } + } + }, "terser": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/terser/-/terser-4.5.1.tgz", @@ -10785,8 +12287,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.5", @@ -10798,6 +12299,11 @@ "xtend": "~4.0.1" } }, + "thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=" + }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -10819,6 +12325,34 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, + "tiny-lr-fork": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/tiny-lr-fork/-/tiny-lr-fork-0.0.5.tgz", + "integrity": "sha1-Hpnh4qhGm3NquX2X7vqYxx927Qo=", + "requires": { + "debug": "~0.7.0", + "faye-websocket": "~0.4.3", + "noptify": "~0.0.3", + "qs": "~0.5.2" + }, + "dependencies": { + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" + }, + "faye-websocket": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz", + "integrity": "sha1-wUxbO/FNdBf/v9mQwKdJXNnzN7w=" + }, + "qs": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", + "integrity": "sha1-MbGtBYVnZRxSaSFQa5qHk5EaA4Q=" + } + } + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -10828,6 +12362,11 @@ "os-tmpdir": "~1.0.2" } }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", @@ -10840,6 +12379,11 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-descriptor/-/to-descriptor-1.0.1.tgz", + "integrity": "sha1-oOZ4w068fS2uRk2DcrwhR52cK80=" + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -10909,6 +12453,11 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "tryor": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", + "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=" + }, "ts-node": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", @@ -10992,6 +12541,14 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, "type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", @@ -11026,6 +12583,57 @@ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "dev": true }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=" + }, + "unglob": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unglob/-/unglob-0.1.2.tgz", + "integrity": "sha1-8uwGKE5JGhx3YRp2CouOowAnLDg=", + "requires": { + "generator-supported": "~0.0.1", + "glob": "~3.2.8", + "minimatch": "~0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2", + "minimatch": "0.3" + }, + "dependencies": { + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -11279,8 +12887,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util-promisify": { "version": "2.1.0", @@ -11369,6 +12976,19 @@ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "requires": { + "makeerror": "1.0.x" + } + }, + "watch": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", + "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" + }, "watchpack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", @@ -13097,6 +14717,21 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "win-fork": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-fork/-/win-fork-1.1.1.tgz", + "integrity": "sha1-j1jgZW/KAK3IyGoriePNLWotXl4=" + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -13156,8 +14791,16 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-to": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/write-to/-/write-to-1.1.1.tgz", + "integrity": "sha1-Xu+/aC0SjCqwwF9l3xA4c54GxqM=", + "requires": { + "dethroy": "1", + "mkdirp": "0" + } }, "ws": { "version": "6.2.1", @@ -13190,11 +14833,15 @@ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", "dev": true }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "4.0.0", diff --git a/package.json b/package.json index b056971dd..6741c9099 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@angular/platform-browser": "~9.0.5", "@angular/platform-browser-dynamic": "~9.0.5", "@angular/router": "~9.0.5", + "component": "^1.1.0", "rxjs": "~6.5.4", "tslib": "^1.10.0", "zone.js": "~0.10.2" diff --git a/src/app/app.module.ts b/src/app/app.module.ts index ed878b408..1aaf6daf3 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,14 +1,17 @@ import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; +import { MatTableModule } from '@angular/material/table'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatSortModule } from '@angular/material/sort'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; + import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { StatusListComponent } from './status-list/status-list.component'; -import { MatTableModule } from '@angular/material/table'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatSortModule } from '@angular/material/sort'; -import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { FolderListComponent } from './folder-list/folder-list.component'; +import { DeviceListComponent } from './device-list/device-list.component'; import { StatusToggleComponent } from './status-toggle/status-toggle.component'; @@ -16,6 +19,8 @@ import { StatusToggleComponent } from './status-toggle/status-toggle.component'; declarations: [ AppComponent, StatusListComponent, + FolderListComponent, + DeviceListComponent, StatusToggleComponent, ], imports: [ diff --git a/src/app/device-list/device-list-datasource.ts b/src/app/device-list/device-list-datasource.ts new file mode 100644 index 000000000..372ba06bb --- /dev/null +++ b/src/app/device-list/device-list-datasource.ts @@ -0,0 +1,79 @@ +import { DataSource } from '@angular/cdk/collections'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; + +import { map } from 'rxjs/operators'; +import { Observable, of as observableOf, merge } from 'rxjs'; +import { Device } from '../device'; + +/** + * Data source for the DeviceList view. This class should + * encapsulate all logic for fetching and manipulating the displayed data + * (including sorting, pagination, and filtering). + */ +export class DeviceListDataSource extends DataSource { + data: Device[]; + paginator: MatPaginator; + sort: MatSort; + + constructor() { + super(); + } + + /** + * Connect this data source to the table. The table will only update when + * the returned stream emits new items. + * @returns A stream of the items to be rendered. + */ + connect(): Observable { + // Combine everything that affects the rendered data into one update + // st + const dataMutations = [ + observableOf(this.data), + this.paginator.page, + this.sort.sortChange + ]; + + return merge(...dataMutations).pipe(map(() => { + return this.getPagedData(this.getSortedData([...this.data])); + })); + } + + /** + * Called when the table is being destroyed. Use this function, to clean up + * any open connections or free any held resources that were set up during connect. + */ + disconnect() { } + + /** + * Paginate the data (client-side). If you're using server-side pagination, + * this would be replaced by requesting the appropriate data from the server. + */ + private getPagedData(data: Device[]) { + const startIndex = this.paginator.pageIndex * this.paginator.pageSize; + return data.splice(startIndex, this.paginator.pageSize); + } + + /** + * Sort the data (client-side). If you're using server-side sorting, + * this would be replaced by requesting the appropriate data from the server. + */ + private getSortedData(data: Device[]) { + if (!this.sort.active || this.sort.direction === '') { + return data; + } + + return data.sort((a, b) => { + const isAsc = this.sort.direction === 'asc'; + switch (this.sort.active) { + case 'name': return compare(a.name, b.name, isAsc); + case 'id': return compare(+a.id, +b.id, isAsc); + default: return 0; + } + }); + } +} + +function compare(a: string | number, b: string | number, isAsc: boolean) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); +} diff --git a/src/app/device-list/device-list.component.html b/src/app/device-list/device-list.component.html new file mode 100644 index 000000000..1cdaa5a28 --- /dev/null +++ b/src/app/device-list/device-list.component.html @@ -0,0 +1,22 @@ +
+
+ + + + + + + + + + + + + + +
Id{{row.id}}Name{{row.name}}
+ + + +
\ No newline at end of file diff --git a/src/app/device-list/device-list.component.scss b/src/app/device-list/device-list.component.scss new file mode 100644 index 000000000..5050fb6e0 --- /dev/null +++ b/src/app/device-list/device-list.component.scss @@ -0,0 +1,3 @@ +.full-width-table { + width: 100%; +} diff --git a/src/app/device-list/device-list.component.spec.ts b/src/app/device-list/device-list.component.spec.ts new file mode 100644 index 000000000..6a23078a8 --- /dev/null +++ b/src/app/device-list/device-list.component.spec.ts @@ -0,0 +1,34 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableModule } from '@angular/material/table'; + +import { DeviceListComponent } from './device-list.component'; + +describe('DeviceListComponent', () => { + let component: DeviceListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DeviceListComponent], + imports: [ + NoopAnimationsModule, + MatPaginatorModule, + MatSortModule, + MatTableModule, + ] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DeviceListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should compile', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/device-list/device-list.component.ts b/src/app/device-list/device-list.component.ts new file mode 100644 index 000000000..9c69d15b1 --- /dev/null +++ b/src/app/device-list/device-list.component.ts @@ -0,0 +1,41 @@ +import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { MatTable } from '@angular/material/table'; + +import { DeviceListDataSource } from './device-list-datasource'; +import { Device } from '../device'; +import { SystemConfigService } from '../system-config.service'; + + +@Component({ + selector: 'app-device-list', + templateUrl: './device-list.component.html', + styleUrls: ['./device-list.component.scss'] +}) +export class DeviceListComponent implements AfterViewInit, OnInit { + @ViewChild(MatPaginator) paginator: MatPaginator; + @ViewChild(MatSort) sort: MatSort; + @ViewChild(MatTable) table: MatTable; + dataSource: DeviceListDataSource; + + /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ + displayedColumns = ['id', 'name']; + + constructor(private systemConfigService: SystemConfigService) { }; + + ngOnInit() { + this.dataSource = new DeviceListDataSource(); + this.systemConfigService.getDevices().subscribe( + data => { + this.dataSource.data = data; + } + ); + } + + ngAfterViewInit() { + this.dataSource.sort = this.sort; + this.dataSource.paginator = this.paginator; + this.table.dataSource = this.dataSource; + } +} diff --git a/src/app/status-list/status-list-folder-datasource.ts b/src/app/folder-list/folder-list-datasource.ts similarity index 92% rename from src/app/status-list/status-list-folder-datasource.ts rename to src/app/folder-list/folder-list-datasource.ts index e723b2daa..c6c9b6cb6 100644 --- a/src/app/status-list/status-list-folder-datasource.ts +++ b/src/app/folder-list/folder-list-datasource.ts @@ -7,12 +7,12 @@ import { Observable, of as observableOf, merge } from 'rxjs'; import { Folder } from '../folder'; /** - * Data source for the StatusList view. This class should + * Data source for the FolderList view. This class should * encapsulate all logic for fetching and manipulating the displayed data * (including sorting, pagination, and filtering). */ -export class StatusListFolderDataSource extends DataSource { - data: any[]; +export class FolderListDataSource extends DataSource { + data: Folder[]; paginator: MatPaginator; sort: MatSort; @@ -27,7 +27,7 @@ export class StatusListFolderDataSource extends DataSource { */ connect(): Observable { // Combine everything that affects the rendered data into one update - // stream for the data-table to consume. + // st const dataMutations = [ observableOf(this.data), this.paginator.page, diff --git a/src/app/folder-list/folder-list.component.html b/src/app/folder-list/folder-list.component.html new file mode 100644 index 000000000..167df11f1 --- /dev/null +++ b/src/app/folder-list/folder-list.component.html @@ -0,0 +1,22 @@ +
+ + + + + + + + + + + + + + + +
Id{{row.id}}Label{{row.label}}
+ + + +
\ No newline at end of file diff --git a/src/app/folder-list/folder-list.component.scss b/src/app/folder-list/folder-list.component.scss new file mode 100644 index 000000000..5050fb6e0 --- /dev/null +++ b/src/app/folder-list/folder-list.component.scss @@ -0,0 +1,3 @@ +.full-width-table { + width: 100%; +} diff --git a/src/app/folder-list/folder-list.component.spec.ts b/src/app/folder-list/folder-list.component.spec.ts new file mode 100644 index 000000000..af35e6f7e --- /dev/null +++ b/src/app/folder-list/folder-list.component.spec.ts @@ -0,0 +1,34 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { MatPaginatorModule } from '@angular/material/paginator'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableModule } from '@angular/material/table'; + +import { FolderListComponent } from './folder-list.component'; + +describe('FolderListComponent', () => { + let component: FolderListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FolderListComponent], + imports: [ + NoopAnimationsModule, + MatPaginatorModule, + MatSortModule, + MatTableModule, + ] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FolderListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should compile', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/folder-list/folder-list.component.ts b/src/app/folder-list/folder-list.component.ts new file mode 100644 index 000000000..3d804f62c --- /dev/null +++ b/src/app/folder-list/folder-list.component.ts @@ -0,0 +1,41 @@ +import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { MatTable } from '@angular/material/table'; + +import { FolderListDataSource } from './folder-list-datasource'; +import { Folder } from '../folder'; +import { SystemConfigService } from '../system-config.service'; + + +@Component({ + selector: 'app-folder-list', + templateUrl: './folder-list.component.html', + styleUrls: ['./folder-list.component.scss'] +}) +export class FolderListComponent implements AfterViewInit, OnInit { + @ViewChild(MatPaginator) paginator: MatPaginator; + @ViewChild(MatSort) sort: MatSort; + @ViewChild(MatTable) table: MatTable; + dataSource: FolderListDataSource; + + /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ + displayedColumns = ['id', 'label']; + + constructor(private systemConfigService: SystemConfigService) { }; + + ngOnInit() { + this.dataSource = new FolderListDataSource(); + this.systemConfigService.getFolders().subscribe( + data => { + this.dataSource.data = data; + } + ); + } + + ngAfterViewInit() { + this.dataSource.sort = this.sort; + this.dataSource.paginator = this.paginator; + this.table.dataSource = this.dataSource; + } +} diff --git a/src/app/status-list/status-list.component.html b/src/app/status-list/status-list.component.html index 348c4e65c..81824da5e 100644 --- a/src/app/status-list/status-list.component.html +++ b/src/app/status-list/status-list.component.html @@ -1,23 +1,3 @@ -
- - - - - - - - - - - - - - - -
Id{{row.id}}Label{{row.label}}
- - - -
\ No newline at end of file + + \ No newline at end of file diff --git a/src/app/status-list/status-list.component.scss b/src/app/status-list/status-list.component.scss index 5050fb6e0..e69de29bb 100644 --- a/src/app/status-list/status-list.component.scss +++ b/src/app/status-list/status-list.component.scss @@ -1,3 +0,0 @@ -.full-width-table { - width: 100%; -} diff --git a/src/app/status-list/status-list.component.spec.ts b/src/app/status-list/status-list.component.spec.ts index daa23d2ba..c4daf34c4 100644 --- a/src/app/status-list/status-list.component.spec.ts +++ b/src/app/status-list/status-list.component.spec.ts @@ -1,8 +1,4 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; import { StatusListComponent } from './status-list.component'; @@ -12,14 +8,9 @@ describe('StatusListComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ StatusListComponent ], - imports: [ - NoopAnimationsModule, - MatPaginatorModule, - MatSortModule, - MatTableModule, - ] - }).compileComponents(); + declarations: [StatusListComponent] + }) + .compileComponents(); })); beforeEach(() => { @@ -28,7 +19,7 @@ describe('StatusListComponent', () => { fixture.detectChanges(); }); - it('should compile', () => { + it('should create', () => { expect(component).toBeTruthy(); }); }); diff --git a/src/app/status-list/status-list.component.ts b/src/app/status-list/status-list.component.ts index 395f700b7..b07491865 100644 --- a/src/app/status-list/status-list.component.ts +++ b/src/app/status-list/status-list.component.ts @@ -1,41 +1,15 @@ -import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { MatTable } from '@angular/material/table'; - -import { StatusListFolderDataSource } from './status-list-folder-datasource'; -import { Folder } from '../folder'; -import { SystemConfigService } from '../system-config.service'; - +import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-status-list', templateUrl: './status-list.component.html', styleUrls: ['./status-list.component.scss'] }) -export class StatusListComponent implements AfterViewInit, OnInit { - @ViewChild(MatPaginator) paginator: MatPaginator; - @ViewChild(MatSort) sort: MatSort; - @ViewChild(MatTable) table: MatTable; - dataSource: StatusListFolderDataSource; +export class StatusListComponent implements OnInit { - /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - displayedColumns = ['id', 'name']; + constructor() { } - constructor(private systemConfigService: SystemConfigService) { }; - - ngOnInit() { - this.dataSource = new StatusListFolderDataSource(); - this.systemConfigService.getDevices().subscribe( - data => { - this.dataSource.data = data; - } - ); + ngOnInit(): void { } - ngAfterViewInit() { - this.dataSource.sort = this.sort; - this.dataSource.paginator = this.paginator; - this.table.dataSource = this.dataSource; - } } diff --git a/src/app/status-toggle/status-toggle.component.html b/src/app/status-toggle/status-toggle.component.html index 97a944d48..289bccadb 100644 --- a/src/app/status-toggle/status-toggle.component.html +++ b/src/app/status-toggle/status-toggle.component.html @@ -1,4 +1,4 @@ - Folders - Devices + Folders + Devices \ No newline at end of file diff --git a/src/app/status-toggle/status-toggle.component.ts b/src/app/status-toggle/status-toggle.component.ts index 538e93e31..781359c55 100644 --- a/src/app/status-toggle/status-toggle.component.ts +++ b/src/app/status-toggle/status-toggle.component.ts @@ -1,15 +1,33 @@ import { Component, OnInit } from '@angular/core'; +export enum ToggleAction { + Folders = 1, + Devices, +} + @Component({ selector: 'app-status-toggle', templateUrl: './status-toggle.component.html', styleUrls: ['./status-toggle.component.scss'] }) -export class StatusToggleComponent implements OnInit { +export class StatusToggleComponent implements OnInit { + public toggleAction = ToggleAction constructor() { } ngOnInit(): void { } + onSelect(label: ToggleAction): void { + + console.log("here?"); + switch (label) { + case ToggleAction.Folders: + console.log("folder action"); + break; + case ToggleAction.Devices: + console.log("Device action"); + break; + } + } } \ No newline at end of file From cf3de8cf35dace6c849f1a073e0f27be80784084 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 11 Mar 2020 21:22:43 -0400 Subject: [PATCH 005/120] toggle status lists --- .../status-list/status-list.component.html | 6 ++--- src/app/status-list/status-list.component.ts | 8 +++++++ .../status-toggle.component.html | 6 ++--- .../status-toggle/status-toggle.component.ts | 24 +++++++++---------- src/app/status.ts | 4 ++++ 5 files changed, 29 insertions(+), 19 deletions(-) create mode 100644 src/app/status.ts diff --git a/src/app/status-list/status-list.component.html b/src/app/status-list/status-list.component.html index 81824da5e..698342b0b 100644 --- a/src/app/status-list/status-list.component.html +++ b/src/app/status-list/status-list.component.html @@ -1,3 +1,3 @@ - - - \ No newline at end of file + + + \ No newline at end of file diff --git a/src/app/status-list/status-list.component.ts b/src/app/status-list/status-list.component.ts index b07491865..6fc011497 100644 --- a/src/app/status-list/status-list.component.ts +++ b/src/app/status-list/status-list.component.ts @@ -1,4 +1,6 @@ import { Component, OnInit } from '@angular/core'; +import { Status } from '../status'; + @Component({ selector: 'app-status-list', @@ -6,10 +8,16 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./status-list.component.scss'] }) export class StatusListComponent implements OnInit { + public currentStatus: Status = Status.Folders; + public status = Status; constructor() { } ngOnInit(): void { } + onToggle(s: Status) { + console.log("holy moly", s); + this.currentStatus = s; + } } diff --git a/src/app/status-toggle/status-toggle.component.html b/src/app/status-toggle/status-toggle.component.html index 289bccadb..58b10e4fc 100644 --- a/src/app/status-toggle/status-toggle.component.html +++ b/src/app/status-toggle/status-toggle.component.html @@ -1,4 +1,4 @@ - - Folders - Devices + + Folders + Devices \ No newline at end of file diff --git a/src/app/status-toggle/status-toggle.component.ts b/src/app/status-toggle/status-toggle.component.ts index 781359c55..6557ad626 100644 --- a/src/app/status-toggle/status-toggle.component.ts +++ b/src/app/status-toggle/status-toggle.component.ts @@ -1,9 +1,7 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, EventEmitter, OnInit, Output } from '@angular/core'; +import { Status } from '../status'; + -export enum ToggleAction { - Folders = 1, - Devices, -} @Component({ selector: 'app-status-toggle', @@ -12,20 +10,20 @@ export enum ToggleAction { }) export class StatusToggleComponent implements OnInit { - public toggleAction = ToggleAction - constructor() { } + public status = Status + @Output() statusEvent = new EventEmitter(); + constructor() { } ngOnInit(): void { } - onSelect(label: ToggleAction): void { - - console.log("here?"); - switch (label) { - case ToggleAction.Folders: + onSelect(s: Status): void { + this.statusEvent.emit(s); + switch (s) { + case Status.Folders: console.log("folder action"); break; - case ToggleAction.Devices: + case Status.Devices: console.log("Device action"); break; } diff --git a/src/app/status.ts b/src/app/status.ts new file mode 100644 index 000000000..872798394 --- /dev/null +++ b/src/app/status.ts @@ -0,0 +1,4 @@ +export enum Status { + Folders = 1, + Devices, +} \ No newline at end of file From af3d380b6a69c9c715739d200a29a94189696ba0 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 13 Mar 2020 22:09:48 -0400 Subject: [PATCH 006/120] update SystemConfigService to load config and set folders and devices update getFolders and getDevices to send respective array as soon as it has data --- src/app/device-list/device-list-datasource.ts | 5 +- src/app/device-list/device-list.component.ts | 17 ++-- src/app/folder-list/folder-list-datasource.ts | 6 +- src/app/folder-list/folder-list.component.ts | 17 ++-- src/app/system-config.service.ts | 84 +++++++++++++++++-- 5 files changed, 106 insertions(+), 23 deletions(-) diff --git a/src/app/device-list/device-list-datasource.ts b/src/app/device-list/device-list-datasource.ts index 372ba06bb..95d3a6796 100644 --- a/src/app/device-list/device-list-datasource.ts +++ b/src/app/device-list/device-list-datasource.ts @@ -5,6 +5,7 @@ import { MatSort } from '@angular/material/sort'; import { map } from 'rxjs/operators'; import { Observable, of as observableOf, merge } from 'rxjs'; import { Device } from '../device'; +import { SystemConfigService } from '../system-config.service'; /** * Data source for the DeviceList view. This class should @@ -16,7 +17,7 @@ export class DeviceListDataSource extends DataSource { paginator: MatPaginator; sort: MatSort; - constructor() { + constructor(private systemConfigService: SystemConfigService) { super(); } @@ -29,7 +30,7 @@ export class DeviceListDataSource extends DataSource { // Combine everything that affects the rendered data into one update // st const dataMutations = [ - observableOf(this.data), + this.systemConfigService.getDevices(), this.paginator.page, this.sort.sortChange ]; diff --git a/src/app/device-list/device-list.component.ts b/src/app/device-list/device-list.component.ts index 9c69d15b1..73971924b 100644 --- a/src/app/device-list/device-list.component.ts +++ b/src/app/device-list/device-list.component.ts @@ -6,6 +6,7 @@ import { MatTable } from '@angular/material/table'; import { DeviceListDataSource } from './device-list-datasource'; import { Device } from '../device'; import { SystemConfigService } from '../system-config.service'; +import { flatMap } from 'rxjs/operators'; @Component({ @@ -25,17 +26,19 @@ export class DeviceListComponent implements AfterViewInit, OnInit { constructor(private systemConfigService: SystemConfigService) { }; ngOnInit() { - this.dataSource = new DeviceListDataSource(); - this.systemConfigService.getDevices().subscribe( - data => { - this.dataSource.data = data; - } - ); + this.dataSource = new DeviceListDataSource(this.systemConfigService); + this.dataSource.data = []; } ngAfterViewInit() { this.dataSource.sort = this.sort; this.dataSource.paginator = this.paginator; this.table.dataSource = this.dataSource; + + this.systemConfigService.getDevices().subscribe( + data => { + this.dataSource.data = data; + } + ); } -} +} \ No newline at end of file diff --git a/src/app/folder-list/folder-list-datasource.ts b/src/app/folder-list/folder-list-datasource.ts index c6c9b6cb6..741bb788e 100644 --- a/src/app/folder-list/folder-list-datasource.ts +++ b/src/app/folder-list/folder-list-datasource.ts @@ -5,6 +5,7 @@ import { MatSort } from '@angular/material/sort'; import { map } from 'rxjs/operators'; import { Observable, of as observableOf, merge } from 'rxjs'; import { Folder } from '../folder'; +import { SystemConfigService } from '../system-config.service'; /** * Data source for the FolderList view. This class should @@ -16,7 +17,7 @@ export class FolderListDataSource extends DataSource { paginator: MatPaginator; sort: MatSort; - constructor() { + constructor(private systemConfigService: SystemConfigService) { super(); } @@ -29,7 +30,8 @@ export class FolderListDataSource extends DataSource { // Combine everything that affects the rendered data into one update // st const dataMutations = [ - observableOf(this.data), + // observableOf(this.data), + this.systemConfigService.getFolders(), this.paginator.page, this.sort.sortChange ]; diff --git a/src/app/folder-list/folder-list.component.ts b/src/app/folder-list/folder-list.component.ts index 3d804f62c..ac18ee0c5 100644 --- a/src/app/folder-list/folder-list.component.ts +++ b/src/app/folder-list/folder-list.component.ts @@ -25,17 +25,22 @@ export class FolderListComponent implements AfterViewInit, OnInit { constructor(private systemConfigService: SystemConfigService) { }; ngOnInit() { - this.dataSource = new FolderListDataSource(); - this.systemConfigService.getFolders().subscribe( - data => { - this.dataSource.data = data; - } - ); + this.dataSource = new FolderListDataSource(this.systemConfigService); + this.dataSource.data = []; + } + + ngAfterContentInit() { } ngAfterViewInit() { this.dataSource.sort = this.sort; this.dataSource.paginator = this.paginator; this.table.dataSource = this.dataSource; + + this.systemConfigService.getFolders().subscribe( + data => { + this.dataSource.data = data; + } + ); } } diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index daf8e2bb3..199164b7c 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -1,6 +1,8 @@ import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { Observable, of } from 'rxjs'; +import { Observable, Subject, of } from 'rxjs'; +import { map } from 'rxjs/operators'; import { Folder } from './folder'; import { Device } from './device'; @@ -10,15 +12,85 @@ import { FOLDERS, DEVICES } from './mock-config-data'; providedIn: 'root' }) export class SystemConfigService { + private systemConfig: any; + private folders: Folder[]; + private devices: Device[]; + private foldersSubject: Subject = new Subject(); + private devicesSubject: Subject = new Subject(); - constructor() { } + private systemConfigUrl = 'http://127.0.0.1:8384/rest/system/config'; // URL to web api + httpOptions = { + // TODO find best way to get api key + // headers: new HttpHeaders({ 'X-API-Key': 'x' }) + }; + + constructor(private http: HttpClient) { } + + ngOnInit(): void { } + + + getSystemConfig(): Observable { + return this.http + .get(this.systemConfigUrl, this.httpOptions) + .pipe(map(res => { + this.systemConfig = res; + + this.folders = res['folders']; + this.devices = res['devices']; + this.foldersSubject.next(this.folders); + this.devicesSubject.next(this.devices); + + return res; + }) + ); + } getFolders(): Observable { - return of(FOLDERS); + const folderObservable: Observable = new Observable((observer) => { + if (this.folders) { + observer.next(this.folders); + } else { + // create timer to keep checking for folders + let checkFolders = (): Boolean => { + if (this.folders) { + observer.next(this.folders); + return true; + } + return false; + } + let t = setInterval(() => { + if (checkFolders()) + clearInterval(t); + }, 100); + } + }); + return folderObservable; } getDevices(): Observable { - return of(DEVICES); + const deviceObserverable: Observable = new Observable((observer) => { + if (this.folders) { + observer.next(this.devices); + } else { + // create timer to keep checking for devices + let checkFolders = (): Boolean => { + if (this.devices) { + observer.next(this.devices); + return true; + } + return false; + } + let t = setInterval(() => { + if (checkFolders()) + clearInterval(t); + }, 100); + } + }); + return deviceObserverable; + // return from(this.devices); + if (this.devices) { + this.devicesSubject.next(this.devices); + } + return this.devicesSubject; } - -} +} \ No newline at end of file From ebf0541385d833e2b68e51303ddfe69ab5ab8d02 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 13 Mar 2020 22:11:05 -0400 Subject: [PATCH 007/120] start of CSRF --- src/app/app.component.ts | 14 +++++++++++++- src/app/app.module.ts | 16 +++++++++++++++- src/index.html | 6 +++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index fed51e5c5..38bbc2bcd 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,4 +1,5 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; +import { SystemConfigService } from './system-config.service'; @Component({ selector: 'app-root', @@ -7,4 +8,15 @@ import { Component } from '@angular/core'; }) export class AppComponent { title = 'Tech UI'; + + constructor(private systemConfigService: SystemConfigService) { } + + ngOnInit(): void { + console.log("app component init"); + this.systemConfigService.getSystemConfig().subscribe( + x => console.log('Observer got a next value: ' + x), + err => console.error('Observer got an error: ' + err), + () => console.log('Observer got a complete notification') + ); + } } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 1aaf6daf3..91ad36bb9 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,5 +1,6 @@ import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; +import { HttpClientModule, HttpClientXsrfModule } from '@angular/common/http'; import { MatTableModule } from '@angular/material/table'; import { MatPaginatorModule } from '@angular/material/paginator'; @@ -13,7 +14,12 @@ import { StatusListComponent } from './status-list/status-list.component'; import { FolderListComponent } from './folder-list/folder-list.component'; import { DeviceListComponent } from './device-list/device-list.component'; import { StatusToggleComponent } from './status-toggle/status-toggle.component'; +import { DeviceListDataSource } from './device-list/device-list-datasource'; +const deviceID = (): String => { + const dID: String = globalThis.metadata['deviceID']; + return dID.substring(0, 5) +} @NgModule({ declarations: [ @@ -30,9 +36,17 @@ import { StatusToggleComponent } from './status-toggle/status-toggle.component'; MatTableModule, MatPaginatorModule, MatSortModule, - MatButtonToggleModule + MatButtonToggleModule, + HttpClientModule, + HttpClientXsrfModule.withOptions({ + headerName: 'X-CSRF-Token-' + deviceID(), + cookieName: 'CSRF-Token-' + deviceID(), + }) ], providers: [], bootstrap: [AppComponent] }) + export class AppModule { } + + diff --git a/src/index.html b/src/index.html index 96b91058b..df34f6890 100644 --- a/src/index.html +++ b/src/index.html @@ -1,5 +1,6 @@ + TechUi @@ -8,8 +9,11 @@ + + - + + \ No newline at end of file From 472757087076b835be27812056b1cd71629b521e Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sat, 14 Mar 2020 20:06:35 -0400 Subject: [PATCH 008/120] create api-utils to hold convenience convenience data structures --- src/app/api-utils.ts | 6 ++++++ src/app/app.module.ts | 5 +---- 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 src/app/api-utils.ts diff --git a/src/app/api-utils.ts b/src/app/api-utils.ts new file mode 100644 index 000000000..44432b967 --- /dev/null +++ b/src/app/api-utils.ts @@ -0,0 +1,6 @@ +export const deviceID = (): String => { + const dID: String = globalThis.metadata['deviceID']; + return dID.substring(0, 5) +} + +export const apiURL: String = 'http://127.0.0.1:8384/' \ No newline at end of file diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 91ad36bb9..392e5df9d 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -15,11 +15,8 @@ import { FolderListComponent } from './folder-list/folder-list.component'; import { DeviceListComponent } from './device-list/device-list.component'; import { StatusToggleComponent } from './status-toggle/status-toggle.component'; import { DeviceListDataSource } from './device-list/device-list-datasource'; +import { deviceID } from './api-utils'; -const deviceID = (): String => { - const dID: String = globalThis.metadata['deviceID']; - return dID.substring(0, 5) -} @NgModule({ declarations: [ From 6b89991ba8d29f5d44bab98dd7ec9e975bac6a4e Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sat, 14 Mar 2020 20:07:08 -0400 Subject: [PATCH 009/120] create cookie service to find CSRF header data --- src/app/cookie.service.spec.ts | 16 ++++++++++++ src/app/cookie.service.ts | 44 ++++++++++++++++++++++++++++++++ src/app/system-config.service.ts | 12 ++++----- 3 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 src/app/cookie.service.spec.ts create mode 100644 src/app/cookie.service.ts diff --git a/src/app/cookie.service.spec.ts b/src/app/cookie.service.spec.ts new file mode 100644 index 000000000..43ea274f5 --- /dev/null +++ b/src/app/cookie.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { CookieService } from './cookie.service'; + +describe('CookieService', () => { + let service: CookieService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(CookieService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/cookie.service.ts b/src/app/cookie.service.ts new file mode 100644 index 000000000..a3bb17f3a --- /dev/null +++ b/src/app/cookie.service.ts @@ -0,0 +1,44 @@ +import { Injectable } from '@angular/core'; +import { deviceID } from './api-utils'; + +@Injectable({ + providedIn: 'root' +}) +export class CookieService { + + constructor() { } + + getCSRFHeader(): any { + const dID: String = deviceID(); + const csrfCookie = 'CSRF-Token-' + dID + const csrfHeader = {}; + csrfHeader['X-CSRF-Token-' + dID] = this.getCookie(csrfCookie); + return csrfHeader; + } + + getCookie(name: string): string { + let ca: Array = document.cookie.split(';'); + let caLen: number = ca.length; + let cookieName = `${name}=`; + let c: string; + + for (let i: number = 0; i < caLen; i += 1) { + c = ca[i].replace(/^\s+/g, ''); + if (c.indexOf(cookieName) == 0) { + return c.substring(cookieName.length, c.length); + } + } + return ''; + } + + deleteCookie(name): void { + this.setCookie(name, "", -1); + } + + setCookie(name: string, value: string, expireDays: number, path: string = ""): void { + let d: Date = new Date(); + d.setTime(d.getTime() + expireDays * 24 * 60 * 60 * 1000); + let expires: string = "expires=" + d.toUTCString(); + document.cookie = name + "=" + value + "; " + expires + (path.length > 0 ? "; path=" + path : ""); + } +} diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index 199164b7c..c01dfe1db 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -7,6 +7,8 @@ import { map } from 'rxjs/operators'; import { Folder } from './folder'; import { Device } from './device'; import { FOLDERS, DEVICES } from './mock-config-data'; +import { CookieService } from './cookie.service'; +import { apiURL } from './api-utils' @Injectable({ providedIn: 'root' @@ -17,18 +19,14 @@ export class SystemConfigService { private devices: Device[]; private foldersSubject: Subject = new Subject(); private devicesSubject: Subject = new Subject(); + private systemConfigUrl = apiURL + '/rest/system/config'; // URL to web api - private systemConfigUrl = 'http://127.0.0.1:8384/rest/system/config'; // URL to web api - httpOptions = { - // TODO find best way to get api key - // headers: new HttpHeaders({ 'X-API-Key': 'x' }) - }; + httpOptions = { headers: new HttpHeaders(this.cookieService.getCSRFHeader()) }; - constructor(private http: HttpClient) { } + constructor(private http: HttpClient, private cookieService: CookieService) { } ngOnInit(): void { } - getSystemConfig(): Observable { return this.http .get(this.systemConfigUrl, this.httpOptions) From fd0de9eb6caf1446aa5d4061874b908e2942d60a Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sat, 14 Mar 2020 22:38:41 -0400 Subject: [PATCH 010/120] update readme to indicate build and syncthing tech-ui branch --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 19be5ffa0..55099411a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ This project was generated with [Angular CLI](https://github.com/angular/angular ## Development server -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. +Run `ng build --prod --base-href /tech-ui/` and build [syncthing tech-ui branch](https://github.com/kastelo/syncthing/tree/tech-ui). Run `export STTECHUIDIR=/path/to/angular/build/; ./bin/syncthing` and navigate to `http://localhost:8384/tech-ui/`. ## Code scaffolding From 838b2a6a3424aec989dcb37d38eeae7adb32d8d3 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sun, 15 Mar 2020 12:33:21 -0400 Subject: [PATCH 011/120] add mock in-memory data service --- README.md | 4 + package-lock.json | 5 + package.json | 1 + src/app/api-utils.ts | 4 +- src/app/app.module.ts | 8 +- src/app/in-memory-config-data.service.spec.ts | 16 +++ src/app/in-memory-config-data.service.ts | 114 ++++++++++++++++++ src/app/system-config.service.ts | 9 +- 8 files changed, 155 insertions(+), 6 deletions(-) create mode 100644 src/app/in-memory-config-data.service.spec.ts create mode 100644 src/app/in-memory-config-data.service.ts diff --git a/README.md b/README.md index 55099411a..184df7d0b 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,10 @@ This project was generated with [Angular CLI](https://github.com/angular/angular ## Development server +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Production server + Run `ng build --prod --base-href /tech-ui/` and build [syncthing tech-ui branch](https://github.com/kastelo/syncthing/tree/tech-ui). Run `export STTECHUIDIR=/path/to/angular/build/; ./bin/syncthing` and navigate to `http://localhost:8384/tech-ui/`. ## Code scaffolding diff --git a/package-lock.json b/package-lock.json index f0d9e9b0d..2d1cb0b4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1790,6 +1790,11 @@ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, + "angular-in-memory-web-api": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/angular-in-memory-web-api/-/angular-in-memory-web-api-0.10.0.tgz", + "integrity": "sha512-GzY4lHPR8suREYfgiYiJSBrgq0bdCiFw/LuqW5IsOQfRx98AvS69A5Ehz12oMLy9ABzoGpqmNC5fcFtClDAPqQ==" + }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", diff --git a/package.json b/package.json index 6741c9099..ebf89a84b 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@angular/platform-browser": "~9.0.5", "@angular/platform-browser-dynamic": "~9.0.5", "@angular/router": "~9.0.5", + "angular-in-memory-web-api": "^0.10.0", "component": "^1.1.0", "rxjs": "~6.5.4", "tslib": "^1.10.0", diff --git a/src/app/api-utils.ts b/src/app/api-utils.ts index 44432b967..19d6d0675 100644 --- a/src/app/api-utils.ts +++ b/src/app/api-utils.ts @@ -1,5 +1,7 @@ +import { environment } from '../environments/environment' + export const deviceID = (): String => { - const dID: String = globalThis.metadata['deviceID']; + const dID: String = environment.production ? globalThis.metadata['deviceID'] : '12345'; return dID.substring(0, 5) } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 392e5df9d..c185ec010 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -15,8 +15,10 @@ import { FolderListComponent } from './folder-list/folder-list.component'; import { DeviceListComponent } from './device-list/device-list.component'; import { StatusToggleComponent } from './status-toggle/status-toggle.component'; import { DeviceListDataSource } from './device-list/device-list-datasource'; +import { HttpClientInMemoryWebApiModule } from 'angular-in-memory-web-api'; +import { InMemoryConfigDataService } from './in-memory-config-data.service'; import { deviceID } from './api-utils'; - +import { environment } from '../environments/environment' @NgModule({ declarations: [ @@ -38,7 +40,9 @@ import { deviceID } from './api-utils'; HttpClientXsrfModule.withOptions({ headerName: 'X-CSRF-Token-' + deviceID(), cookieName: 'CSRF-Token-' + deviceID(), - }) + }), + environment.production ? + [] : HttpClientInMemoryWebApiModule.forRoot(InMemoryConfigDataService) ], providers: [], bootstrap: [AppComponent] diff --git a/src/app/in-memory-config-data.service.spec.ts b/src/app/in-memory-config-data.service.spec.ts new file mode 100644 index 000000000..4650f227e --- /dev/null +++ b/src/app/in-memory-config-data.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { InMemoryConfigDataService } from './in-memory-config-data.service'; + +describe('InMemoryDataService', () => { + let service: InMemoryConfigDataService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(InMemoryConfigDataService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/in-memory-config-data.service.ts b/src/app/in-memory-config-data.service.ts new file mode 100644 index 000000000..33ee0986a --- /dev/null +++ b/src/app/in-memory-config-data.service.ts @@ -0,0 +1,114 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class InMemoryConfigDataService { + createDb() { + const config = { + "version": 15, + "folders": [ + { + "id": "GXWxf-3zgnU", + "label": "MyFolder", + "path": "...", + "type": "sendreceive", + "devices": [ + { + "deviceID": "..." + } + ], + "rescanIntervalS": 60, + "ignorePerms": false, + "autoNormalize": true, + "minDiskFreePct": 1, + "versioning": { + "type": "simple", + "params": { + "keep": "5" + } + }, + "copiers": 0, + "pullers": 0, + "hashers": 0, + "order": "random", + "ignoreDelete": false, + "scanProgressIntervalS": 0, + "pullerSleepS": 0, + "pullerPauseS": 0, + "maxConflicts": 10, + "disableSparseFiles": false, + "disableTempIndexes": false, + "fsync": false, + "invalid": "" + } + ], + "devices": [ + { + "deviceID": "...", + "name": "Laptop", + "addresses": [ + "dynamic", + "tcp://192.168.1.2:22000" + ], + "compression": "metadata", + "certName": "", + "introducer": false + } + ], + "gui": { + "enabled": true, + "address": "127.0.0.1:8384", + "user": "Username", + "password": "$2a$10$ZFws69T4FlvWwsqeIwL.TOo5zOYqsa/.TxlUnsGYS.j3JvjFTmxo6", + "useTLS": false, + "apiKey": "pGahcht56664QU5eoFQW6szbEG6Ec2Cr", + "insecureAdminAccess": false, + "theme": "default" + }, + "options": { + "listenAddresses": [ + "default" + ], + "globalAnnounceServers": [ + "default" + ], + "globalAnnounceEnabled": true, + "localAnnounceEnabled": true, + "localAnnouncePort": 21027, + "localAnnounceMCAddr": "[ff12::8384]:21027", + "maxSendKbps": 0, + "maxRecvKbps": 0, + "reconnectionIntervalS": 60, + "relaysEnabled": true, + "relayReconnectIntervalM": 10, + "startBrowser": false, + "natEnabled": true, + "natLeaseMinutes": 60, + "natRenewalMinutes": 30, + "natTimeoutSeconds": 10, + "urAccepted": -1, + "urUniqueId": "", + "urURL": "https://data.syncthing.net/newdata", + "urPostInsecurely": false, + "urInitialDelayS": 1800, + "restartOnWakeup": true, + "autoUpgradeIntervalH": 12, + "keepTemporariesH": 24, + "cacheIgnoredFiles": false, + "progressUpdateIntervalS": 5, + "limitBandwidthInLan": false, + "minHomeDiskFreePct": 1, + "releasesURL": "https://upgrades.syncthing.net/meta.json", + "alwaysLocalNets": [], + "overwriteRemoteDeviceNamesOnConnect": false, + "tempIndexMinBlocks": 10 + }, + "ignoredDevices": [], + "ignoredFolders": [] + } + console.log("in mem?!?!?", config) + return { config }; + } + constructor() { } +} diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index c01dfe1db..26644b211 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -8,6 +8,7 @@ import { Folder } from './folder'; import { Device } from './device'; import { FOLDERS, DEVICES } from './mock-config-data'; import { CookieService } from './cookie.service'; +import { environment } from '../environments/environment' import { apiURL } from './api-utils' @Injectable({ @@ -19,13 +20,15 @@ export class SystemConfigService { private devices: Device[]; private foldersSubject: Subject = new Subject(); private devicesSubject: Subject = new Subject(); - private systemConfigUrl = apiURL + '/rest/system/config'; // URL to web api + private systemConfigUrl = environment.production ? apiURL + '/rest/system/config' : 'api/config'; - httpOptions = { headers: new HttpHeaders(this.cookieService.getCSRFHeader()) }; + private httpOptions; constructor(private http: HttpClient, private cookieService: CookieService) { } - ngOnInit(): void { } + ngOnInit(): void { + this.httpOptions = { headers: new HttpHeaders(this.cookieService.getCSRFHeader()) }; + } getSystemConfig(): Observable { return this.http From fb4c7d288c52cac2ddaf8ec6a32257c7c49d09b7 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sun, 15 Mar 2020 12:42:55 -0400 Subject: [PATCH 012/120] update system config url and http options --- src/app/system-config.service.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index 26644b211..effe64fe6 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -20,16 +20,16 @@ export class SystemConfigService { private devices: Device[]; private foldersSubject: Subject = new Subject(); private devicesSubject: Subject = new Subject(); - private systemConfigUrl = environment.production ? apiURL + '/rest/system/config' : 'api/config'; + private systemConfigUrl = environment.production ? apiURL + 'rest/system/config' : 'api/config'; private httpOptions; - constructor(private http: HttpClient, private cookieService: CookieService) { } - - ngOnInit(): void { + constructor(private http: HttpClient, private cookieService: CookieService) { this.httpOptions = { headers: new HttpHeaders(this.cookieService.getCSRFHeader()) }; } + ngOnInit(): void { } + getSystemConfig(): Observable { return this.http .get(this.systemConfigUrl, this.httpOptions) From ce2c6c01dadff317419fe3f6cbe66bd7a2ad43eb Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sun, 15 Mar 2020 17:00:56 -0400 Subject: [PATCH 013/120] update mock config data and service --- src/app/in-memory-config-data.service.ts | 92 ++++++++++++------------ src/app/system-config.service.ts | 31 +++++--- 2 files changed, 67 insertions(+), 56 deletions(-) diff --git a/src/app/in-memory-config-data.service.ts b/src/app/in-memory-config-data.service.ts index 33ee0986a..5174693c6 100644 --- a/src/app/in-memory-config-data.service.ts +++ b/src/app/in-memory-config-data.service.ts @@ -8,53 +8,55 @@ export class InMemoryConfigDataService { const config = { "version": 15, "folders": [ - { - "id": "GXWxf-3zgnU", - "label": "MyFolder", - "path": "...", - "type": "sendreceive", - "devices": [ - { - "deviceID": "..." - } - ], - "rescanIntervalS": 60, - "ignorePerms": false, - "autoNormalize": true, - "minDiskFreePct": 1, - "versioning": { - "type": "simple", - "params": { - "keep": "5" - } - }, - "copiers": 0, - "pullers": 0, - "hashers": 0, - "order": "random", - "ignoreDelete": false, - "scanProgressIntervalS": 0, - "pullerSleepS": 0, - "pullerPauseS": 0, - "maxConflicts": 10, - "disableSparseFiles": false, - "disableTempIndexes": false, - "fsync": false, - "invalid": "" - } + { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, ], "devices": [ - { - "deviceID": "...", - "name": "Laptop", - "addresses": [ - "dynamic", - "tcp://192.168.1.2:22000" - ], - "compression": "metadata", - "certName": "", - "introducer": false - } + { "deviceID": "...", "name": "Laptop", "addresses": ["dynamic", "tcp://192.168.1.2:22000"], "compression": "metadata", "certName": "", "introducer": false }, + { "deviceID": "...", "name": "Server", "addresses": ["dynamic", "tcp://192.168.1.3:22000"], "compression": "metadata", "certName": "", "introducer": false }, ], "gui": { "enabled": true, diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index effe64fe6..130acd01e 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -20,15 +20,20 @@ export class SystemConfigService { private devices: Device[]; private foldersSubject: Subject = new Subject(); private devicesSubject: Subject = new Subject(); - private systemConfigUrl = environment.production ? apiURL + 'rest/system/config' : 'api/config'; + private systemConfigUrl = environment.production ? apiURL + 'rest/system/config' : 'api/config'; private httpOptions; - constructor(private http: HttpClient, private cookieService: CookieService) { - this.httpOptions = { headers: new HttpHeaders(this.cookieService.getCSRFHeader()) }; - } + private checkInterval: Number = 200; - ngOnInit(): void { } + constructor(private http: HttpClient, private cookieService: CookieService) { + const csrfHeader = this.cookieService.getCSRFHeader(); + this.httpOptions = { + headers: new HttpHeaders({ + csrfHeader + }) + } + } getSystemConfig(): Observable { return this.http @@ -52,7 +57,7 @@ export class SystemConfigService { observer.next(this.folders); } else { // create timer to keep checking for folders - let checkFolders = (): Boolean => { + let check = (): Boolean => { if (this.folders) { observer.next(this.folders); return true; @@ -60,9 +65,11 @@ export class SystemConfigService { return false; } let t = setInterval(() => { - if (checkFolders()) + if (check()) clearInterval(t); - }, 100); + }, 200); + + check(); // try right away } }); return folderObservable; @@ -74,7 +81,7 @@ export class SystemConfigService { observer.next(this.devices); } else { // create timer to keep checking for devices - let checkFolders = (): Boolean => { + let check = (): Boolean => { if (this.devices) { observer.next(this.devices); return true; @@ -82,9 +89,11 @@ export class SystemConfigService { return false; } let t = setInterval(() => { - if (checkFolders()) + if (check()) clearInterval(t); - }, 100); + }, 200); + + check() // try right away } }); return deviceObserverable; From ad2902b3ee25dcde97eb6e8fbaf053ccb086ba36 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sun, 15 Mar 2020 17:01:19 -0400 Subject: [PATCH 014/120] start of dashboard component with flexbox --- package-lock.json | 5 +++ package.json | 1 + src/app/app.component.html | 3 +- src/app/app.component.ts | 16 +------- src/app/app.module.ts | 11 +++-- src/app/dashboard/dashboard.component.html | 21 ++++++++++ src/app/dashboard/dashboard.component.scss | 3 ++ src/app/dashboard/dashboard.component.spec.ts | 40 +++++++++++++++++++ src/app/dashboard/dashboard.component.ts | 19 +++++++++ src/app/system-config.service.ts | 18 ++------- 10 files changed, 104 insertions(+), 33 deletions(-) create mode 100644 src/app/dashboard/dashboard.component.html create mode 100644 src/app/dashboard/dashboard.component.scss create mode 100644 src/app/dashboard/dashboard.component.spec.ts create mode 100644 src/app/dashboard/dashboard.component.ts diff --git a/package-lock.json b/package-lock.json index 2d1cb0b4a..8711b8d0b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -373,6 +373,11 @@ "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.5.tgz", "integrity": "sha512-7VznrYjaAIzeq/zQ7v6tbeoOI7JJKgChKwG7s8jRoEpENu+w2pRlRdyQul88iJLsXgObR+/TfBNm/K+G4cqAFw==" }, + "@angular/flex-layout": { + "version": "9.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-9.0.0-beta.29.tgz", + "integrity": "sha512-93sxR+kYfYMOdnlWL0Q77FZ428gg8XnBu0YZm6GsCdkw/vLggIT/G1ZAqHlCPIODt6pxmCJ5KXh4ShvniIYDsA==" + }, "@angular/forms": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.0.5.tgz", diff --git a/package.json b/package.json index ebf89a84b..1f74c691e 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@angular/common": "~9.0.5", "@angular/compiler": "~9.0.5", "@angular/core": "~9.0.5", + "@angular/flex-layout": "^9.0.0-beta.29", "@angular/forms": "~9.0.5", "@angular/material": "^9.1.2", "@angular/platform-browser": "~9.0.5", diff --git a/src/app/app.component.html b/src/app/app.component.html index 9af6f4b83..2e52e9df0 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,2 +1 @@ -

{{title}}

- \ No newline at end of file + \ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 38bbc2bcd..d198fcdfa 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,5 +1,4 @@ -import { Component, OnInit } from '@angular/core'; -import { SystemConfigService } from './system-config.service'; +import { Component } from '@angular/core'; @Component({ selector: 'app-root', @@ -7,16 +6,5 @@ import { SystemConfigService } from './system-config.service'; styleUrls: ['./app.component.scss'] }) export class AppComponent { - title = 'Tech UI'; - - constructor(private systemConfigService: SystemConfigService) { } - - ngOnInit(): void { - console.log("app component init"); - this.systemConfigService.getSystemConfig().subscribe( - x => console.log('Observer got a next value: ' + x), - err => console.error('Observer got an error: ' + err), - () => console.log('Observer got a complete notification') - ); - } + constructor() { } } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index c185ec010..61c8165a7 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -14,11 +14,13 @@ import { StatusListComponent } from './status-list/status-list.component'; import { FolderListComponent } from './folder-list/folder-list.component'; import { DeviceListComponent } from './device-list/device-list.component'; import { StatusToggleComponent } from './status-toggle/status-toggle.component'; -import { DeviceListDataSource } from './device-list/device-list-datasource'; import { HttpClientInMemoryWebApiModule } from 'angular-in-memory-web-api'; import { InMemoryConfigDataService } from './in-memory-config-data.service'; import { deviceID } from './api-utils'; -import { environment } from '../environments/environment' +import { environment } from '../environments/environment'; +import { DashboardComponent } from './dashboard/dashboard.component'; +import { MatCardModule } from '@angular/material/card'; +import { FlexLayoutModule } from '@angular/flex-layout'; @NgModule({ declarations: [ @@ -27,6 +29,7 @@ import { environment } from '../environments/environment' FolderListComponent, DeviceListComponent, StatusToggleComponent, + DashboardComponent, ], imports: [ BrowserModule, @@ -42,7 +45,9 @@ import { environment } from '../environments/environment' cookieName: 'CSRF-Token-' + deviceID(), }), environment.production ? - [] : HttpClientInMemoryWebApiModule.forRoot(InMemoryConfigDataService) + [] : HttpClientInMemoryWebApiModule.forRoot(InMemoryConfigDataService), + MatCardModule, + FlexLayoutModule ], providers: [], bootstrap: [AppComponent] diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html new file mode 100644 index 000000000..d8a9ed489 --- /dev/null +++ b/src/app/dashboard/dashboard.component.html @@ -0,0 +1,21 @@ +
+
+

Tech UI

+
+
+ + Folders + + +
+
+ + Devices + + +
+ +
+
+
\ No newline at end of file diff --git a/src/app/dashboard/dashboard.component.scss b/src/app/dashboard/dashboard.component.scss new file mode 100644 index 000000000..0b6973a09 --- /dev/null +++ b/src/app/dashboard/dashboard.component.scss @@ -0,0 +1,3 @@ +.grid-container { + margin: 20px; +} \ No newline at end of file diff --git a/src/app/dashboard/dashboard.component.spec.ts b/src/app/dashboard/dashboard.component.spec.ts new file mode 100644 index 000000000..980c24fd0 --- /dev/null +++ b/src/app/dashboard/dashboard.component.spec.ts @@ -0,0 +1,40 @@ +import { LayoutModule } from '@angular/cdk/layout'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; + +import { DashboardComponent } from './dashboard.component'; + +describe('DashboardComponent', () => { + let component: DashboardComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DashboardComponent], + imports: [ + NoopAnimationsModule, + LayoutModule, + MatButtonModule, + MatCardModule, + MatGridListModule, + MatIconModule, + MatMenuModule, + ] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DashboardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should compile', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts new file mode 100644 index 000000000..270957fd0 --- /dev/null +++ b/src/app/dashboard/dashboard.component.ts @@ -0,0 +1,19 @@ +import { Component, OnInit } from '@angular/core'; +import { SystemConfigService } from '../system-config.service'; + +@Component({ + selector: 'app-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.scss'] +}) +export class DashboardComponent { + constructor(private systemConfigService: SystemConfigService) { } + + ngOnInit() { + this.systemConfigService.getSystemConfig().subscribe( + x => console.log('Observer got a next value: ' + x), + err => console.error('Observer got an error: ' + err), + () => console.log('Observer got a complete notification') + ); + } +} diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index 130acd01e..365d66078 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -24,15 +24,10 @@ export class SystemConfigService { private systemConfigUrl = environment.production ? apiURL + 'rest/system/config' : 'api/config'; private httpOptions; - private checkInterval: Number = 200; + private checkInterval: number = 200; constructor(private http: HttpClient, private cookieService: CookieService) { - const csrfHeader = this.cookieService.getCSRFHeader(); - this.httpOptions = { - headers: new HttpHeaders({ - csrfHeader - }) - } + this.httpOptions = { headers: new HttpHeaders(this.cookieService.getCSRFHeader()) }; } getSystemConfig(): Observable { @@ -67,7 +62,7 @@ export class SystemConfigService { let t = setInterval(() => { if (check()) clearInterval(t); - }, 200); + }, this.checkInterval); check(); // try right away } @@ -91,16 +86,11 @@ export class SystemConfigService { let t = setInterval(() => { if (check()) clearInterval(t); - }, 200); + }, this.checkInterval); check() // try right away } }); return deviceObserverable; - // return from(this.devices); - if (this.devices) { - this.devicesSubject.next(this.devices); - } - return this.devicesSubject; } } \ No newline at end of file From 82f5706350bb2c6ae8f2486f1bace3611be1f9ad Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sun, 15 Mar 2020 22:07:11 -0400 Subject: [PATCH 015/120] start of chart component --- package-lock.json | 35 ++++++++++++-- package.json | 1 + src/app/app.module.ts | 2 + src/app/dashboard/dashboard.component.html | 8 +++- src/app/dashboard/dashboard.component.ts | 3 ++ .../donut-chart/donut-chart.component.html | 1 + .../donut-chart/donut-chart.component.scss | 0 .../donut-chart/donut-chart.component.spec.ts | 25 ++++++++++ src/app/donut-chart/donut-chart.component.ts | 48 +++++++++++++++++++ src/app/system-config.service.ts | 35 +++++--------- 10 files changed, 131 insertions(+), 27 deletions(-) create mode 100644 src/app/donut-chart/donut-chart.component.html create mode 100644 src/app/donut-chart/donut-chart.component.scss create mode 100644 src/app/donut-chart/donut-chart.component.spec.ts create mode 100644 src/app/donut-chart/donut-chart.component.ts diff --git a/package-lock.json b/package-lock.json index 8711b8d0b..31a6d9536 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2776,6 +2776,32 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "chart.js": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.3.tgz", + "integrity": "sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", + "requires": { + "chartjs-color-string": "^0.6.0", + "color-convert": "^1.9.3" + } + }, + "chartjs-color-string": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", + "requires": { + "color-name": "^1.0.0" + } + }, "chokidar": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", @@ -3040,7 +3066,6 @@ "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, "requires": { "color-name": "1.1.3" } @@ -3048,8 +3073,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { "version": "1.5.3", @@ -8083,6 +8107,11 @@ } } }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", diff --git a/package.json b/package.json index 1f74c691e..fb4298a64 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@angular/platform-browser-dynamic": "~9.0.5", "@angular/router": "~9.0.5", "angular-in-memory-web-api": "^0.10.0", + "chart.js": "^2.9.3", "component": "^1.1.0", "rxjs": "~6.5.4", "tslib": "^1.10.0", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 61c8165a7..7a1f4d72b 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -21,6 +21,7 @@ import { environment } from '../environments/environment'; import { DashboardComponent } from './dashboard/dashboard.component'; import { MatCardModule } from '@angular/material/card'; import { FlexLayoutModule } from '@angular/flex-layout'; +import { DonutChartComponent } from './donut-chart/donut-chart.component'; @NgModule({ declarations: [ @@ -30,6 +31,7 @@ import { FlexLayoutModule } from '@angular/flex-layout'; DeviceListComponent, StatusToggleComponent, DashboardComponent, + DonutChartComponent, ], imports: [ BrowserModule, diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html index d8a9ed489..f5fbdf2ee 100644 --- a/src/app/dashboard/dashboard.component.html +++ b/src/app/dashboard/dashboard.component.html @@ -6,13 +6,17 @@
Folders - + + +
Devices - + + +
diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts index 270957fd0..b0b544e68 100644 --- a/src/app/dashboard/dashboard.component.ts +++ b/src/app/dashboard/dashboard.component.ts @@ -7,6 +7,9 @@ import { SystemConfigService } from '../system-config.service'; styleUrls: ['./dashboard.component.scss'] }) export class DashboardComponent { + foldersChart = 'foldersChart'; + devicesChart = 'devicesChart'; + constructor(private systemConfigService: SystemConfigService) { } ngOnInit() { diff --git a/src/app/donut-chart/donut-chart.component.html b/src/app/donut-chart/donut-chart.component.html new file mode 100644 index 000000000..8a3811eee --- /dev/null +++ b/src/app/donut-chart/donut-chart.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/donut-chart/donut-chart.component.scss b/src/app/donut-chart/donut-chart.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/donut-chart/donut-chart.component.spec.ts b/src/app/donut-chart/donut-chart.component.spec.ts new file mode 100644 index 000000000..8c299a9ec --- /dev/null +++ b/src/app/donut-chart/donut-chart.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DonutChartComponent } from './donut-chart.component'; + +describe('DonutChartComponent', () => { + let component: DonutChartComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DonutChartComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DonutChartComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/donut-chart/donut-chart.component.ts b/src/app/donut-chart/donut-chart.component.ts new file mode 100644 index 000000000..8c6eeb2c9 --- /dev/null +++ b/src/app/donut-chart/donut-chart.component.ts @@ -0,0 +1,48 @@ +import { Component, OnInit, AfterViewInit, Input } from '@angular/core'; +import { Chart } from 'chart.js' +import { flatMap } from 'rxjs/operators'; + +@Component({ + selector: 'app-donut-chart', + templateUrl: './donut-chart.component.html', + styleUrls: ['./donut-chart.component.scss'] +}) +export class DonutChartComponent implements OnInit { + @Input() elementID: string; + + private canvas: any; + private ctx: any; + + constructor() { } + + ngOnInit(): void { + } + + ngAfterViewInit(): void { + console.log("elementID?", this.elementID) + this.canvas = document.getElementById(this.elementID); + this.ctx = this.canvas.getContext('2d'); + const myChart = new Chart(this.ctx, { + type: 'doughnut', + data: { + labels: ["Up to Date", "Syncing", "Waiting to Sync", "Out of Sync", "Failed Items"], + datasets: [{ + data: [1, 2, 3, 0, 0], + backgroundColor: [ + '#56C568', + 'rgba(54, 162, 235, 1)', + 'rgba(255, 206, 86, 1)' + ], + borderWidth: 1 + }] + }, + options: { + responsive: false, + display: false, + legend: { + display: false + } + } + }); + } +} diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index 365d66078..dea7bd963 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -24,7 +24,7 @@ export class SystemConfigService { private systemConfigUrl = environment.production ? apiURL + 'rest/system/config' : 'api/config'; private httpOptions; - private checkInterval: number = 200; + private checkInterval: number = 500; constructor(private http: HttpClient, private cookieService: CookieService) { this.httpOptions = { headers: new HttpHeaders(this.cookieService.getCSRFHeader()) }; @@ -52,19 +52,11 @@ export class SystemConfigService { observer.next(this.folders); } else { // create timer to keep checking for folders - let check = (): Boolean => { - if (this.folders) { - observer.next(this.folders); - return true; - } - return false; - } let t = setInterval(() => { - if (check()) + if (check(this.folders)) clearInterval(t); + observer.next(this.folders); }, this.checkInterval); - - check(); // try right away } }); return folderObservable; @@ -75,22 +67,21 @@ export class SystemConfigService { if (this.folders) { observer.next(this.devices); } else { - // create timer to keep checking for devices - let check = (): Boolean => { - if (this.devices) { - observer.next(this.devices); - return true; - } - return false; - } let t = setInterval(() => { - if (check()) + if (check(this.devices)) { clearInterval(t); + observer.next(this.devices); + } }, this.checkInterval); - - check() // try right away } }); return deviceObserverable; } +} + +const check = (target: any): Boolean => { + if (target) { + return true; + } + return false; } \ No newline at end of file From 37f2f2cdf6a0d283a2828066e15687bbbc6c401e Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 16 Mar 2020 11:11:51 -0400 Subject: [PATCH 016/120] add delay to in memory service and update check interval --- src/app/app.module.ts | 2 +- src/app/donut-chart/donut-chart.component.ts | 1 - src/app/in-memory-config-data.service.ts | 1 - src/app/status-list/status-list.component.ts | 1 - src/app/system-config.service.ts | 16 +++++----------- 5 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 7a1f4d72b..fb6a0084e 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -47,7 +47,7 @@ import { DonutChartComponent } from './donut-chart/donut-chart.component'; cookieName: 'CSRF-Token-' + deviceID(), }), environment.production ? - [] : HttpClientInMemoryWebApiModule.forRoot(InMemoryConfigDataService), + [] : HttpClientInMemoryWebApiModule.forRoot(InMemoryConfigDataService, { delay: 200 }), MatCardModule, FlexLayoutModule ], diff --git a/src/app/donut-chart/donut-chart.component.ts b/src/app/donut-chart/donut-chart.component.ts index 8c6eeb2c9..ba70adb24 100644 --- a/src/app/donut-chart/donut-chart.component.ts +++ b/src/app/donut-chart/donut-chart.component.ts @@ -19,7 +19,6 @@ export class DonutChartComponent implements OnInit { } ngAfterViewInit(): void { - console.log("elementID?", this.elementID) this.canvas = document.getElementById(this.elementID); this.ctx = this.canvas.getContext('2d'); const myChart = new Chart(this.ctx, { diff --git a/src/app/in-memory-config-data.service.ts b/src/app/in-memory-config-data.service.ts index 5174693c6..ed3966c74 100644 --- a/src/app/in-memory-config-data.service.ts +++ b/src/app/in-memory-config-data.service.ts @@ -109,7 +109,6 @@ export class InMemoryConfigDataService { "ignoredDevices": [], "ignoredFolders": [] } - console.log("in mem?!?!?", config) return { config }; } constructor() { } diff --git a/src/app/status-list/status-list.component.ts b/src/app/status-list/status-list.component.ts index 6fc011497..39cd5ee1b 100644 --- a/src/app/status-list/status-list.component.ts +++ b/src/app/status-list/status-list.component.ts @@ -17,7 +17,6 @@ export class StatusListComponent implements OnInit { } onToggle(s: Status) { - console.log("holy moly", s); this.currentStatus = s; } } diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index dea7bd963..98bcd4175 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -24,7 +24,7 @@ export class SystemConfigService { private systemConfigUrl = environment.production ? apiURL + 'rest/system/config' : 'api/config'; private httpOptions; - private checkInterval: number = 500; + private checkInterval: number = 100; constructor(private http: HttpClient, private cookieService: CookieService) { this.httpOptions = { headers: new HttpHeaders(this.cookieService.getCSRFHeader()) }; @@ -53,9 +53,10 @@ export class SystemConfigService { } else { // create timer to keep checking for folders let t = setInterval(() => { - if (check(this.folders)) + if (this.folders) { clearInterval(t); - observer.next(this.folders); + observer.next(this.folders); + } }, this.checkInterval); } }); @@ -68,7 +69,7 @@ export class SystemConfigService { observer.next(this.devices); } else { let t = setInterval(() => { - if (check(this.devices)) { + if (this.devices) { clearInterval(t); observer.next(this.devices); } @@ -77,11 +78,4 @@ export class SystemConfigService { }); return deviceObserverable; } -} - -const check = (target: any): Boolean => { - if (target) { - return true; - } - return false; } \ No newline at end of file From eaffbc0f922c71890a1b7e50b8466d2983d98a8e Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 16 Mar 2020 12:11:27 -0400 Subject: [PATCH 017/120] refactor chart and list component structure --- src/app/app.module.ts | 25 ++++++++++++------- .../device-chart/device-chart.component.html | 1 + .../device-chart/device-chart.component.scss} | 0 .../device-chart.component.spec.ts | 25 +++++++++++++++++++ .../device-chart/device-chart.component.ts | 15 +++++++++++ .../donut-chart/donut-chart.component.html | 0 .../donut-chart/donut-chart.component.scss} | 0 .../donut-chart/donut-chart.component.spec.ts | 0 .../donut-chart/donut-chart.component.ts | 2 +- .../folder-chart/folder-chart.component.html | 1 + .../folder-chart/folder-chart.component.scss | 0 .../folder-chart.component.spec.ts | 25 +++++++++++++++++++ .../folder-chart/folder-chart.component.ts | 15 +++++++++++ .../device-list/device-list-datasource.ts | 4 +-- .../device-list/device-list.component.html | 0 .../device-list/device-list.component.scss | 0 .../device-list/device-list.component.spec.ts | 0 .../device-list/device-list.component.ts | 5 ++-- .../folder-list/folder-list-datasource.ts | 4 +-- .../folder-list/folder-list.component.html | 0 .../folder-list/folder-list.component.scss | 0 .../folder-list/folder-list.component.spec.ts | 0 .../folder-list/folder-list.component.ts | 4 +-- .../status-list/status-list.component.html | 0 .../status-list/status-list.component.scss | 0 .../status-list/status-list.component.spec.ts | 0 .../status-list/status-list.component.ts | 2 +- 27 files changed, 108 insertions(+), 20 deletions(-) create mode 100644 src/app/chart/device-chart/device-chart.component.html rename src/app/{donut-chart/donut-chart.component.scss => chart/device-chart/device-chart.component.scss} (100%) create mode 100644 src/app/chart/device-chart/device-chart.component.spec.ts create mode 100644 src/app/chart/device-chart/device-chart.component.ts rename src/app/{ => chart}/donut-chart/donut-chart.component.html (100%) rename src/app/{status-list/status-list.component.scss => chart/donut-chart/donut-chart.component.scss} (100%) rename src/app/{ => chart}/donut-chart/donut-chart.component.spec.ts (100%) rename src/app/{ => chart}/donut-chart/donut-chart.component.ts (96%) create mode 100644 src/app/chart/folder-chart/folder-chart.component.html create mode 100644 src/app/chart/folder-chart/folder-chart.component.scss create mode 100644 src/app/chart/folder-chart/folder-chart.component.spec.ts create mode 100644 src/app/chart/folder-chart/folder-chart.component.ts rename src/app/{ => list}/device-list/device-list-datasource.ts (95%) rename src/app/{ => list}/device-list/device-list.component.html (100%) rename src/app/{ => list}/device-list/device-list.component.scss (100%) rename src/app/{ => list}/device-list/device-list.component.spec.ts (100%) rename src/app/{ => list}/device-list/device-list.component.ts (90%) rename src/app/{ => list}/folder-list/folder-list-datasource.ts (95%) rename src/app/{ => list}/folder-list/folder-list.component.html (100%) rename src/app/{ => list}/folder-list/folder-list.component.scss (100%) rename src/app/{ => list}/folder-list/folder-list.component.spec.ts (100%) rename src/app/{ => list}/folder-list/folder-list.component.ts (92%) rename src/app/{ => list}/status-list/status-list.component.html (100%) create mode 100644 src/app/list/status-list/status-list.component.scss rename src/app/{ => list}/status-list/status-list.component.spec.ts (100%) rename src/app/{ => list}/status-list/status-list.component.ts (91%) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index fb6a0084e..fac7f6fcd 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -6,22 +6,27 @@ import { MatTableModule } from '@angular/material/table'; import { MatPaginatorModule } from '@angular/material/paginator'; import { MatSortModule } from '@angular/material/sort'; import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatCardModule } from '@angular/material/card'; +import { FlexLayoutModule } from '@angular/flex-layout'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; + import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { StatusListComponent } from './status-list/status-list.component'; -import { FolderListComponent } from './folder-list/folder-list.component'; -import { DeviceListComponent } from './device-list/device-list.component'; +import { StatusListComponent } from './list/status-list/status-list.component'; +import { FolderListComponent } from './list/folder-list/folder-list.component'; +import { DeviceListComponent } from './list/device-list/device-list.component'; +import { DonutChartComponent } from './chart/donut-chart/donut-chart.component'; +import { DeviceChartComponent } from './chart/device-chart/device-chart.component'; +import { FolderChartComponent } from './chart/folder-chart/folder-chart.component'; +import { DashboardComponent } from './dashboard/dashboard.component'; import { StatusToggleComponent } from './status-toggle/status-toggle.component'; + import { HttpClientInMemoryWebApiModule } from 'angular-in-memory-web-api'; import { InMemoryConfigDataService } from './in-memory-config-data.service'; + import { deviceID } from './api-utils'; import { environment } from '../environments/environment'; -import { DashboardComponent } from './dashboard/dashboard.component'; -import { MatCardModule } from '@angular/material/card'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { DonutChartComponent } from './donut-chart/donut-chart.component'; @NgModule({ declarations: [ @@ -32,6 +37,8 @@ import { DonutChartComponent } from './donut-chart/donut-chart.component'; StatusToggleComponent, DashboardComponent, DonutChartComponent, + DeviceChartComponent, + FolderChartComponent, ], imports: [ BrowserModule, @@ -41,6 +48,8 @@ import { DonutChartComponent } from './donut-chart/donut-chart.component'; MatPaginatorModule, MatSortModule, MatButtonToggleModule, + MatCardModule, + FlexLayoutModule, HttpClientModule, HttpClientXsrfModule.withOptions({ headerName: 'X-CSRF-Token-' + deviceID(), @@ -48,8 +57,6 @@ import { DonutChartComponent } from './donut-chart/donut-chart.component'; }), environment.production ? [] : HttpClientInMemoryWebApiModule.forRoot(InMemoryConfigDataService, { delay: 200 }), - MatCardModule, - FlexLayoutModule ], providers: [], bootstrap: [AppComponent] diff --git a/src/app/chart/device-chart/device-chart.component.html b/src/app/chart/device-chart/device-chart.component.html new file mode 100644 index 000000000..d66130b49 --- /dev/null +++ b/src/app/chart/device-chart/device-chart.component.html @@ -0,0 +1 @@ +

device-chart works!

diff --git a/src/app/donut-chart/donut-chart.component.scss b/src/app/chart/device-chart/device-chart.component.scss similarity index 100% rename from src/app/donut-chart/donut-chart.component.scss rename to src/app/chart/device-chart/device-chart.component.scss diff --git a/src/app/chart/device-chart/device-chart.component.spec.ts b/src/app/chart/device-chart/device-chart.component.spec.ts new file mode 100644 index 000000000..9f40493dc --- /dev/null +++ b/src/app/chart/device-chart/device-chart.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DeviceChartComponent } from './device-chart.component'; + +describe('DeviceChartComponent', () => { + let component: DeviceChartComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DeviceChartComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DeviceChartComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/chart/device-chart/device-chart.component.ts b/src/app/chart/device-chart/device-chart.component.ts new file mode 100644 index 000000000..d58849e79 --- /dev/null +++ b/src/app/chart/device-chart/device-chart.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-device-chart', + templateUrl: './device-chart.component.html', + styleUrls: ['./device-chart.component.scss'] +}) +export class DeviceChartComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/donut-chart/donut-chart.component.html b/src/app/chart/donut-chart/donut-chart.component.html similarity index 100% rename from src/app/donut-chart/donut-chart.component.html rename to src/app/chart/donut-chart/donut-chart.component.html diff --git a/src/app/status-list/status-list.component.scss b/src/app/chart/donut-chart/donut-chart.component.scss similarity index 100% rename from src/app/status-list/status-list.component.scss rename to src/app/chart/donut-chart/donut-chart.component.scss diff --git a/src/app/donut-chart/donut-chart.component.spec.ts b/src/app/chart/donut-chart/donut-chart.component.spec.ts similarity index 100% rename from src/app/donut-chart/donut-chart.component.spec.ts rename to src/app/chart/donut-chart/donut-chart.component.spec.ts diff --git a/src/app/donut-chart/donut-chart.component.ts b/src/app/chart/donut-chart/donut-chart.component.ts similarity index 96% rename from src/app/donut-chart/donut-chart.component.ts rename to src/app/chart/donut-chart/donut-chart.component.ts index ba70adb24..8b4f687e8 100644 --- a/src/app/donut-chart/donut-chart.component.ts +++ b/src/app/chart/donut-chart/donut-chart.component.ts @@ -26,7 +26,7 @@ export class DonutChartComponent implements OnInit { data: { labels: ["Up to Date", "Syncing", "Waiting to Sync", "Out of Sync", "Failed Items"], datasets: [{ - data: [1, 2, 3, 0, 0], + data: [100, 200, 300, 0, 0], backgroundColor: [ '#56C568', 'rgba(54, 162, 235, 1)', diff --git a/src/app/chart/folder-chart/folder-chart.component.html b/src/app/chart/folder-chart/folder-chart.component.html new file mode 100644 index 000000000..f193f5720 --- /dev/null +++ b/src/app/chart/folder-chart/folder-chart.component.html @@ -0,0 +1 @@ +

folder-chart works!

diff --git a/src/app/chart/folder-chart/folder-chart.component.scss b/src/app/chart/folder-chart/folder-chart.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/chart/folder-chart/folder-chart.component.spec.ts b/src/app/chart/folder-chart/folder-chart.component.spec.ts new file mode 100644 index 000000000..1a9754940 --- /dev/null +++ b/src/app/chart/folder-chart/folder-chart.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FolderChartComponent } from './folder-chart.component'; + +describe('FolderChartComponent', () => { + let component: FolderChartComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FolderChartComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FolderChartComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/chart/folder-chart/folder-chart.component.ts b/src/app/chart/folder-chart/folder-chart.component.ts new file mode 100644 index 000000000..ab43ff1f0 --- /dev/null +++ b/src/app/chart/folder-chart/folder-chart.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-folder-chart', + templateUrl: './folder-chart.component.html', + styleUrls: ['./folder-chart.component.scss'] +}) +export class FolderChartComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/device-list/device-list-datasource.ts b/src/app/list/device-list/device-list-datasource.ts similarity index 95% rename from src/app/device-list/device-list-datasource.ts rename to src/app/list/device-list/device-list-datasource.ts index 95d3a6796..d2cbc6724 100644 --- a/src/app/device-list/device-list-datasource.ts +++ b/src/app/list/device-list/device-list-datasource.ts @@ -4,8 +4,8 @@ import { MatSort } from '@angular/material/sort'; import { map } from 'rxjs/operators'; import { Observable, of as observableOf, merge } from 'rxjs'; -import { Device } from '../device'; -import { SystemConfigService } from '../system-config.service'; +import { Device } from '../../device'; +import { SystemConfigService } from '../../system-config.service'; /** * Data source for the DeviceList view. This class should diff --git a/src/app/device-list/device-list.component.html b/src/app/list/device-list/device-list.component.html similarity index 100% rename from src/app/device-list/device-list.component.html rename to src/app/list/device-list/device-list.component.html diff --git a/src/app/device-list/device-list.component.scss b/src/app/list/device-list/device-list.component.scss similarity index 100% rename from src/app/device-list/device-list.component.scss rename to src/app/list/device-list/device-list.component.scss diff --git a/src/app/device-list/device-list.component.spec.ts b/src/app/list/device-list/device-list.component.spec.ts similarity index 100% rename from src/app/device-list/device-list.component.spec.ts rename to src/app/list/device-list/device-list.component.spec.ts diff --git a/src/app/device-list/device-list.component.ts b/src/app/list/device-list/device-list.component.ts similarity index 90% rename from src/app/device-list/device-list.component.ts rename to src/app/list/device-list/device-list.component.ts index 73971924b..8ee6edddd 100644 --- a/src/app/device-list/device-list.component.ts +++ b/src/app/list/device-list/device-list.component.ts @@ -4,9 +4,8 @@ import { MatSort } from '@angular/material/sort'; import { MatTable } from '@angular/material/table'; import { DeviceListDataSource } from './device-list-datasource'; -import { Device } from '../device'; -import { SystemConfigService } from '../system-config.service'; -import { flatMap } from 'rxjs/operators'; +import { Device } from '../../device'; +import { SystemConfigService } from '../../system-config.service'; @Component({ diff --git a/src/app/folder-list/folder-list-datasource.ts b/src/app/list/folder-list/folder-list-datasource.ts similarity index 95% rename from src/app/folder-list/folder-list-datasource.ts rename to src/app/list/folder-list/folder-list-datasource.ts index 741bb788e..1f9379a77 100644 --- a/src/app/folder-list/folder-list-datasource.ts +++ b/src/app/list/folder-list/folder-list-datasource.ts @@ -4,8 +4,8 @@ import { MatSort } from '@angular/material/sort'; import { map } from 'rxjs/operators'; import { Observable, of as observableOf, merge } from 'rxjs'; -import { Folder } from '../folder'; -import { SystemConfigService } from '../system-config.service'; +import { Folder } from '../../folder'; +import { SystemConfigService } from '../../system-config.service'; /** * Data source for the FolderList view. This class should diff --git a/src/app/folder-list/folder-list.component.html b/src/app/list/folder-list/folder-list.component.html similarity index 100% rename from src/app/folder-list/folder-list.component.html rename to src/app/list/folder-list/folder-list.component.html diff --git a/src/app/folder-list/folder-list.component.scss b/src/app/list/folder-list/folder-list.component.scss similarity index 100% rename from src/app/folder-list/folder-list.component.scss rename to src/app/list/folder-list/folder-list.component.scss diff --git a/src/app/folder-list/folder-list.component.spec.ts b/src/app/list/folder-list/folder-list.component.spec.ts similarity index 100% rename from src/app/folder-list/folder-list.component.spec.ts rename to src/app/list/folder-list/folder-list.component.spec.ts diff --git a/src/app/folder-list/folder-list.component.ts b/src/app/list/folder-list/folder-list.component.ts similarity index 92% rename from src/app/folder-list/folder-list.component.ts rename to src/app/list/folder-list/folder-list.component.ts index ac18ee0c5..f0b446e20 100644 --- a/src/app/folder-list/folder-list.component.ts +++ b/src/app/list/folder-list/folder-list.component.ts @@ -4,8 +4,8 @@ import { MatSort } from '@angular/material/sort'; import { MatTable } from '@angular/material/table'; import { FolderListDataSource } from './folder-list-datasource'; -import { Folder } from '../folder'; -import { SystemConfigService } from '../system-config.service'; +import { Folder } from '../../folder'; +import { SystemConfigService } from '../../system-config.service'; @Component({ diff --git a/src/app/status-list/status-list.component.html b/src/app/list/status-list/status-list.component.html similarity index 100% rename from src/app/status-list/status-list.component.html rename to src/app/list/status-list/status-list.component.html diff --git a/src/app/list/status-list/status-list.component.scss b/src/app/list/status-list/status-list.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/status-list/status-list.component.spec.ts b/src/app/list/status-list/status-list.component.spec.ts similarity index 100% rename from src/app/status-list/status-list.component.spec.ts rename to src/app/list/status-list/status-list.component.spec.ts diff --git a/src/app/status-list/status-list.component.ts b/src/app/list/status-list/status-list.component.ts similarity index 91% rename from src/app/status-list/status-list.component.ts rename to src/app/list/status-list/status-list.component.ts index 39cd5ee1b..6869b8533 100644 --- a/src/app/status-list/status-list.component.ts +++ b/src/app/list/status-list/status-list.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { Status } from '../status'; +import { Status } from '../../status'; @Component({ From aebcc495f9a271ecb536c65c3f5c3611723218e0 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 16 Mar 2020 13:53:07 -0400 Subject: [PATCH 018/120] create style.ts to set elevation for all dashboard components --- .../chart/device-chart/device-chart.component.html | 8 +++++++- .../chart/device-chart/device-chart.component.ts | 3 +++ .../chart/folder-chart/folder-chart.component.html | 7 ++++++- .../chart/folder-chart/folder-chart.component.ts | 11 ++++++++++- src/app/dashboard/dashboard.component.html | 14 ++------------ src/app/dashboard/dashboard.component.ts | 3 +-- .../list/device-list/device-list.component.html | 2 +- src/app/list/device-list/device-list.component.ts | 2 ++ .../list/folder-list/folder-list.component.html | 2 +- src/app/list/folder-list/folder-list.component.ts | 3 ++- src/app/style.ts | 2 ++ 11 files changed, 37 insertions(+), 20 deletions(-) create mode 100644 src/app/style.ts diff --git a/src/app/chart/device-chart/device-chart.component.html b/src/app/chart/device-chart/device-chart.component.html index d66130b49..01a9f9823 100644 --- a/src/app/chart/device-chart/device-chart.component.html +++ b/src/app/chart/device-chart/device-chart.component.html @@ -1 +1,7 @@ -

device-chart works!

+ + Devices + + + + + \ No newline at end of file diff --git a/src/app/chart/device-chart/device-chart.component.ts b/src/app/chart/device-chart/device-chart.component.ts index d58849e79..5354dc3e3 100644 --- a/src/app/chart/device-chart/device-chart.component.ts +++ b/src/app/chart/device-chart/device-chart.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit } from '@angular/core'; +import { cardElevation } from '../../style'; @Component({ selector: 'app-device-chart', @@ -6,6 +7,8 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./device-chart.component.scss'] }) export class DeviceChartComponent implements OnInit { + chartID: string = 'devicesChart'; + elevation: string = cardElevation; constructor() { } diff --git a/src/app/chart/folder-chart/folder-chart.component.html b/src/app/chart/folder-chart/folder-chart.component.html index f193f5720..a589a32aa 100644 --- a/src/app/chart/folder-chart/folder-chart.component.html +++ b/src/app/chart/folder-chart/folder-chart.component.html @@ -1 +1,6 @@ -

folder-chart works!

+ + Folders + + + + \ No newline at end of file diff --git a/src/app/chart/folder-chart/folder-chart.component.ts b/src/app/chart/folder-chart/folder-chart.component.ts index ab43ff1f0..11bd0beb6 100644 --- a/src/app/chart/folder-chart/folder-chart.component.ts +++ b/src/app/chart/folder-chart/folder-chart.component.ts @@ -1,4 +1,6 @@ import { Component, OnInit } from '@angular/core'; +import { SystemConfigService } from 'src/app/system-config.service'; +import { cardElevation } from '../../style' @Component({ selector: 'app-folder-chart', @@ -6,10 +8,17 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./folder-chart.component.scss'] }) export class FolderChartComponent implements OnInit { + chartID: string = 'foldersChart'; + elevation: string = cardElevation; - constructor() { } + constructor(private systemConfigService: SystemConfigService) { } ngOnInit(): void { + this.systemConfigService.getFolders().subscribe( + data => { + console.log("char folder data", data) + } + ); } } diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html index f5fbdf2ee..9b5a4a951 100644 --- a/src/app/dashboard/dashboard.component.html +++ b/src/app/dashboard/dashboard.component.html @@ -4,20 +4,10 @@

Tech UI

- - Folders - - - - +
- - Devices - - - - +
diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts index b0b544e68..9f03e0bf4 100644 --- a/src/app/dashboard/dashboard.component.ts +++ b/src/app/dashboard/dashboard.component.ts @@ -7,8 +7,7 @@ import { SystemConfigService } from '../system-config.service'; styleUrls: ['./dashboard.component.scss'] }) export class DashboardComponent { - foldersChart = 'foldersChart'; - devicesChart = 'devicesChart'; + constructor(private systemConfigService: SystemConfigService) { } diff --git a/src/app/list/device-list/device-list.component.html b/src/app/list/device-list/device-list.component.html index 1cdaa5a28..495143a32 100644 --- a/src/app/list/device-list/device-list.component.html +++ b/src/app/list/device-list/device-list.component.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/app/list/device-list/device-list.component.ts b/src/app/list/device-list/device-list.component.ts index 8ee6edddd..77bfa4c43 100644 --- a/src/app/list/device-list/device-list.component.ts +++ b/src/app/list/device-list/device-list.component.ts @@ -6,6 +6,7 @@ import { MatTable } from '@angular/material/table'; import { DeviceListDataSource } from './device-list-datasource'; import { Device } from '../../device'; import { SystemConfigService } from '../../system-config.service'; +import { cardElevation } from '../../style'; @Component({ @@ -18,6 +19,7 @@ export class DeviceListComponent implements AfterViewInit, OnInit { @ViewChild(MatSort) sort: MatSort; @ViewChild(MatTable) table: MatTable; dataSource: DeviceListDataSource; + elevation: string = cardElevation; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['id', 'name']; diff --git a/src/app/list/folder-list/folder-list.component.html b/src/app/list/folder-list/folder-list.component.html index 167df11f1..90f3840a3 100644 --- a/src/app/list/folder-list/folder-list.component.html +++ b/src/app/list/folder-list/folder-list.component.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/app/list/folder-list/folder-list.component.ts b/src/app/list/folder-list/folder-list.component.ts index f0b446e20..1daeb4666 100644 --- a/src/app/list/folder-list/folder-list.component.ts +++ b/src/app/list/folder-list/folder-list.component.ts @@ -6,7 +6,7 @@ import { MatTable } from '@angular/material/table'; import { FolderListDataSource } from './folder-list-datasource'; import { Folder } from '../../folder'; import { SystemConfigService } from '../../system-config.service'; - +import { cardElevation } from '../../style'; @Component({ selector: 'app-folder-list', @@ -18,6 +18,7 @@ export class FolderListComponent implements AfterViewInit, OnInit { @ViewChild(MatSort) sort: MatSort; @ViewChild(MatTable) table: MatTable; dataSource: FolderListDataSource; + elevation: string = cardElevation; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['id', 'label']; diff --git a/src/app/style.ts b/src/app/style.ts new file mode 100644 index 000000000..1bf2f3660 --- /dev/null +++ b/src/app/style.ts @@ -0,0 +1,2 @@ +// material design elevation for all dashboard components +export const cardElevation: string = "mat-elevation-z2"; \ No newline at end of file From f250425ef1a541953a899d83201085a1336b4bbe Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 16 Mar 2020 15:13:49 -0400 Subject: [PATCH 019/120] clean up mock data and update device interface --- .../folder-chart/folder-chart.component.ts | 2 ++ src/app/device.ts | 2 +- .../list/device-list/device-list-datasource.ts | 2 +- .../list/device-list/device-list.component.html | 2 +- src/app/mock-config-data.ts | 17 ----------------- src/app/system-config.service.ts | 1 - 6 files changed, 5 insertions(+), 21 deletions(-) delete mode 100644 src/app/mock-config-data.ts diff --git a/src/app/chart/folder-chart/folder-chart.component.ts b/src/app/chart/folder-chart/folder-chart.component.ts index 11bd0beb6..2ba7730bf 100644 --- a/src/app/chart/folder-chart/folder-chart.component.ts +++ b/src/app/chart/folder-chart/folder-chart.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { SystemConfigService } from 'src/app/system-config.service'; +import { Folder } from '../../folder' import { cardElevation } from '../../style' @Component({ @@ -10,6 +11,7 @@ import { cardElevation } from '../../style' export class FolderChartComponent implements OnInit { chartID: string = 'foldersChart'; elevation: string = cardElevation; + data: Folder[]; constructor(private systemConfigService: SystemConfigService) { } diff --git a/src/app/device.ts b/src/app/device.ts index 152e73d8a..a2a8cc078 100644 --- a/src/app/device.ts +++ b/src/app/device.ts @@ -1,5 +1,5 @@ export interface Device { - id: string; + deviceID: string; name: string; // TODO add additional properties diff --git a/src/app/list/device-list/device-list-datasource.ts b/src/app/list/device-list/device-list-datasource.ts index d2cbc6724..616ec89f2 100644 --- a/src/app/list/device-list/device-list-datasource.ts +++ b/src/app/list/device-list/device-list-datasource.ts @@ -68,7 +68,7 @@ export class DeviceListDataSource extends DataSource { const isAsc = this.sort.direction === 'asc'; switch (this.sort.active) { case 'name': return compare(a.name, b.name, isAsc); - case 'id': return compare(+a.id, +b.id, isAsc); + case 'id': return compare(+a.deviceID, +b.deviceID, isAsc); default: return 0; } }); diff --git a/src/app/list/device-list/device-list.component.html b/src/app/list/device-list/device-list.component.html index 495143a32..86d7bcfef 100644 --- a/src/app/list/device-list/device-list.component.html +++ b/src/app/list/device-list/device-list.component.html @@ -3,7 +3,7 @@ - + diff --git a/src/app/mock-config-data.ts b/src/app/mock-config-data.ts deleted file mode 100644 index 2976df5b4..000000000 --- a/src/app/mock-config-data.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Folder } from './folder'; -import { Device } from './device'; - -export const FOLDERS: Folder[] = [ - { id: 'GXWxf-3zgnU', label: 'Downloads' }, - { id: 'PXWxf-3zgnU', label: 'Music' }, - { id: 'QXWxf-3zgnU', label: 'Photos' }, - { id: 'RXWxf-3zgnU', label: 'Movies' }, - { id: 'SXWxf-3zgnU', label: 'Folder 5' }, -]; - -export const DEVICES: Device[] = [ - { id: '001', name: 'macbook' }, - { id: '002', name: 'bedroom computer' }, - { id: '003', name: 'server in closet' }, - { id: '004', name: 'random' }, -]; \ No newline at end of file diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index 98bcd4175..1869184a2 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -6,7 +6,6 @@ import { map } from 'rxjs/operators'; import { Folder } from './folder'; import { Device } from './device'; -import { FOLDERS, DEVICES } from './mock-config-data'; import { CookieService } from './cookie.service'; import { environment } from '../environments/environment' import { apiURL } from './api-utils' From 08da982de52e5ddb2a8be117f6f71c04c7b6de54 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 16 Mar 2020 17:58:20 -0400 Subject: [PATCH 020/120] pass and add data to donut chart --- .../device-chart/device-chart.component.html | 3 +- .../device-chart/device-chart.component.ts | 10 +++++-- .../donut-chart/donut-chart.component.ts | 29 ++++++++++++++----- .../folder-chart/folder-chart.component.html | 2 +- .../folder-chart/folder-chart.component.ts | 8 +++-- 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/app/chart/device-chart/device-chart.component.html b/src/app/chart/device-chart/device-chart.component.html index 01a9f9823..49e7f814b 100644 --- a/src/app/chart/device-chart/device-chart.component.html +++ b/src/app/chart/device-chart/device-chart.component.html @@ -1,7 +1,6 @@ Devices - - + \ No newline at end of file diff --git a/src/app/chart/device-chart/device-chart.component.ts b/src/app/chart/device-chart/device-chart.component.ts index 5354dc3e3..1899b7217 100644 --- a/src/app/chart/device-chart/device-chart.component.ts +++ b/src/app/chart/device-chart/device-chart.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { cardElevation } from '../../style'; +import { SystemConfigService } from 'src/app/system-config.service'; @Component({ selector: 'app-device-chart', @@ -9,10 +10,15 @@ import { cardElevation } from '../../style'; export class DeviceChartComponent implements OnInit { chartID: string = 'devicesChart'; elevation: string = cardElevation; + data: number[]; - constructor() { } + constructor(private systemConfigService: SystemConfigService) { } ngOnInit(): void { + this.systemConfigService.getFolders().subscribe( + data => { + this.data = [0, 230, 32, 40]; + } + ); } - } diff --git a/src/app/chart/donut-chart/donut-chart.component.ts b/src/app/chart/donut-chart/donut-chart.component.ts index 8b4f687e8..f2cbfadd0 100644 --- a/src/app/chart/donut-chart/donut-chart.component.ts +++ b/src/app/chart/donut-chart/donut-chart.component.ts @@ -1,32 +1,48 @@ -import { Component, OnInit, AfterViewInit, Input } from '@angular/core'; +import { Component, Input } from '@angular/core'; import { Chart } from 'chart.js' -import { flatMap } from 'rxjs/operators'; +import { SystemConfigService } from 'src/app/system-config.service'; @Component({ selector: 'app-donut-chart', templateUrl: './donut-chart.component.html', styleUrls: ['./donut-chart.component.scss'] }) -export class DonutChartComponent implements OnInit { +export class DonutChartComponent { @Input() elementID: string; + @Input() set data(val: number[]) { + if (this.chart) { + val.forEach((v) => { + this.addData(v) + }); + console.log("set the data?", val) + } + }; private canvas: any; private ctx: any; + private chart: Chart; constructor() { } - ngOnInit(): void { + addData(data: number): void { + // this.chart.data.labels.push(label); + this.chart.data.datasets.forEach((dataset) => { + dataset.data.push(data); + }); + this.chart.update(); } + ngAfterViewInit(): void { + console.log("is the data set?", this.data, this.elementID); this.canvas = document.getElementById(this.elementID); this.ctx = this.canvas.getContext('2d'); - const myChart = new Chart(this.ctx, { + this.chart = new Chart(this.ctx, { type: 'doughnut', data: { labels: ["Up to Date", "Syncing", "Waiting to Sync", "Out of Sync", "Failed Items"], datasets: [{ - data: [100, 200, 300, 0, 0], + data: [], backgroundColor: [ '#56C568', 'rgba(54, 162, 235, 1)', @@ -37,7 +53,6 @@ export class DonutChartComponent implements OnInit { }, options: { responsive: false, - display: false, legend: { display: false } diff --git a/src/app/chart/folder-chart/folder-chart.component.html b/src/app/chart/folder-chart/folder-chart.component.html index a589a32aa..18f070027 100644 --- a/src/app/chart/folder-chart/folder-chart.component.html +++ b/src/app/chart/folder-chart/folder-chart.component.html @@ -1,6 +1,6 @@ Folders - + \ No newline at end of file diff --git a/src/app/chart/folder-chart/folder-chart.component.ts b/src/app/chart/folder-chart/folder-chart.component.ts index 2ba7730bf..8f5d90807 100644 --- a/src/app/chart/folder-chart/folder-chart.component.ts +++ b/src/app/chart/folder-chart/folder-chart.component.ts @@ -11,16 +11,20 @@ import { cardElevation } from '../../style' export class FolderChartComponent implements OnInit { chartID: string = 'foldersChart'; elevation: string = cardElevation; - data: Folder[]; + data: number[]; constructor(private systemConfigService: SystemConfigService) { } ngOnInit(): void { this.systemConfigService.getFolders().subscribe( data => { - console.log("char folder data", data) + this.data = [0, 1, 32, 40]; } ); } + /* + ngAfterViewInit() { + } + */ } From 8bdf409d076d445c682e93c7d22a093e825983cb Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 17 Mar 2020 09:46:32 -0400 Subject: [PATCH 021/120] start of db status service --- .../device-chart/device-chart.component.ts | 2 +- .../donut-chart/donut-chart.component.ts | 2 -- .../folder-chart/folder-chart.component.ts | 4 +++ src/app/db-status.service.spec.ts | 16 ++++++++++ src/app/db-status.service.ts | 31 +++++++++++++++++++ src/app/system-config.service.ts | 7 ++--- 6 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 src/app/db-status.service.spec.ts create mode 100644 src/app/db-status.service.ts diff --git a/src/app/chart/device-chart/device-chart.component.ts b/src/app/chart/device-chart/device-chart.component.ts index 1899b7217..cf8bccac1 100644 --- a/src/app/chart/device-chart/device-chart.component.ts +++ b/src/app/chart/device-chart/device-chart.component.ts @@ -15,7 +15,7 @@ export class DeviceChartComponent implements OnInit { constructor(private systemConfigService: SystemConfigService) { } ngOnInit(): void { - this.systemConfigService.getFolders().subscribe( + this.systemConfigService.getDevices().subscribe( data => { this.data = [0, 230, 32, 40]; } diff --git a/src/app/chart/donut-chart/donut-chart.component.ts b/src/app/chart/donut-chart/donut-chart.component.ts index f2cbfadd0..19fa01147 100644 --- a/src/app/chart/donut-chart/donut-chart.component.ts +++ b/src/app/chart/donut-chart/donut-chart.component.ts @@ -14,7 +14,6 @@ export class DonutChartComponent { val.forEach((v) => { this.addData(v) }); - console.log("set the data?", val) } }; @@ -34,7 +33,6 @@ export class DonutChartComponent { ngAfterViewInit(): void { - console.log("is the data set?", this.data, this.elementID); this.canvas = document.getElementById(this.elementID); this.ctx = this.canvas.getContext('2d'); this.chart = new Chart(this.ctx, { diff --git a/src/app/chart/folder-chart/folder-chart.component.ts b/src/app/chart/folder-chart/folder-chart.component.ts index 8f5d90807..cc1aedffa 100644 --- a/src/app/chart/folder-chart/folder-chart.component.ts +++ b/src/app/chart/folder-chart/folder-chart.component.ts @@ -16,11 +16,15 @@ export class FolderChartComponent implements OnInit { constructor(private systemConfigService: SystemConfigService) { } ngOnInit(): void { + // Find total number of folders this.systemConfigService.getFolders().subscribe( data => { this.data = [0, 1, 32, 40]; } ); + + // Sequentially look up each folder to get status + // dbStatusService } /* ngAfterViewInit() { diff --git a/src/app/db-status.service.spec.ts b/src/app/db-status.service.spec.ts new file mode 100644 index 000000000..d5d0a16c6 --- /dev/null +++ b/src/app/db-status.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { DbStatusService } from './db-status.service'; + +describe('DbStatusService', () => { + let service: DbStatusService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(DbStatusService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/db-status.service.ts b/src/app/db-status.service.ts new file mode 100644 index 000000000..5e8e05769 --- /dev/null +++ b/src/app/db-status.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { CookieService } from './cookie.service'; + +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +import { environment } from '../environments/environment' +import { apiURL } from './api-utils' + +@Injectable({ + providedIn: 'root' +}) +export class DbStatusService { + private httpOptions: any; + private dbStatusUrl = environment.production ? apiURL + 'rest/db/status' : 'api/dbStatus'; + + constructor(private http: HttpClient, private cookieService: CookieService) { + this.httpOptions = { headers: new HttpHeaders(this.cookieService.getCSRFHeader()) }; + } + + getFolderStatus(id: string): Observable { + return this.http + .get(this.dbStatusUrl, this.httpOptions) + .pipe(map(res => { + // TODO update folder in system-config service + return res; + }) + ); + } +} diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index 1869184a2..c4bdd7f64 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { Observable, Subject, of } from 'rxjs'; +import { Observable, Subject } from 'rxjs'; import { map } from 'rxjs/operators'; import { Folder } from './folder'; @@ -14,14 +14,13 @@ import { apiURL } from './api-utils' providedIn: 'root' }) export class SystemConfigService { - private systemConfig: any; private folders: Folder[]; private devices: Device[]; private foldersSubject: Subject = new Subject(); private devicesSubject: Subject = new Subject(); private systemConfigUrl = environment.production ? apiURL + 'rest/system/config' : 'api/config'; - private httpOptions; + private httpOptions: any; private checkInterval: number = 100; @@ -33,8 +32,6 @@ export class SystemConfigService { return this.http .get(this.systemConfigUrl, this.httpOptions) .pipe(map(res => { - this.systemConfig = res; - this.folders = res['folders']; this.devices = res['devices']; this.foldersSubject.next(this.folders); From b2d839d4e7572d06606007d5d91423340d99b113 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 17 Mar 2020 21:10:31 -0400 Subject: [PATCH 022/120] fix race condition with Observables in list components --- .../list/device-list/device-list-datasource.ts | 6 ++++-- .../list/device-list/device-list.component.ts | 16 ++++++++++------ .../list/folder-list/folder-list-datasource.ts | 9 +++++---- .../list/folder-list/folder-list.component.ts | 16 ++++++++-------- 4 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/app/list/device-list/device-list-datasource.ts b/src/app/list/device-list/device-list-datasource.ts index 616ec89f2..bf266d7fc 100644 --- a/src/app/list/device-list/device-list-datasource.ts +++ b/src/app/list/device-list/device-list-datasource.ts @@ -3,7 +3,7 @@ import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { map } from 'rxjs/operators'; -import { Observable, of as observableOf, merge } from 'rxjs'; +import { Observable, of as observableOf, merge, Subject } from 'rxjs'; import { Device } from '../../device'; import { SystemConfigService } from '../../system-config.service'; @@ -14,6 +14,7 @@ import { SystemConfigService } from '../../system-config.service'; */ export class DeviceListDataSource extends DataSource { data: Device[]; + dataSubject: Subject; paginator: MatPaginator; sort: MatSort; @@ -30,7 +31,8 @@ export class DeviceListDataSource extends DataSource { // Combine everything that affects the rendered data into one update // st const dataMutations = [ - this.systemConfigService.getDevices(), + this.dataSubject, + observableOf(this.data), this.paginator.page, this.sort.sortChange ]; diff --git a/src/app/list/device-list/device-list.component.ts b/src/app/list/device-list/device-list.component.ts index 77bfa4c43..c5aef0f37 100644 --- a/src/app/list/device-list/device-list.component.ts +++ b/src/app/list/device-list/device-list.component.ts @@ -7,6 +7,7 @@ import { DeviceListDataSource } from './device-list-datasource'; import { Device } from '../../device'; import { SystemConfigService } from '../../system-config.service'; import { cardElevation } from '../../style'; +import { Subject } from 'rxjs'; @Component({ @@ -28,18 +29,21 @@ export class DeviceListComponent implements AfterViewInit, OnInit { ngOnInit() { this.dataSource = new DeviceListDataSource(this.systemConfigService); + this.dataSource.dataSubject = new Subject() this.dataSource.data = []; + + this.systemConfigService.getDevices().subscribe( + data => { + console.log("get data??", data) + this.dataSource.data = data; + this.dataSource.dataSubject.next(data); + } + ); } ngAfterViewInit() { this.dataSource.sort = this.sort; this.dataSource.paginator = this.paginator; this.table.dataSource = this.dataSource; - - this.systemConfigService.getDevices().subscribe( - data => { - this.dataSource.data = data; - } - ); } } \ No newline at end of file diff --git a/src/app/list/folder-list/folder-list-datasource.ts b/src/app/list/folder-list/folder-list-datasource.ts index 1f9379a77..1ffd7e043 100644 --- a/src/app/list/folder-list/folder-list-datasource.ts +++ b/src/app/list/folder-list/folder-list-datasource.ts @@ -3,7 +3,7 @@ import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { map } from 'rxjs/operators'; -import { Observable, of as observableOf, merge } from 'rxjs'; +import { Observable, of as observableOf, merge, Subject } from 'rxjs'; import { Folder } from '../../folder'; import { SystemConfigService } from '../../system-config.service'; @@ -12,8 +12,9 @@ import { SystemConfigService } from '../../system-config.service'; * encapsulate all logic for fetching and manipulating the displayed data * (including sorting, pagination, and filtering). */ -export class FolderListDataSource extends DataSource { +export class FolderListDataSource extends DataSource { data: Folder[]; + dataSubject: Subject; paginator: MatPaginator; sort: MatSort; @@ -30,8 +31,8 @@ export class FolderListDataSource extends DataSource { // Combine everything that affects the rendered data into one update // st const dataMutations = [ - // observableOf(this.data), - this.systemConfigService.getFolders(), + this.dataSubject, + observableOf(this.data), this.paginator.page, this.sort.sortChange ]; diff --git a/src/app/list/folder-list/folder-list.component.ts b/src/app/list/folder-list/folder-list.component.ts index 1daeb4666..0fe1a3939 100644 --- a/src/app/list/folder-list/folder-list.component.ts +++ b/src/app/list/folder-list/folder-list.component.ts @@ -7,6 +7,7 @@ import { FolderListDataSource } from './folder-list-datasource'; import { Folder } from '../../folder'; import { SystemConfigService } from '../../system-config.service'; import { cardElevation } from '../../style'; +import { Subject } from 'rxjs'; @Component({ selector: 'app-folder-list', @@ -27,21 +28,20 @@ export class FolderListComponent implements AfterViewInit, OnInit { ngOnInit() { this.dataSource = new FolderListDataSource(this.systemConfigService); + this.dataSource.dataSubject = new Subject(); this.dataSource.data = []; - } - ngAfterContentInit() { + this.systemConfigService.getFolders().subscribe( + data => { + this.dataSource.data = data; + this.dataSource.dataSubject.next(data); + } + ); } ngAfterViewInit() { this.dataSource.sort = this.sort; this.dataSource.paginator = this.paginator; this.table.dataSource = this.dataSource; - - this.systemConfigService.getFolders().subscribe( - data => { - this.dataSource.data = data; - } - ); } } From 241864b43c24dff2de6e2a770854a688dd89a98a Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 17 Mar 2020 22:36:13 -0400 Subject: [PATCH 023/120] create mock data --- src/app/in-memory-config-data.service.ts | 109 +---------------------- src/app/mock/mock-config.ts | 104 +++++++++++++++++++++ src/app/mock/mock-db-status.ts | 31 +++++++ 3 files changed, 139 insertions(+), 105 deletions(-) create mode 100644 src/app/mock/mock-config.ts create mode 100644 src/app/mock/mock-db-status.ts diff --git a/src/app/in-memory-config-data.service.ts b/src/app/in-memory-config-data.service.ts index ed3966c74..29c3d58bd 100644 --- a/src/app/in-memory-config-data.service.ts +++ b/src/app/in-memory-config-data.service.ts @@ -1,115 +1,14 @@ import { Injectable } from '@angular/core'; +import { config } from './mock/mock-config' +import { dbStatus } from './mock/mock-db-status' @Injectable({ providedIn: 'root' }) export class InMemoryConfigDataService { createDb() { - const config = { - "version": 15, - "folders": [ - { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - ], - "devices": [ - { "deviceID": "...", "name": "Laptop", "addresses": ["dynamic", "tcp://192.168.1.2:22000"], "compression": "metadata", "certName": "", "introducer": false }, - { "deviceID": "...", "name": "Server", "addresses": ["dynamic", "tcp://192.168.1.3:22000"], "compression": "metadata", "certName": "", "introducer": false }, - ], - "gui": { - "enabled": true, - "address": "127.0.0.1:8384", - "user": "Username", - "password": "$2a$10$ZFws69T4FlvWwsqeIwL.TOo5zOYqsa/.TxlUnsGYS.j3JvjFTmxo6", - "useTLS": false, - "apiKey": "pGahcht56664QU5eoFQW6szbEG6Ec2Cr", - "insecureAdminAccess": false, - "theme": "default" - }, - "options": { - "listenAddresses": [ - "default" - ], - "globalAnnounceServers": [ - "default" - ], - "globalAnnounceEnabled": true, - "localAnnounceEnabled": true, - "localAnnouncePort": 21027, - "localAnnounceMCAddr": "[ff12::8384]:21027", - "maxSendKbps": 0, - "maxRecvKbps": 0, - "reconnectionIntervalS": 60, - "relaysEnabled": true, - "relayReconnectIntervalM": 10, - "startBrowser": false, - "natEnabled": true, - "natLeaseMinutes": 60, - "natRenewalMinutes": 30, - "natTimeoutSeconds": 10, - "urAccepted": -1, - "urUniqueId": "", - "urURL": "https://data.syncthing.net/newdata", - "urPostInsecurely": false, - "urInitialDelayS": 1800, - "restartOnWakeup": true, - "autoUpgradeIntervalH": 12, - "keepTemporariesH": 24, - "cacheIgnoredFiles": false, - "progressUpdateIntervalS": 5, - "limitBandwidthInLan": false, - "minHomeDiskFreePct": 1, - "releasesURL": "https://upgrades.syncthing.net/meta.json", - "alwaysLocalNets": [], - "overwriteRemoteDeviceNamesOnConnect": false, - "tempIndexMinBlocks": 10 - }, - "ignoredDevices": [], - "ignoredFolders": [] - } - return { config }; + return { config, dbStatus }; } + constructor() { } } diff --git a/src/app/mock/mock-config.ts b/src/app/mock/mock-config.ts new file mode 100644 index 000000000..3261a97a4 --- /dev/null +++ b/src/app/mock/mock-config.ts @@ -0,0 +1,104 @@ +export const config = { + "version": 15, + "folders": [ + { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + ], + "devices": [ + { "deviceID": "...", "name": "Laptop", "addresses": ["dynamic", "tcp://192.168.1.2:22000"], "compression": "metadata", "certName": "", "introducer": false }, + { "deviceID": "...", "name": "Server", "addresses": ["dynamic", "tcp://192.168.1.3:22000"], "compression": "metadata", "certName": "", "introducer": false }, + ], + "gui": { + "enabled": true, + "address": "127.0.0.1:8384", + "user": "Username", + "password": "$2a$10$ZFws69T4FlvWwsqeIwL.TOo5zOYqsa/.TxlUnsGYS.j3JvjFTmxo6", + "useTLS": false, + "apiKey": "pGahcht56664QU5eoFQW6szbEG6Ec2Cr", + "insecureAdminAccess": false, + "theme": "default" + }, + "options": { + "listenAddresses": [ + "default" + ], + "globalAnnounceServers": [ + "default" + ], + "globalAnnounceEnabled": true, + "localAnnounceEnabled": true, + "localAnnouncePort": 21027, + "localAnnounceMCAddr": "[ff12::8384]:21027", + "maxSendKbps": 0, + "maxRecvKbps": 0, + "reconnectionIntervalS": 60, + "relaysEnabled": true, + "relayReconnectIntervalM": 10, + "startBrowser": false, + "natEnabled": true, + "natLeaseMinutes": 60, + "natRenewalMinutes": 30, + "natTimeoutSeconds": 10, + "urAccepted": -1, + "urUniqueId": "", + "urURL": "https://data.syncthing.net/newdata", + "urPostInsecurely": false, + "urInitialDelayS": 1800, + "restartOnWakeup": true, + "autoUpgradeIntervalH": 12, + "keepTemporariesH": 24, + "cacheIgnoredFiles": false, + "progressUpdateIntervalS": 5, + "limitBandwidthInLan": false, + "minHomeDiskFreePct": 1, + "releasesURL": "https://upgrades.syncthing.net/meta.json", + "alwaysLocalNets": [], + "overwriteRemoteDeviceNamesOnConnect": false, + "tempIndexMinBlocks": 10 + }, + "ignoredDevices": [], + "ignoredFolders": [] +} \ No newline at end of file diff --git a/src/app/mock/mock-db-status.ts b/src/app/mock/mock-db-status.ts new file mode 100644 index 000000000..c321d119a --- /dev/null +++ b/src/app/mock/mock-db-status.ts @@ -0,0 +1,31 @@ +export const dbStatus = { + "globalBytes": 0, + "globalDeleted": 0, + "globalDirectories": 0, + "globalFiles": 0, + "globalSymlinks": 0, + "ignorePatterns": false, + "inSyncBytes": 0, + "inSyncFiles": 0, + "invalid": "", + "localBytes": 0, + "localDeleted": 0, + "localDirectories": 0, + "localFiles": 0, + "localSymlinks": 0, + "needBytes": 0, + "needDeletes": 0, + "needDirectories": 0, + "needFiles": 0, + "needSymlinks": 0, + "pullErrors": 0, + "receiveOnlyChangedBytes": 0, + "receiveOnlyChangedDeletes": 0, + "receiveOnlyChangedDirectories": 0, + "receiveOnlyChangedFiles": 0, + "receiveOnlyChangedSymlinks": 0, + "sequence": 0, + "state": "idle", + "stateChanged": "2018-08-08T07:04:57.301064781+02:00", + "version": 0 +}; \ No newline at end of file From 90c39de0ccb03fc913bf71a4146bf7276459cbef Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 17 Mar 2020 22:36:42 -0400 Subject: [PATCH 024/120] add system config service retry --- src/app/system-config.service.ts | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index c4bdd7f64..0cc98d80f 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -2,13 +2,13 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Observable, Subject } from 'rxjs'; -import { map } from 'rxjs/operators'; +import { map, retry } from 'rxjs/operators'; import { Folder } from './folder'; import { Device } from './device'; import { CookieService } from './cookie.service'; import { environment } from '../environments/environment' -import { apiURL } from './api-utils' +import { apiURL, apiRetry } from './api-utils' @Injectable({ providedIn: 'root' @@ -31,14 +31,16 @@ export class SystemConfigService { getSystemConfig(): Observable { return this.http .get(this.systemConfigUrl, this.httpOptions) - .pipe(map(res => { - this.folders = res['folders']; - this.devices = res['devices']; - this.foldersSubject.next(this.folders); - this.devicesSubject.next(this.devices); + .pipe( + retry(apiRetry), + map(res => { + this.folders = res['folders']; + this.devices = res['devices']; + this.foldersSubject.next(this.folders); + this.devicesSubject.next(this.devices); - return res; - }) + return res; + }) ); } From 75b3b31d11e8d19e5c7bbf2202bb7849babdfa94 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 17 Mar 2020 22:36:57 -0400 Subject: [PATCH 025/120] create folder status interface --- src/app/folder.ts | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/app/folder.ts b/src/app/folder.ts index 0ca038740..4d56e7944 100644 --- a/src/app/folder.ts +++ b/src/app/folder.ts @@ -1,6 +1,37 @@ export interface Folder { id: string; label: string; + status: FolderStatus; +} - // TODO add additional properties +export interface FolderStatus { + globalBytes: number; + globalDeleted: number; + globalDirectories: number; + globalFiles: number; + globalSymlinks: number; + ignorePatterns: boolean; + inSyncBytes: number; + inSyncFiles: number; + invalid: string; + localBytes: number; + localDeleted: number; + localDirectories: number; + localFiles: number; + localSymlinks: number; + needBytes: number; + needDeletes: number; + needDirectories: number; + needFiles: number; + needSymlinks: number; + pullErrors: number; + receiveOnlyChangedBytes: number; + receiveOnlyChangedDeletes: number; + receiveOnlyChangedDirectories: number; + receiveOnlyChangedFiles: number; + receiveOnlyChangedSymlinks: number; + sequence: number; + state: string; + stateChanged: string; + version: number; } \ No newline at end of file From 81c539c516e7ba1f5f5909aa07057b40cf3a6f9d Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 17 Mar 2020 22:37:11 -0400 Subject: [PATCH 026/120] new folder service --- src/app/folder.service.spec.ts | 16 ++++++++++++ src/app/folder.service.ts | 45 ++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/app/folder.service.spec.ts create mode 100644 src/app/folder.service.ts diff --git a/src/app/folder.service.spec.ts b/src/app/folder.service.spec.ts new file mode 100644 index 000000000..591addf71 --- /dev/null +++ b/src/app/folder.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { FolderService } from './folder.service'; + +describe('FolderService', () => { + let service: FolderService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(FolderService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/folder.service.ts b/src/app/folder.service.ts new file mode 100644 index 000000000..da4f5c2c7 --- /dev/null +++ b/src/app/folder.service.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@angular/core'; +import { SystemConfigService } from './system-config.service'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { Folder } from './folder'; +import { DbStatusService } from './db-status.service'; + +@Injectable({ + providedIn: 'root' +}) +export class FolderService { + + constructor( + private systemConfigService: SystemConfigService, + private dbStatusService: DbStatusService + ) { } + + /** + * getAll() finds all folders and uses db status service to + * set all their statuses + */ + getAll(): Observable { + const dbs = this.dbStatusService; + const folderObservable: Observable = new Observable((observer) => { + this.systemConfigService.getFolders().subscribe({ + next(folders) { + let folder: Folder; + for (folder of folders) { + // Get the status of each folder + dbs.getFolderStatus(folder.id).subscribe( + status => { + console.log(status) + folder["status"] = status; + + observer.next(folder); + } + ); + } + }, + error(err) { console.log("getAll error!", err) } + }); + }); + return folderObservable + } +} From 206c0d0933b30ce466998dce956cd375f9d2d192 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 17 Mar 2020 22:37:39 -0400 Subject: [PATCH 027/120] Work on db status service --- src/app/db-status.service.ts | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/app/db-status.service.ts b/src/app/db-status.service.ts index 5e8e05769..4c9e99797 100644 --- a/src/app/db-status.service.ts +++ b/src/app/db-status.service.ts @@ -1,31 +1,42 @@ import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { CookieService } from './cookie.service'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; +import { Observable, of } from 'rxjs'; +import { map, retry, catchError } from 'rxjs/operators'; import { environment } from '../environments/environment' -import { apiURL } from './api-utils' +import { apiURL, apiRetry } from './api-utils' +import { FolderStatus, Folder } from './folder' @Injectable({ providedIn: 'root' }) export class DbStatusService { - private httpOptions: any; + private folderStatus: Object = {}; + + // TODO why isn't this working? + private httpOptions: { headers: HttpHeaders } | { params: HttpParams }; private dbStatusUrl = environment.production ? apiURL + 'rest/db/status' : 'api/dbStatus'; constructor(private http: HttpClient, private cookieService: CookieService) { this.httpOptions = { headers: new HttpHeaders(this.cookieService.getCSRFHeader()) }; } - getFolderStatus(id: string): Observable { + getFolderStatus(id: string): Observable { + /* + if (id) { + this.httpOptions["params"] = new HttpParams().set('folder', id); + } + */ + return this.http - .get(this.dbStatusUrl, this.httpOptions) - .pipe(map(res => { - // TODO update folder in system-config service - return res; - }) + .get(this.dbStatusUrl, this.httpOptions) + .pipe( + retry(apiRetry), + map(res => { + return res; + }) ); } -} +} \ No newline at end of file From 90ed7aa12176f4a1d9e06ab33a3de340db41ec2a Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 17 Mar 2020 22:38:33 -0400 Subject: [PATCH 028/120] add apiRetry to api-utils --- src/app/api-utils.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/api-utils.ts b/src/app/api-utils.ts index 19d6d0675..cf37ad807 100644 --- a/src/app/api-utils.ts +++ b/src/app/api-utils.ts @@ -5,4 +5,6 @@ export const deviceID = (): String => { return dID.substring(0, 5) } -export const apiURL: String = 'http://127.0.0.1:8384/' \ No newline at end of file +export const apiURL: String = 'http://127.0.0.1:8384/' + +export const apiRetry: number = 3; \ No newline at end of file From 09d498bb8018f5d93d1e5e106255c9596d110fc9 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 17 Mar 2020 22:39:06 -0400 Subject: [PATCH 029/120] Refactor charts to use @ViewChild instead of @Input --- .../device-chart/device-chart.component.html | 2 +- .../device-chart/device-chart.component.ts | 14 +++++-- .../donut-chart/donut-chart.component.ts | 15 +++---- .../folder-chart/folder-chart.component.html | 2 +- .../folder-chart/folder-chart.component.ts | 39 +++++++++++-------- 5 files changed, 43 insertions(+), 29 deletions(-) diff --git a/src/app/chart/device-chart/device-chart.component.html b/src/app/chart/device-chart/device-chart.component.html index 49e7f814b..05e1b4422 100644 --- a/src/app/chart/device-chart/device-chart.component.html +++ b/src/app/chart/device-chart/device-chart.component.html @@ -1,6 +1,6 @@ Devices - + \ No newline at end of file diff --git a/src/app/chart/device-chart/device-chart.component.ts b/src/app/chart/device-chart/device-chart.component.ts index cf8bccac1..7f47023e3 100644 --- a/src/app/chart/device-chart/device-chart.component.ts +++ b/src/app/chart/device-chart/device-chart.component.ts @@ -1,6 +1,7 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewChild } from '@angular/core'; import { cardElevation } from '../../style'; import { SystemConfigService } from 'src/app/system-config.service'; +import { DonutChartComponent } from '../donut-chart/donut-chart.component'; @Component({ selector: 'app-device-chart', @@ -8,16 +9,21 @@ import { SystemConfigService } from 'src/app/system-config.service'; styleUrls: ['./device-chart.component.scss'] }) export class DeviceChartComponent implements OnInit { + @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; + chartID: string = 'devicesChart'; elevation: string = cardElevation; - data: number[]; constructor(private systemConfigService: SystemConfigService) { } ngOnInit(): void { + + } + + ngAfterViewInit(): void { this.systemConfigService.getDevices().subscribe( - data => { - this.data = [0, 230, 32, 40]; + devices => { + this.donutChart.data([0, 230, 32, 40]); } ); } diff --git a/src/app/chart/donut-chart/donut-chart.component.ts b/src/app/chart/donut-chart/donut-chart.component.ts index 19fa01147..fd29c4577 100644 --- a/src/app/chart/donut-chart/donut-chart.component.ts +++ b/src/app/chart/donut-chart/donut-chart.component.ts @@ -9,13 +9,6 @@ import { SystemConfigService } from 'src/app/system-config.service'; }) export class DonutChartComponent { @Input() elementID: string; - @Input() set data(val: number[]) { - if (this.chart) { - val.forEach((v) => { - this.addData(v) - }); - } - }; private canvas: any; private ctx: any; @@ -23,6 +16,14 @@ export class DonutChartComponent { constructor() { } + data(val: number[]) { + if (this.chart) { + val.forEach((v) => { + this.addData(v) + }); + } + } + addData(data: number): void { // this.chart.data.labels.push(label); this.chart.data.datasets.forEach((dataset) => { diff --git a/src/app/chart/folder-chart/folder-chart.component.html b/src/app/chart/folder-chart/folder-chart.component.html index 18f070027..a589a32aa 100644 --- a/src/app/chart/folder-chart/folder-chart.component.html +++ b/src/app/chart/folder-chart/folder-chart.component.html @@ -1,6 +1,6 @@ Folders - + \ No newline at end of file diff --git a/src/app/chart/folder-chart/folder-chart.component.ts b/src/app/chart/folder-chart/folder-chart.component.ts index cc1aedffa..33cfe3b6f 100644 --- a/src/app/chart/folder-chart/folder-chart.component.ts +++ b/src/app/chart/folder-chart/folder-chart.component.ts @@ -1,7 +1,11 @@ -import { Component, OnInit } from '@angular/core'; -import { SystemConfigService } from 'src/app/system-config.service'; +import { Component, OnInit, ViewChild } from '@angular/core'; import { Folder } from '../../folder' import { cardElevation } from '../../style' +import { FolderService } from 'src/app/folder.service'; +import { SystemConfigService } from 'src/app/system-config.service'; +import { DbStatusService } from 'src/app/db-status.service'; +import { flatMap } from 'rxjs/operators'; +import { DonutChartComponent } from '../donut-chart/donut-chart.component'; @Component({ selector: 'app-folder-chart', @@ -9,26 +13,29 @@ import { cardElevation } from '../../style' styleUrls: ['./folder-chart.component.scss'] }) export class FolderChartComponent implements OnInit { + @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; + chartID: string = 'foldersChart'; elevation: string = cardElevation; - data: number[]; - - constructor(private systemConfigService: SystemConfigService) { } + constructor( + private systemConfigService: SystemConfigService, + private folderService: FolderService, + private dbStatusService: DbStatusService + ) { } ngOnInit(): void { - // Find total number of folders - this.systemConfigService.getFolders().subscribe( - data => { - this.data = [0, 1, 32, 40]; + } + + ngAfterViewInit() { + // TODO: Find total number of folders + this.folderService.getAll().subscribe( + folder => { + + // TODO: Clear existing data + this.donutChart.data([0, 30, 32, 40]); + console.log("folder?", folder) } ); - // Sequentially look up each folder to get status - // dbStatusService } - /* - ngAfterViewInit() { - - } - */ } From c4979cf6d692371813098e77bc39629999e078b9 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 18 Mar 2020 12:23:31 -0400 Subject: [PATCH 030/120] update readme to disable syncthing upgrade --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 184df7d0b..3697cc4c0 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app w ## Production server -Run `ng build --prod --base-href /tech-ui/` and build [syncthing tech-ui branch](https://github.com/kastelo/syncthing/tree/tech-ui). Run `export STTECHUIDIR=/path/to/angular/build/; ./bin/syncthing` and navigate to `http://localhost:8384/tech-ui/`. +Run `ng build --prod --base-href /tech-ui/` and build [syncthing tech-ui branch](https://github.com/kastelo/syncthing/tree/tech-ui). Run `export STNOUPGRADE=1 STTECHUIDIR=/path/to/angular/build/; ./bin/syncthing` and navigate to `http://localhost:8384/tech-ui/`. ## Code scaffolding From 65679892b0be4a51fc48cf925608668e88b85033 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 18 Mar 2020 19:38:06 -0400 Subject: [PATCH 031/120] Don't encapsulate data for in memory services for development --- src/app/app.module.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index fac7f6fcd..933cf4631 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -56,7 +56,8 @@ import { environment } from '../environments/environment'; cookieName: 'CSRF-Token-' + deviceID(), }), environment.production ? - [] : HttpClientInMemoryWebApiModule.forRoot(InMemoryConfigDataService, { delay: 200 }), + [] : HttpClientInMemoryWebApiModule.forRoot(InMemoryConfigDataService, + { dataEncapsulation: false, delay: 200 }), ], providers: [], bootstrap: [AppComponent] From 123f4a6d9dfb7093f197c2f049c38f895d497b81 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 18 Mar 2020 19:38:16 -0400 Subject: [PATCH 032/120] Update mock data --- src/app/mock/mock-config.ts | 37 ---------------------------------- src/app/mock/mock-db-status.ts | 16 +++++++++++++-- 2 files changed, 14 insertions(+), 39 deletions(-) diff --git a/src/app/mock/mock-config.ts b/src/app/mock/mock-config.ts index 3261a97a4..b09809ec0 100644 --- a/src/app/mock/mock-config.ts +++ b/src/app/mock/mock-config.ts @@ -1,48 +1,11 @@ export const config = { "version": 15, "folders": [ - { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Bawer-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, - { "id": "Pnpqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, { "id": "Zpohq-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, { "id": "Lkmbn-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, diff --git a/src/app/mock/mock-db-status.ts b/src/app/mock/mock-db-status.ts index c321d119a..ab48048de 100644 --- a/src/app/mock/mock-db-status.ts +++ b/src/app/mock/mock-db-status.ts @@ -1,4 +1,16 @@ -export const dbStatus = { +export const dbStatus = + [ + { "folder": "GXWxf-3zgnU", "state": "active" }, + { "folder": "Tyeho-ncvqp", "state": "idle" }, + { "folder": "Ihpqp-3zgng", "state": "idle" }, + { "folder": "Abqqp-3zgnU", "state": "idle" }, + { "folder": "Bawer-3zgnU", "state": "idle" }, + { "folder": "Zpohq-3zgnU", "state": "idle" }, + { "folder": "Lkmbn-3zgnU", "state": "idle" }, + { "folder": "Poqff-3zgnU", "state": "idle" } + ] +/*[{ + "folder": "GXWxf-3zgnU", "globalBytes": 0, "globalDeleted": 0, "globalDirectories": 0, @@ -28,4 +40,4 @@ export const dbStatus = { "state": "idle", "stateChanged": "2018-08-08T07:04:57.301064781+02:00", "version": 0 -}; \ No newline at end of file +}]*/; \ No newline at end of file From dae08723793053d283a0a3d127d5e903e4fcee1b Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 18 Mar 2020 19:39:01 -0400 Subject: [PATCH 033/120] Remove Folder object from array in development only --- src/app/db-status.service.ts | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/app/db-status.service.ts b/src/app/db-status.service.ts index 4c9e99797..67481bfe5 100644 --- a/src/app/db-status.service.ts +++ b/src/app/db-status.service.ts @@ -14,27 +14,38 @@ import { FolderStatus, Folder } from './folder' }) export class DbStatusService { private folderStatus: Object = {}; - - // TODO why isn't this working? - private httpOptions: { headers: HttpHeaders } | { params: HttpParams }; + private headers: HttpHeaders; private dbStatusUrl = environment.production ? apiURL + 'rest/db/status' : 'api/dbStatus'; constructor(private http: HttpClient, private cookieService: CookieService) { - this.httpOptions = { headers: new HttpHeaders(this.cookieService.getCSRFHeader()) }; + this.headers = new HttpHeaders(this.cookieService.getCSRFHeader()) } getFolderStatus(id: string): Observable { - /* + let httpOptions: { headers: HttpHeaders } | + { headers: HttpHeaders, params: HttpParams }; if (id) { - this.httpOptions["params"] = new HttpParams().set('folder', id); + httpOptions = { + headers: this.headers, + params: new HttpParams().set('folder', id) + }; + } else { + httpOptions = { headers: this.headers }; } - */ return this.http - .get(this.dbStatusUrl, this.httpOptions) + .get(this.dbStatusUrl, httpOptions) .pipe( retry(apiRetry), map(res => { + // Remove from array in developement + // in-memory-web-api returns arrays + if (!environment.production) { + const a: any = res as any; + if (a.length > 0) { + return res[0]; + } + } return res; }) ); From 063951cffa132a714c263692fdc16efbd8e691a4 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 18 Mar 2020 19:39:25 -0400 Subject: [PATCH 034/120] Synchronously get the status of each folder --- .../donut-chart/donut-chart.component.ts | 2 - .../folder-chart/folder-chart.component.ts | 6 +-- src/app/folder.service.ts | 38 ++++++++++++++++--- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/app/chart/donut-chart/donut-chart.component.ts b/src/app/chart/donut-chart/donut-chart.component.ts index fd29c4577..5555ea7e8 100644 --- a/src/app/chart/donut-chart/donut-chart.component.ts +++ b/src/app/chart/donut-chart/donut-chart.component.ts @@ -1,6 +1,5 @@ import { Component, Input } from '@angular/core'; import { Chart } from 'chart.js' -import { SystemConfigService } from 'src/app/system-config.service'; @Component({ selector: 'app-donut-chart', @@ -32,7 +31,6 @@ export class DonutChartComponent { this.chart.update(); } - ngAfterViewInit(): void { this.canvas = document.getElementById(this.elementID); this.ctx = this.canvas.getContext('2d'); diff --git a/src/app/chart/folder-chart/folder-chart.component.ts b/src/app/chart/folder-chart/folder-chart.component.ts index 33cfe3b6f..a0df360c6 100644 --- a/src/app/chart/folder-chart/folder-chart.component.ts +++ b/src/app/chart/folder-chart/folder-chart.component.ts @@ -14,9 +14,9 @@ import { DonutChartComponent } from '../donut-chart/donut-chart.component'; }) export class FolderChartComponent implements OnInit { @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; - chartID: string = 'foldersChart'; elevation: string = cardElevation; + constructor( private systemConfigService: SystemConfigService, private folderService: FolderService, @@ -30,9 +30,9 @@ export class FolderChartComponent implements OnInit { // TODO: Find total number of folders this.folderService.getAll().subscribe( folder => { - // TODO: Clear existing data - this.donutChart.data([0, 30, 32, 40]); + this.donutChart.data([40]); + console.log("folder?", folder) } ); diff --git a/src/app/folder.service.ts b/src/app/folder.service.ts index da4f5c2c7..f6650e3d2 100644 --- a/src/app/folder.service.ts +++ b/src/app/folder.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { SystemConfigService } from './system-config.service'; -import { Observable } from 'rxjs'; +import { Observable, Subscriber } from 'rxjs'; import { map } from 'rxjs/operators'; import { Folder } from './folder'; import { DbStatusService } from './db-status.service'; @@ -9,33 +9,58 @@ import { DbStatusService } from './db-status.service'; providedIn: 'root' }) export class FolderService { + private folders: Folder[]; constructor( private systemConfigService: SystemConfigService, private dbStatusService: DbStatusService ) { } + getFolderStatusInOrder(observer: Subscriber, startIndex: number) { + // Return if there aren't any folders at the index + if (startIndex >= (this.folders.length - 1)) { + return + } + + const folder: Folder = this.folders[startIndex]; + startIndex = startIndex + 1; + this.dbStatusService.getFolderStatus(folder.id).subscribe( + status => { + folder["status"] = status; + observer.next(folder); + + // recursively get the status of the next folder + this.getFolderStatusInOrder(observer, startIndex); + } + ); + } + /** * getAll() finds all folders and uses db status service to * set all their statuses */ getAll(): Observable { - const dbs = this.dbStatusService; + const _this = this; const folderObservable: Observable = new Observable((observer) => { this.systemConfigService.getFolders().subscribe({ next(folders) { - let folder: Folder; - for (folder of folders) { + _this.folders = folders; + + // Synchronously get the status of each folder + _this.getFolderStatusInOrder(observer, 0); + + /* + for (let folder of folders) { // Get the status of each folder dbs.getFolderStatus(folder.id).subscribe( status => { - console.log(status) folder["status"] = status; - + observer.next(folder); } ); } + */ }, error(err) { console.log("getAll error!", err) } }); @@ -43,3 +68,4 @@ export class FolderService { return folderObservable } } + From e0d9542bfeda985228b9e5ee480ab407bbf604ce Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 19 Mar 2020 15:17:38 -0400 Subject: [PATCH 035/120] update status list template and add flex box --- src/app/list/device-list/device-list.component.ts | 4 ++-- src/app/list/folder-list/folder-list.component.ts | 4 ++-- src/app/list/status-list/status-list.component.html | 13 ++++++++++--- src/app/list/status-list/status-list.component.ts | 6 ++++-- src/app/style.ts | 3 ++- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/app/list/device-list/device-list.component.ts b/src/app/list/device-list/device-list.component.ts index c5aef0f37..63e971f5e 100644 --- a/src/app/list/device-list/device-list.component.ts +++ b/src/app/list/device-list/device-list.component.ts @@ -6,7 +6,7 @@ import { MatTable } from '@angular/material/table'; import { DeviceListDataSource } from './device-list-datasource'; import { Device } from '../../device'; import { SystemConfigService } from '../../system-config.service'; -import { cardElevation } from '../../style'; +import { dataTableElevation } from '../../style'; import { Subject } from 'rxjs'; @@ -20,7 +20,7 @@ export class DeviceListComponent implements AfterViewInit, OnInit { @ViewChild(MatSort) sort: MatSort; @ViewChild(MatTable) table: MatTable; dataSource: DeviceListDataSource; - elevation: string = cardElevation; + elevation: string = dataTableElevation; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['id', 'name']; diff --git a/src/app/list/folder-list/folder-list.component.ts b/src/app/list/folder-list/folder-list.component.ts index 0fe1a3939..1a360d03c 100644 --- a/src/app/list/folder-list/folder-list.component.ts +++ b/src/app/list/folder-list/folder-list.component.ts @@ -6,7 +6,7 @@ import { MatTable } from '@angular/material/table'; import { FolderListDataSource } from './folder-list-datasource'; import { Folder } from '../../folder'; import { SystemConfigService } from '../../system-config.service'; -import { cardElevation } from '../../style'; +import { dataTableElevation } from '../../style'; import { Subject } from 'rxjs'; @Component({ @@ -19,7 +19,7 @@ export class FolderListComponent implements AfterViewInit, OnInit { @ViewChild(MatSort) sort: MatSort; @ViewChild(MatTable) table: MatTable; dataSource: FolderListDataSource; - elevation: string = cardElevation; + elevation: string = dataTableElevation; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['id', 'label']; diff --git a/src/app/list/status-list/status-list.component.html b/src/app/list/status-list/status-list.component.html index 698342b0b..478293d42 100644 --- a/src/app/list/status-list/status-list.component.html +++ b/src/app/list/status-list/status-list.component.html @@ -1,3 +1,10 @@ - - - \ No newline at end of file + +
+ Status + +
+ + + + +
\ No newline at end of file diff --git a/src/app/list/status-list/status-list.component.ts b/src/app/list/status-list/status-list.component.ts index 6869b8533..7f5a8a6cf 100644 --- a/src/app/list/status-list/status-list.component.ts +++ b/src/app/list/status-list/status-list.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { Status } from '../../status'; +import { cardElevation } from '../../style'; @Component({ @@ -8,8 +9,9 @@ import { Status } from '../../status'; styleUrls: ['./status-list.component.scss'] }) export class StatusListComponent implements OnInit { - public currentStatus: Status = Status.Folders; - public status = Status; + currentStatus: Status = Status.Folders; + status = Status; // used in html + elevation: string = cardElevation; constructor() { } diff --git a/src/app/style.ts b/src/app/style.ts index 1bf2f3660..67db8a077 100644 --- a/src/app/style.ts +++ b/src/app/style.ts @@ -1,2 +1,3 @@ // material design elevation for all dashboard components -export const cardElevation: string = "mat-elevation-z2"; \ No newline at end of file +export const cardElevation: string = "mat-elevation-z2"; +export const dataTableElevation: string = "mat-elevation-z0"; \ No newline at end of file From 230eb20a34f3434fde7e88e71f4a2e6a63909b6e Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 19 Mar 2020 15:43:31 -0400 Subject: [PATCH 036/120] update font styles --- src/styles.scss | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/styles.scss b/src/styles.scss index 7f8d3bdaf..638ff235e 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,19 +1,39 @@ - // Custom Theming for Angular Material // For more information: https://material.angular.io/guide/theming @import '~@angular/material/theming'; // Plus imports for other components in your app. + +// Custom typography +$tech-ui-typography: mat-typography-config( + $font-family: '"Courier New", Courier, monospace', + $display-4: mat-typography-level(112px, 112px, 300), + $display-3: mat-typography-level(56px, 56px, 400), + $display-2: mat-typography-level(45px, 48px, 400), + $display-1: mat-typography-level(34px, 40px, 400), + $headline: mat-typography-level(24px, 32px, 400), + $title: mat-typography-level(20px, 32px, 500), + $subheading-2: mat-typography-level(16px, 28px, 400), + $subheading-1: mat-typography-level(15px, 24px, 400), + $body-2: mat-typography-level(14px, 24px, 500), + $body-1: mat-typography-level(14px, 20px, 400), + $caption: mat-typography-level(12px, 20px, 400), + $button: mat-typography-level(14px, 14px, 500), + // Line-height must be unit-less fraction of the font-size. + $input: mat-typography-level(16px, 1.25, 400) +); + // Include the common styles for Angular Material. We include this here so that you only // have to load a single css file for Angular Material in your app. // Be sure that you only ever include this mixin once! -@include mat-core(); +@include mat-core($tech-ui-typography); + // Define the palettes for your theme using the Material Design palettes available in palette.scss // (imported above). For each palette, you can optionally specify a default, lighter, and darker // hue. Available color palettes: https://material.io/design/color/ $tech-ui-primary: mat-palette($mat-indigo); -$tech-ui-accent: mat-palette($mat-pink, A200, A100, A400); +$tech-ui-accent: mat-palette($mat-blue, A200, A100, A400); // The warn palette is optional (defaults to red). $tech-ui-warn: mat-palette($mat-red); @@ -27,6 +47,13 @@ $tech-ui-theme: mat-light-theme($tech-ui-primary, $tech-ui-accent, $tech-ui-warn @include angular-material-theme($tech-ui-theme); /* 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; } +html, body { + height: 100%; + background-color: #eeeeee; + font-size: mat-font-size($tech-ui-typography, body-1); + font-family: mat-font-family($tech-ui-typography); + line-height: mat-line-height($tech-ui-typography, body-1); +} +.mat-card-title { + font-size: mat-font-size($tech-ui-typography, subheading-2) +} \ No newline at end of file From 92075625457ba2f1ac2380e2b89e23c65159acbf Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 19 Mar 2020 18:05:04 -0400 Subject: [PATCH 037/120] refactor status toggle to list toggle --- .../list-toggle/list-toggle.component.html | 4 +++ .../list-toggle.component.scss} | 0 .../list-toggle/list-toggle.component.spec.ts | 25 +++++++++++++++ src/app/list-toggle/list-toggle.component.ts | 31 +++++++++++++++++++ src/app/{status.ts => list-type.ts} | 2 +- .../status-list/status-list.component.html | 6 ++-- .../list/status-list/status-list.component.ts | 10 +++--- .../status-toggle.component.html | 4 --- .../status-toggle.component.spec.ts | 25 --------------- .../status-toggle/status-toggle.component.ts | 31 ------------------- 10 files changed, 69 insertions(+), 69 deletions(-) create mode 100644 src/app/list-toggle/list-toggle.component.html rename src/app/{status-toggle/status-toggle.component.scss => list-toggle/list-toggle.component.scss} (100%) create mode 100644 src/app/list-toggle/list-toggle.component.spec.ts create mode 100644 src/app/list-toggle/list-toggle.component.ts rename src/app/{status.ts => list-type.ts} (57%) delete mode 100644 src/app/status-toggle/status-toggle.component.html delete mode 100644 src/app/status-toggle/status-toggle.component.spec.ts delete mode 100644 src/app/status-toggle/status-toggle.component.ts diff --git a/src/app/list-toggle/list-toggle.component.html b/src/app/list-toggle/list-toggle.component.html new file mode 100644 index 000000000..16b2bec0d --- /dev/null +++ b/src/app/list-toggle/list-toggle.component.html @@ -0,0 +1,4 @@ + + Folders + Devices + \ No newline at end of file diff --git a/src/app/status-toggle/status-toggle.component.scss b/src/app/list-toggle/list-toggle.component.scss similarity index 100% rename from src/app/status-toggle/status-toggle.component.scss rename to src/app/list-toggle/list-toggle.component.scss diff --git a/src/app/list-toggle/list-toggle.component.spec.ts b/src/app/list-toggle/list-toggle.component.spec.ts new file mode 100644 index 000000000..77e0653dc --- /dev/null +++ b/src/app/list-toggle/list-toggle.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ListToggleComponent } from './list-toggle.component'; + +describe('ListToggleComponent', () => { + let component: ListToggleComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ListToggleComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ListToggleComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/list-toggle/list-toggle.component.ts b/src/app/list-toggle/list-toggle.component.ts new file mode 100644 index 000000000..db5d523f3 --- /dev/null +++ b/src/app/list-toggle/list-toggle.component.ts @@ -0,0 +1,31 @@ +import { Component, EventEmitter, OnInit, Output } from '@angular/core'; +import { ListType } from '../list-type'; + + + +@Component({ + selector: 'app-list-toggle', + templateUrl: './list-toggle.component.html', + styleUrls: ['./list-toggle.component.scss'] +}) + +export class ListToggleComponent implements OnInit { + public listType = ListType; + @Output() listTypeEvent = new EventEmitter(); + + constructor() { } + ngOnInit(): void { + } + + onSelect(t: ListType): void { + this.listTypeEvent.emit(t); + switch (t) { + case ListType.Folders: + console.log("folder action"); + break; + case ListType.Devices: + console.log("Device action"); + break; + } + } +} \ No newline at end of file diff --git a/src/app/status.ts b/src/app/list-type.ts similarity index 57% rename from src/app/status.ts rename to src/app/list-type.ts index 872798394..9aa953a9c 100644 --- a/src/app/status.ts +++ b/src/app/list-type.ts @@ -1,4 +1,4 @@ -export enum Status { +export enum ListType { Folders = 1, Devices, } \ No newline at end of file diff --git a/src/app/list/status-list/status-list.component.html b/src/app/list/status-list/status-list.component.html index 478293d42..0ac37624e 100644 --- a/src/app/list/status-list/status-list.component.html +++ b/src/app/list/status-list/status-list.component.html @@ -1,10 +1,10 @@
Status - +
- - + +
\ No newline at end of file diff --git a/src/app/list/status-list/status-list.component.ts b/src/app/list/status-list/status-list.component.ts index 7f5a8a6cf..de2f2dfba 100644 --- a/src/app/list/status-list/status-list.component.ts +++ b/src/app/list/status-list/status-list.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { Status } from '../../status'; +import { ListType } from '../../list-type'; import { cardElevation } from '../../style'; @@ -9,8 +9,8 @@ import { cardElevation } from '../../style'; styleUrls: ['./status-list.component.scss'] }) export class StatusListComponent implements OnInit { - currentStatus: Status = Status.Folders; - status = Status; // used in html + currentListType: ListType = ListType.Folders; + listType = ListType; // used in html elevation: string = cardElevation; constructor() { } @@ -18,7 +18,7 @@ export class StatusListComponent implements OnInit { ngOnInit(): void { } - onToggle(s: Status) { - this.currentStatus = s; + onToggle(t: ListType) { + this.currentListType = t; } } diff --git a/src/app/status-toggle/status-toggle.component.html b/src/app/status-toggle/status-toggle.component.html deleted file mode 100644 index 58b10e4fc..000000000 --- a/src/app/status-toggle/status-toggle.component.html +++ /dev/null @@ -1,4 +0,0 @@ - - Folders - Devices - \ No newline at end of file diff --git a/src/app/status-toggle/status-toggle.component.spec.ts b/src/app/status-toggle/status-toggle.component.spec.ts deleted file mode 100644 index 329733ba3..000000000 --- a/src/app/status-toggle/status-toggle.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { StatusToggleComponent } from './status-toggle.component'; - -describe('StatusToggleComponent', () => { - let component: StatusToggleComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ StatusToggleComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(StatusToggleComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/status-toggle/status-toggle.component.ts b/src/app/status-toggle/status-toggle.component.ts deleted file mode 100644 index 6557ad626..000000000 --- a/src/app/status-toggle/status-toggle.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Component, EventEmitter, OnInit, Output } from '@angular/core'; -import { Status } from '../status'; - - - -@Component({ - selector: 'app-status-toggle', - templateUrl: './status-toggle.component.html', - styleUrls: ['./status-toggle.component.scss'] -}) - -export class StatusToggleComponent implements OnInit { - public status = Status - @Output() statusEvent = new EventEmitter(); - - constructor() { } - ngOnInit(): void { - } - - onSelect(s: Status): void { - this.statusEvent.emit(s); - switch (s) { - case Status.Folders: - console.log("folder action"); - break; - case Status.Devices: - console.log("Device action"); - break; - } - } -} \ No newline at end of file From fb33a8ad6bd579acc8a7d56393282bb6251d0ebc Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 19 Mar 2020 18:59:53 -0400 Subject: [PATCH 038/120] Remove unused tags in index.html --- src/index.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/index.html b/src/index.html index df34f6890..86438a1d6 100644 --- a/src/index.html +++ b/src/index.html @@ -7,8 +7,6 @@ - - From b0ebf56283206d7a6db70577e421b143f9b75fd4 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 19 Mar 2020 19:00:28 -0400 Subject: [PATCH 039/120] Add new component chart-item --- src/app/app.module.ts | 6 +++-- .../chart-item/chart-item.component.html | 4 +++ .../chart-item/chart-item.component.scss | 0 .../chart-item/chart-item.component.spec.ts | 25 +++++++++++++++++++ .../chart/chart-item/chart-item.component.ts | 15 +++++++++++ 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/app/chart/chart-item/chart-item.component.html create mode 100644 src/app/chart/chart-item/chart-item.component.scss create mode 100644 src/app/chart/chart-item/chart-item.component.spec.ts create mode 100644 src/app/chart/chart-item/chart-item.component.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 933cf4631..9044d6a2c 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -20,13 +20,14 @@ import { DonutChartComponent } from './chart/donut-chart/donut-chart.component'; import { DeviceChartComponent } from './chart/device-chart/device-chart.component'; import { FolderChartComponent } from './chart/folder-chart/folder-chart.component'; import { DashboardComponent } from './dashboard/dashboard.component'; -import { StatusToggleComponent } from './status-toggle/status-toggle.component'; +import { ListToggleComponent } from './list-toggle/list-toggle.component'; import { HttpClientInMemoryWebApiModule } from 'angular-in-memory-web-api'; import { InMemoryConfigDataService } from './in-memory-config-data.service'; import { deviceID } from './api-utils'; import { environment } from '../environments/environment'; +import { ChartItemComponent } from './chart/chart-item/chart-item.component'; @NgModule({ declarations: [ @@ -34,11 +35,12 @@ import { environment } from '../environments/environment'; StatusListComponent, FolderListComponent, DeviceListComponent, - StatusToggleComponent, + ListToggleComponent, DashboardComponent, DonutChartComponent, DeviceChartComponent, FolderChartComponent, + ChartItemComponent, ], imports: [ BrowserModule, diff --git a/src/app/chart/chart-item/chart-item.component.html b/src/app/chart/chart-item/chart-item.component.html new file mode 100644 index 000000000..c99580cce --- /dev/null +++ b/src/app/chart/chart-item/chart-item.component.html @@ -0,0 +1,4 @@ +
+
color
+
{{state}}
+
\ No newline at end of file diff --git a/src/app/chart/chart-item/chart-item.component.scss b/src/app/chart/chart-item/chart-item.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/chart/chart-item/chart-item.component.spec.ts b/src/app/chart/chart-item/chart-item.component.spec.ts new file mode 100644 index 000000000..75363d385 --- /dev/null +++ b/src/app/chart/chart-item/chart-item.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChartItemComponent } from './chart-item.component'; + +describe('ChartItemComponent', () => { + let component: ChartItemComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ChartItemComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ChartItemComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/chart/chart-item/chart-item.component.ts b/src/app/chart/chart-item/chart-item.component.ts new file mode 100644 index 000000000..5c5aabc10 --- /dev/null +++ b/src/app/chart/chart-item/chart-item.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-chart-item', + templateUrl: './chart-item.component.html', + styleUrls: ['./chart-item.component.scss'] +}) +export class ChartItemComponent implements OnInit { + state: string = "test" + constructor() { } + + ngOnInit(): void { + } + +} From c27fe5694d79a2ff5e87dc020a2b38befe21304f Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 19 Mar 2020 19:01:03 -0400 Subject: [PATCH 040/120] Update mock data --- src/app/mock/mock-db-status.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/mock/mock-db-status.ts b/src/app/mock/mock-db-status.ts index ab48048de..0779bbe42 100644 --- a/src/app/mock/mock-db-status.ts +++ b/src/app/mock/mock-db-status.ts @@ -2,7 +2,7 @@ export const dbStatus = [ { "folder": "GXWxf-3zgnU", "state": "active" }, { "folder": "Tyeho-ncvqp", "state": "idle" }, - { "folder": "Ihpqp-3zgng", "state": "idle" }, + { "folder": "Ihpqp-3zgnq", "state": "idle" }, { "folder": "Abqqp-3zgnU", "state": "idle" }, { "folder": "Bawer-3zgnU", "state": "idle" }, { "folder": "Zpohq-3zgnU", "state": "idle" }, From 32c849e18c862ffcecf0dba00f03982ea5131994 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 19 Mar 2020 19:01:45 -0400 Subject: [PATCH 041/120] Refactor Folder interface to use Folder namespace --- .../folder-chart/folder-chart.component.ts | 9 +- src/app/db-status.service.ts | 8 +- src/app/folder.service.ts | 28 +--- src/app/folder.ts | 124 +++++++++++++----- .../folder-list/folder-list-datasource.ts | 2 +- .../list/folder-list/folder-list.component.ts | 2 +- src/app/system-config.service.ts | 2 +- 7 files changed, 112 insertions(+), 63 deletions(-) diff --git a/src/app/chart/folder-chart/folder-chart.component.ts b/src/app/chart/folder-chart/folder-chart.component.ts index a0df360c6..e102eab06 100644 --- a/src/app/chart/folder-chart/folder-chart.component.ts +++ b/src/app/chart/folder-chart/folder-chart.component.ts @@ -1,10 +1,9 @@ import { Component, OnInit, ViewChild } from '@angular/core'; -import { Folder } from '../../folder' +import Folder from '../../folder' import { cardElevation } from '../../style' import { FolderService } from 'src/app/folder.service'; import { SystemConfigService } from 'src/app/system-config.service'; import { DbStatusService } from 'src/app/db-status.service'; -import { flatMap } from 'rxjs/operators'; import { DonutChartComponent } from '../donut-chart/donut-chart.component'; @Component({ @@ -16,6 +15,7 @@ export class FolderChartComponent implements OnInit { @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; chartID: string = 'foldersChart'; elevation: string = cardElevation; + folderStates: Folder.stateType[]; constructor( private systemConfigService: SystemConfigService, @@ -24,6 +24,7 @@ export class FolderChartComponent implements OnInit { ) { } ngOnInit(): void { + // } ngAfterViewInit() { @@ -33,7 +34,9 @@ export class FolderChartComponent implements OnInit { // TODO: Clear existing data this.donutChart.data([40]); - console.log("folder?", folder) + // state? + const state: string = Folder.statusToString(folder); + console.log("folder state?", state, folder); } ); diff --git a/src/app/db-status.service.ts b/src/app/db-status.service.ts index 67481bfe5..11da2e7f6 100644 --- a/src/app/db-status.service.ts +++ b/src/app/db-status.service.ts @@ -7,7 +7,7 @@ import { map, retry, catchError } from 'rxjs/operators'; import { environment } from '../environments/environment' import { apiURL, apiRetry } from './api-utils' -import { FolderStatus, Folder } from './folder' +import Folder from './folder' @Injectable({ providedIn: 'root' @@ -21,7 +21,7 @@ export class DbStatusService { this.headers = new HttpHeaders(this.cookieService.getCSRFHeader()) } - getFolderStatus(id: string): Observable { + getFolderStatus(id: string): Observable { let httpOptions: { headers: HttpHeaders } | { headers: HttpHeaders, params: HttpParams }; if (id) { @@ -34,17 +34,19 @@ export class DbStatusService { } return this.http - .get(this.dbStatusUrl, httpOptions) + .get(this.dbStatusUrl, httpOptions) .pipe( retry(apiRetry), map(res => { // Remove from array in developement // in-memory-web-api returns arrays if (!environment.production) { + console.log("status res!", res); const a: any = res as any; if (a.length > 0) { return res[0]; } + return {}; } return res; }) diff --git a/src/app/folder.service.ts b/src/app/folder.service.ts index f6650e3d2..3c16be317 100644 --- a/src/app/folder.service.ts +++ b/src/app/folder.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { SystemConfigService } from './system-config.service'; import { Observable, Subscriber } from 'rxjs'; import { map } from 'rxjs/operators'; -import { Folder } from './folder'; +import Folder from './folder'; import { DbStatusService } from './db-status.service'; @Injectable({ @@ -40,30 +40,16 @@ export class FolderService { * set all their statuses */ getAll(): Observable { - const _this = this; const folderObservable: Observable = new Observable((observer) => { - this.systemConfigService.getFolders().subscribe({ - next(folders) { - _this.folders = folders; + this.systemConfigService.getFolders().subscribe( + folders => { + this.folders = folders; // Synchronously get the status of each folder - _this.getFolderStatusInOrder(observer, 0); - - /* - for (let folder of folders) { - // Get the status of each folder - dbs.getFolderStatus(folder.id).subscribe( - status => { - folder["status"] = status; - - observer.next(folder); - } - ); - } - */ + this.getFolderStatusInOrder(observer, 0); }, - error(err) { console.log("getAll error!", err) } - }); + err => { console.log("getAll error!", err) } + ); }); return folderObservable } diff --git a/src/app/folder.ts b/src/app/folder.ts index 4d56e7944..150a05e55 100644 --- a/src/app/folder.ts +++ b/src/app/folder.ts @@ -1,37 +1,95 @@ -export interface Folder { +import { Device } from './device'; + +interface Folder { id: string; label: string; - status: FolderStatus; + devices: Device[]; + status: Folder.Status; + paused: boolean; } -export interface FolderStatus { - globalBytes: number; - globalDeleted: number; - globalDirectories: number; - globalFiles: number; - globalSymlinks: number; - ignorePatterns: boolean; - inSyncBytes: number; - inSyncFiles: number; - invalid: string; - localBytes: number; - localDeleted: number; - localDirectories: number; - localFiles: number; - localSymlinks: number; - needBytes: number; - needDeletes: number; - needDirectories: number; - needFiles: number; - needSymlinks: number; - pullErrors: number; - receiveOnlyChangedBytes: number; - receiveOnlyChangedDeletes: number; - receiveOnlyChangedDirectories: number; - receiveOnlyChangedFiles: number; - receiveOnlyChangedSymlinks: number; - sequence: number; - state: string; - stateChanged: string; - version: number; -} \ No newline at end of file +namespace Folder { + export enum stateType { + } + + export function statusToString(f: Folder): string { + const fs: Folder.Status = f.status; + const state: string = fs.state; + + if (f.paused) { + return 'paused'; + } + + if (!f.status || (Object.keys(f.status).length === 0)) { + return 'unknown'; + } + + if (state === 'error') { + return 'stopped'; // legacy, the state is called "stopped" in the GUI + } + + if (state !== 'idle') { + return state; + } + + const needTotalItems = fs.needDeletes + fs.needDirectories + + fs.needFiles + fs.needSymlinks; + const receiveOnlyTotalItems = fs.receiveOnlyChangedDeletes + fs.receiveOnlyChangedDirectories + + fs.receiveOnlyChangedFiles + fs.receiveOnlyChangedSymlinks; + + if (needTotalItems > 0) { + return 'outofsync'; + } + if (f.status.pullErrors > 0) { + return 'faileditems'; + } + if (receiveOnlyTotalItems > 0) { + return 'localadditions'; + } + if (f.devices.length <= 1) { + return 'unshared'; + } + + return state; + } + + export interface Status { + globalBytes: number; + globalDeleted: number; + globalDirectories: number; + globalFiles: number; + globalSymlinks: number; + ignorePatterns: boolean; + inSyncBytes: number; + inSyncFiles: number; + invalid: string; + localBytes: number; + localDeleted: number; + localDirectories: number; + localFiles: number; + localSymlinks: number; + needBytes: number; + needDeletes: number; + needDirectories: number; + needFiles: number; + needSymlinks: number; + pullErrors: number; + receiveOnlyChangedBytes: number; + receiveOnlyChangedDeletes: number; + receiveOnlyChangedDirectories: number; + receiveOnlyChangedFiles: number; + receiveOnlyChangedSymlinks: number; + sequence: number; + state: string; + stateChanged: string; + version: number; + } +} + +export default Folder; + + + + + + diff --git a/src/app/list/folder-list/folder-list-datasource.ts b/src/app/list/folder-list/folder-list-datasource.ts index 1ffd7e043..1a3da4be4 100644 --- a/src/app/list/folder-list/folder-list-datasource.ts +++ b/src/app/list/folder-list/folder-list-datasource.ts @@ -4,7 +4,7 @@ import { MatSort } from '@angular/material/sort'; import { map } from 'rxjs/operators'; import { Observable, of as observableOf, merge, Subject } from 'rxjs'; -import { Folder } from '../../folder'; +import Folder from '../../folder'; import { SystemConfigService } from '../../system-config.service'; /** diff --git a/src/app/list/folder-list/folder-list.component.ts b/src/app/list/folder-list/folder-list.component.ts index 1a360d03c..7e0c344e5 100644 --- a/src/app/list/folder-list/folder-list.component.ts +++ b/src/app/list/folder-list/folder-list.component.ts @@ -4,7 +4,7 @@ import { MatSort } from '@angular/material/sort'; import { MatTable } from '@angular/material/table'; import { FolderListDataSource } from './folder-list-datasource'; -import { Folder } from '../../folder'; +import Folder from '../../folder'; import { SystemConfigService } from '../../system-config.service'; import { dataTableElevation } from '../../style'; import { Subject } from 'rxjs'; diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index 0cc98d80f..bf6305fd8 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -4,7 +4,7 @@ import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Observable, Subject } from 'rxjs'; import { map, retry } from 'rxjs/operators'; -import { Folder } from './folder'; +import Folder from './folder'; import { Device } from './device'; import { CookieService } from './cookie.service'; import { environment } from '../environments/environment' From 02d14c7e9b11ca59ea5ef9c6b8d3cdb8602a6c5c Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 19 Mar 2020 20:12:58 -0400 Subject: [PATCH 042/120] Add chart item component, StateType and getStateType to determine state from Folder --- .../chart-item/chart-item.component.html | 2 +- .../folder-chart/folder-chart.component.html | 9 +- .../folder-chart/folder-chart.component.ts | 18 ++- src/app/folder.ts | 105 +++++++++++++++--- 4 files changed, 105 insertions(+), 29 deletions(-) diff --git a/src/app/chart/chart-item/chart-item.component.html b/src/app/chart/chart-item/chart-item.component.html index c99580cce..5e286db10 100644 --- a/src/app/chart/chart-item/chart-item.component.html +++ b/src/app/chart/chart-item/chart-item.component.html @@ -1,4 +1,4 @@
-
color
+
{{state}}
\ No newline at end of file diff --git a/src/app/chart/folder-chart/folder-chart.component.html b/src/app/chart/folder-chart/folder-chart.component.html index a589a32aa..967d8de06 100644 --- a/src/app/chart/folder-chart/folder-chart.component.html +++ b/src/app/chart/folder-chart/folder-chart.component.html @@ -1,6 +1,13 @@ Folders - +
+ +
+ + + +
+
\ No newline at end of file diff --git a/src/app/chart/folder-chart/folder-chart.component.ts b/src/app/chart/folder-chart/folder-chart.component.ts index e102eab06..f77006ec6 100644 --- a/src/app/chart/folder-chart/folder-chart.component.ts +++ b/src/app/chart/folder-chart/folder-chart.component.ts @@ -2,8 +2,6 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import Folder from '../../folder' import { cardElevation } from '../../style' import { FolderService } from 'src/app/folder.service'; -import { SystemConfigService } from 'src/app/system-config.service'; -import { DbStatusService } from 'src/app/db-status.service'; import { DonutChartComponent } from '../donut-chart/donut-chart.component'; @Component({ @@ -15,16 +13,13 @@ export class FolderChartComponent implements OnInit { @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; chartID: string = 'foldersChart'; elevation: string = cardElevation; - folderStates: Folder.stateType[]; - constructor( - private systemConfigService: SystemConfigService, - private folderService: FolderService, - private dbStatusService: DbStatusService - ) { } + constructor(private folderService: FolderService) { } ngOnInit(): void { - // + for (let state in Folder.StateType) { + console.log(state); + } } ngAfterViewInit() { @@ -34,8 +29,9 @@ export class FolderChartComponent implements OnInit { // TODO: Clear existing data this.donutChart.data([40]); - // state? - const state: string = Folder.statusToString(folder); + // Get StateType and convert to string + const stateType: Folder.StateType = Folder.getStateType(folder); + const state: string = Folder.stateTypeToString(stateType); console.log("folder state?", state, folder); } ); diff --git a/src/app/folder.ts b/src/app/folder.ts index 150a05e55..1971d4cf8 100644 --- a/src/app/folder.ts +++ b/src/app/folder.ts @@ -9,27 +9,99 @@ interface Folder { } namespace Folder { - export enum stateType { + export enum StateType { + Paused = 1, + Unknown, + Unshared, + WaitingToScan, + Stopped, + Scanning, + Idle, + LocalAdditions, + WaitingToSync, + PreparingToSync, + Syncing, + OutOfSync, + FailedItems, } - export function statusToString(f: Folder): string { - const fs: Folder.Status = f.status; - const state: string = fs.state; + /** + * stateTypeToString returns a string representation of + * the StateType enum + * @param s StateType + */ + export function stateTypeToString(s: StateType): string { + switch (s) { + case StateType.Paused: + return 'Paused'; + case StateType.Unknown: + return 'Unknown'; + case StateType.Unshared: + return 'Unshared'; + case StateType.WaitingToSync: + return 'Waiting to Sync'; + case StateType.Stopped: + return 'Stopped'; + case StateType.Scanning: + return 'Scanning'; + case StateType.Idle: + return 'Up to Date'; + case StateType.LocalAdditions: + return 'Local Additions'; + case StateType.WaitingToScan: + return 'Waiting to Scan'; + case StateType.PreparingToSync: + return 'Preparing to Sync'; + case StateType.Syncing: + return 'Syncing'; + case StateType.OutOfSync: + return 'Out of Sync'; + case StateType.FailedItems: + return 'Failed Items'; + } + } + /** + * getStatusType looks at a folder and determines the correct + * StateType to return + * + * Possible state values from API + * "idle", "scanning", "scan-waiting", "sync-waiting", "sync-preparing" + * "syncing", "error", "unknown" + * + * @param f Folder + */ + export function getStateType(f: Folder): StateType { if (f.paused) { - return 'paused'; + return StateType.Paused; } if (!f.status || (Object.keys(f.status).length === 0)) { - return 'unknown'; + return StateType.Unknown; } - if (state === 'error') { - return 'stopped'; // legacy, the state is called "stopped" in the GUI - } + const fs: Folder.Status = f.status; + const state: string = fs.state; - if (state !== 'idle') { - return state; + // Match API string to StateType + switch (state) { + case "idle": + return StateType.Idle; + case "scanning": + return StateType.Scanning; + case "scan-waiting": + return StateType.WaitingToScan; + case "sync-waiting": + return StateType.WaitingToSync; + case "sync-preparing": + return StateType.PreparingToSync; + case "syncing": + return StateType.Syncing; + case "error": + // legacy, the state is called "stopped" in the gui + return StateType.Stopped; + case "unknown": + return StateType.Unknown; } const needTotalItems = fs.needDeletes + fs.needDirectories + @@ -38,21 +110,22 @@ namespace Folder { fs.receiveOnlyChangedFiles + fs.receiveOnlyChangedSymlinks; if (needTotalItems > 0) { - return 'outofsync'; + return StateType.OutOfSync; } if (f.status.pullErrors > 0) { - return 'faileditems'; + return StateType.FailedItems; } if (receiveOnlyTotalItems > 0) { - return 'localadditions'; + return StateType.LocalAdditions; } if (f.devices.length <= 1) { - return 'unshared'; + return StateType.Unshared; } - return state; + return StateType.Unknown; } + export interface Status { globalBytes: number; globalDeleted: number; From 7a657bf3c798b9dca1f5018b1d20bac1e34efd8f Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 20 Mar 2020 12:32:10 -0400 Subject: [PATCH 043/120] Create states map and set chart-items based on map --- src/app/chart/chart-item/chart-item.component.html | 3 ++- src/app/chart/chart-item/chart-item.component.ts | 5 +++-- .../chart/folder-chart/folder-chart.component.html | 7 +++---- .../chart/folder-chart/folder-chart.component.ts | 13 +++++++++++-- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/app/chart/chart-item/chart-item.component.html b/src/app/chart/chart-item/chart-item.component.html index 5e286db10..ecd881fa1 100644 --- a/src/app/chart/chart-item/chart-item.component.html +++ b/src/app/chart/chart-item/chart-item.component.html @@ -1,4 +1,5 @@
-
{{state}}
+
{{state}}:  
+
{{count}}
\ No newline at end of file diff --git a/src/app/chart/chart-item/chart-item.component.ts b/src/app/chart/chart-item/chart-item.component.ts index 5c5aabc10..601ba8626 100644 --- a/src/app/chart/chart-item/chart-item.component.ts +++ b/src/app/chart/chart-item/chart-item.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, Input } from '@angular/core'; @Component({ selector: 'app-chart-item', @@ -6,7 +6,8 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./chart-item.component.scss'] }) export class ChartItemComponent implements OnInit { - state: string = "test" + @Input() state: string; + @Input() count: number; constructor() { } ngOnInit(): void { diff --git a/src/app/chart/folder-chart/folder-chart.component.html b/src/app/chart/folder-chart/folder-chart.component.html index 967d8de06..286280c98 100644 --- a/src/app/chart/folder-chart/folder-chart.component.html +++ b/src/app/chart/folder-chart/folder-chart.component.html @@ -3,10 +3,9 @@
-
- - - +
+ +
diff --git a/src/app/chart/folder-chart/folder-chart.component.ts b/src/app/chart/folder-chart/folder-chart.component.ts index f77006ec6..3b3689d0c 100644 --- a/src/app/chart/folder-chart/folder-chart.component.ts +++ b/src/app/chart/folder-chart/folder-chart.component.ts @@ -12,9 +12,12 @@ import { DonutChartComponent } from '../donut-chart/donut-chart.component'; export class FolderChartComponent implements OnInit { @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; chartID: string = 'foldersChart'; + states: Map; elevation: string = cardElevation; - constructor(private folderService: FolderService) { } + constructor(private folderService: FolderService) { + this.states = new Map(); + } ngOnInit(): void { for (let state in Folder.StateType) { @@ -32,7 +35,13 @@ export class FolderChartComponent implements OnInit { // Get StateType and convert to string const stateType: Folder.StateType = Folder.getStateType(folder); const state: string = Folder.stateTypeToString(stateType); - console.log("folder state?", state, folder); + + // Instantiate empty count states + if (!this.states.has(state)) { + this.states.set(state, 0); + } + const count: number = this.states.get(state) + 1; + this.states.set(state, count); } ); From 03c6fb2f82cfb01eefcc30c469290d3d25acc5ea Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 20 Mar 2020 16:16:18 -0400 Subject: [PATCH 044/120] Rename folders --- src/app/app.module.ts | 14 +++--- .../device-chart/device-chart.component.html | 6 --- .../device-chart/device-chart.component.ts | 30 ------------ .../chart-item/chart-item.component.html | 0 .../chart-item/chart-item.component.scss | 0 .../chart-item/chart-item.component.spec.ts | 0 .../chart-item/chart-item.component.ts | 0 .../device-chart/device-chart.component.html | 12 +++++ .../device-chart/device-chart.component.scss | 0 .../device-chart.component.spec.ts | 0 .../device-chart/device-chart.component.ts | 46 +++++++++++++++++++ .../donut-chart/donut-chart.component.html | 0 .../donut-chart/donut-chart.component.scss | 0 .../donut-chart/donut-chart.component.spec.ts | 0 .../donut-chart/donut-chart.component.ts | 0 .../folder-chart/folder-chart.component.html | 0 .../folder-chart/folder-chart.component.scss | 0 .../folder-chart.component.spec.ts | 0 .../folder-chart/folder-chart.component.ts | 2 - .../device-list/device-list-datasource.ts | 0 .../device-list/device-list.component.html | 0 .../device-list/device-list.component.scss | 0 .../device-list/device-list.component.spec.ts | 0 .../device-list/device-list.component.ts | 0 .../folder-list/folder-list-datasource.ts | 0 .../folder-list/folder-list.component.html | 0 .../folder-list/folder-list.component.scss | 0 .../folder-list/folder-list.component.spec.ts | 0 .../folder-list/folder-list.component.ts | 0 .../status-list/status-list.component.html | 0 .../status-list/status-list.component.scss | 0 .../status-list/status-list.component.spec.ts | 0 .../status-list/status-list.component.ts | 0 src/app/{mock => mocks}/mock-config.ts | 0 src/app/{mock => mocks}/mock-db-status.ts | 0 35 files changed, 65 insertions(+), 45 deletions(-) delete mode 100644 src/app/chart/device-chart/device-chart.component.html delete mode 100644 src/app/chart/device-chart/device-chart.component.ts rename src/app/{chart => charts}/chart-item/chart-item.component.html (100%) rename src/app/{chart => charts}/chart-item/chart-item.component.scss (100%) rename src/app/{chart => charts}/chart-item/chart-item.component.spec.ts (100%) rename src/app/{chart => charts}/chart-item/chart-item.component.ts (100%) create mode 100644 src/app/charts/device-chart/device-chart.component.html rename src/app/{chart => charts}/device-chart/device-chart.component.scss (100%) rename src/app/{chart => charts}/device-chart/device-chart.component.spec.ts (100%) create mode 100644 src/app/charts/device-chart/device-chart.component.ts rename src/app/{chart => charts}/donut-chart/donut-chart.component.html (100%) rename src/app/{chart => charts}/donut-chart/donut-chart.component.scss (100%) rename src/app/{chart => charts}/donut-chart/donut-chart.component.spec.ts (100%) rename src/app/{chart => charts}/donut-chart/donut-chart.component.ts (100%) rename src/app/{chart => charts}/folder-chart/folder-chart.component.html (100%) rename src/app/{chart => charts}/folder-chart/folder-chart.component.scss (100%) rename src/app/{chart => charts}/folder-chart/folder-chart.component.spec.ts (100%) rename src/app/{chart => charts}/folder-chart/folder-chart.component.ts (97%) rename src/app/{list => lists}/device-list/device-list-datasource.ts (100%) rename src/app/{list => lists}/device-list/device-list.component.html (100%) rename src/app/{list => lists}/device-list/device-list.component.scss (100%) rename src/app/{list => lists}/device-list/device-list.component.spec.ts (100%) rename src/app/{list => lists}/device-list/device-list.component.ts (100%) rename src/app/{list => lists}/folder-list/folder-list-datasource.ts (100%) rename src/app/{list => lists}/folder-list/folder-list.component.html (100%) rename src/app/{list => lists}/folder-list/folder-list.component.scss (100%) rename src/app/{list => lists}/folder-list/folder-list.component.spec.ts (100%) rename src/app/{list => lists}/folder-list/folder-list.component.ts (100%) rename src/app/{list => lists}/status-list/status-list.component.html (100%) rename src/app/{list => lists}/status-list/status-list.component.scss (100%) rename src/app/{list => lists}/status-list/status-list.component.spec.ts (100%) rename src/app/{list => lists}/status-list/status-list.component.ts (100%) rename src/app/{mock => mocks}/mock-config.ts (100%) rename src/app/{mock => mocks}/mock-db-status.ts (100%) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 9044d6a2c..4428ad605 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -13,12 +13,12 @@ import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { StatusListComponent } from './list/status-list/status-list.component'; -import { FolderListComponent } from './list/folder-list/folder-list.component'; -import { DeviceListComponent } from './list/device-list/device-list.component'; -import { DonutChartComponent } from './chart/donut-chart/donut-chart.component'; -import { DeviceChartComponent } from './chart/device-chart/device-chart.component'; -import { FolderChartComponent } from './chart/folder-chart/folder-chart.component'; +import { StatusListComponent } from './lists/status-list/status-list.component'; +import { FolderListComponent } from './lists/folder-list/folder-list.component'; +import { DeviceListComponent } from './lists/device-list/device-list.component'; +import { DonutChartComponent } from './charts/donut-chart/donut-chart.component'; +import { DeviceChartComponent } from './charts/device-chart/device-chart.component'; +import { FolderChartComponent } from './charts/folder-chart/folder-chart.component'; import { DashboardComponent } from './dashboard/dashboard.component'; import { ListToggleComponent } from './list-toggle/list-toggle.component'; @@ -27,7 +27,7 @@ import { InMemoryConfigDataService } from './in-memory-config-data.service'; import { deviceID } from './api-utils'; import { environment } from '../environments/environment'; -import { ChartItemComponent } from './chart/chart-item/chart-item.component'; +import { ChartItemComponent } from './charts/chart-item/chart-item.component'; @NgModule({ declarations: [ diff --git a/src/app/chart/device-chart/device-chart.component.html b/src/app/chart/device-chart/device-chart.component.html deleted file mode 100644 index 05e1b4422..000000000 --- a/src/app/chart/device-chart/device-chart.component.html +++ /dev/null @@ -1,6 +0,0 @@ - - Devices - - - - \ No newline at end of file diff --git a/src/app/chart/device-chart/device-chart.component.ts b/src/app/chart/device-chart/device-chart.component.ts deleted file mode 100644 index 7f47023e3..000000000 --- a/src/app/chart/device-chart/device-chart.component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { cardElevation } from '../../style'; -import { SystemConfigService } from 'src/app/system-config.service'; -import { DonutChartComponent } from '../donut-chart/donut-chart.component'; - -@Component({ - selector: 'app-device-chart', - templateUrl: './device-chart.component.html', - styleUrls: ['./device-chart.component.scss'] -}) -export class DeviceChartComponent implements OnInit { - @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; - - chartID: string = 'devicesChart'; - elevation: string = cardElevation; - - constructor(private systemConfigService: SystemConfigService) { } - - ngOnInit(): void { - - } - - ngAfterViewInit(): void { - this.systemConfigService.getDevices().subscribe( - devices => { - this.donutChart.data([0, 230, 32, 40]); - } - ); - } -} diff --git a/src/app/chart/chart-item/chart-item.component.html b/src/app/charts/chart-item/chart-item.component.html similarity index 100% rename from src/app/chart/chart-item/chart-item.component.html rename to src/app/charts/chart-item/chart-item.component.html diff --git a/src/app/chart/chart-item/chart-item.component.scss b/src/app/charts/chart-item/chart-item.component.scss similarity index 100% rename from src/app/chart/chart-item/chart-item.component.scss rename to src/app/charts/chart-item/chart-item.component.scss diff --git a/src/app/chart/chart-item/chart-item.component.spec.ts b/src/app/charts/chart-item/chart-item.component.spec.ts similarity index 100% rename from src/app/chart/chart-item/chart-item.component.spec.ts rename to src/app/charts/chart-item/chart-item.component.spec.ts diff --git a/src/app/chart/chart-item/chart-item.component.ts b/src/app/charts/chart-item/chart-item.component.ts similarity index 100% rename from src/app/chart/chart-item/chart-item.component.ts rename to src/app/charts/chart-item/chart-item.component.ts diff --git a/src/app/charts/device-chart/device-chart.component.html b/src/app/charts/device-chart/device-chart.component.html new file mode 100644 index 000000000..077cf3e01 --- /dev/null +++ b/src/app/charts/device-chart/device-chart.component.html @@ -0,0 +1,12 @@ + + Devices + +
+ +
+ + +
+
+
+
\ No newline at end of file diff --git a/src/app/chart/device-chart/device-chart.component.scss b/src/app/charts/device-chart/device-chart.component.scss similarity index 100% rename from src/app/chart/device-chart/device-chart.component.scss rename to src/app/charts/device-chart/device-chart.component.scss diff --git a/src/app/chart/device-chart/device-chart.component.spec.ts b/src/app/charts/device-chart/device-chart.component.spec.ts similarity index 100% rename from src/app/chart/device-chart/device-chart.component.spec.ts rename to src/app/charts/device-chart/device-chart.component.spec.ts diff --git a/src/app/charts/device-chart/device-chart.component.ts b/src/app/charts/device-chart/device-chart.component.ts new file mode 100644 index 000000000..2bd4644a6 --- /dev/null +++ b/src/app/charts/device-chart/device-chart.component.ts @@ -0,0 +1,46 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { cardElevation } from '../../style'; +import { DonutChartComponent } from '../donut-chart/donut-chart.component'; +import Folder from '../../folder' +import { FolderService } from 'src/app/folder.service'; + +@Component({ + selector: 'app-device-chart', + templateUrl: './device-chart.component.html', + styleUrls: ['./device-chart.component.scss'] +}) +export class DeviceChartComponent implements OnInit { + @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; + chartID: string = 'devicesChart'; + elevation: string = cardElevation; + states: Map; + + constructor(private folderService: FolderService) { + this.states = new Map(); + } + + ngOnInit(): void { + + } + + ngAfterViewInit(): void { + // TODO switch to deviceService + this.folderService.getAll().subscribe( + folder => { + // TODO: Clear existing data + this.donutChart.data([10]); + + // Get StateType and convert to string + const stateType: Folder.StateType = Folder.getStateType(folder); + const state: string = Folder.stateTypeToString(stateType); + + // Instantiate empty count states + if (!this.states.has(state)) { + this.states.set(state, 0); + } + const count: number = this.states.get(state) + 1; + this.states.set(state, count); + } + ); + } +} diff --git a/src/app/chart/donut-chart/donut-chart.component.html b/src/app/charts/donut-chart/donut-chart.component.html similarity index 100% rename from src/app/chart/donut-chart/donut-chart.component.html rename to src/app/charts/donut-chart/donut-chart.component.html diff --git a/src/app/chart/donut-chart/donut-chart.component.scss b/src/app/charts/donut-chart/donut-chart.component.scss similarity index 100% rename from src/app/chart/donut-chart/donut-chart.component.scss rename to src/app/charts/donut-chart/donut-chart.component.scss diff --git a/src/app/chart/donut-chart/donut-chart.component.spec.ts b/src/app/charts/donut-chart/donut-chart.component.spec.ts similarity index 100% rename from src/app/chart/donut-chart/donut-chart.component.spec.ts rename to src/app/charts/donut-chart/donut-chart.component.spec.ts diff --git a/src/app/chart/donut-chart/donut-chart.component.ts b/src/app/charts/donut-chart/donut-chart.component.ts similarity index 100% rename from src/app/chart/donut-chart/donut-chart.component.ts rename to src/app/charts/donut-chart/donut-chart.component.ts diff --git a/src/app/chart/folder-chart/folder-chart.component.html b/src/app/charts/folder-chart/folder-chart.component.html similarity index 100% rename from src/app/chart/folder-chart/folder-chart.component.html rename to src/app/charts/folder-chart/folder-chart.component.html diff --git a/src/app/chart/folder-chart/folder-chart.component.scss b/src/app/charts/folder-chart/folder-chart.component.scss similarity index 100% rename from src/app/chart/folder-chart/folder-chart.component.scss rename to src/app/charts/folder-chart/folder-chart.component.scss diff --git a/src/app/chart/folder-chart/folder-chart.component.spec.ts b/src/app/charts/folder-chart/folder-chart.component.spec.ts similarity index 100% rename from src/app/chart/folder-chart/folder-chart.component.spec.ts rename to src/app/charts/folder-chart/folder-chart.component.spec.ts diff --git a/src/app/chart/folder-chart/folder-chart.component.ts b/src/app/charts/folder-chart/folder-chart.component.ts similarity index 97% rename from src/app/chart/folder-chart/folder-chart.component.ts rename to src/app/charts/folder-chart/folder-chart.component.ts index 3b3689d0c..0b2079970 100644 --- a/src/app/chart/folder-chart/folder-chart.component.ts +++ b/src/app/charts/folder-chart/folder-chart.component.ts @@ -26,7 +26,6 @@ export class FolderChartComponent implements OnInit { } ngAfterViewInit() { - // TODO: Find total number of folders this.folderService.getAll().subscribe( folder => { // TODO: Clear existing data @@ -44,6 +43,5 @@ export class FolderChartComponent implements OnInit { this.states.set(state, count); } ); - } } diff --git a/src/app/list/device-list/device-list-datasource.ts b/src/app/lists/device-list/device-list-datasource.ts similarity index 100% rename from src/app/list/device-list/device-list-datasource.ts rename to src/app/lists/device-list/device-list-datasource.ts diff --git a/src/app/list/device-list/device-list.component.html b/src/app/lists/device-list/device-list.component.html similarity index 100% rename from src/app/list/device-list/device-list.component.html rename to src/app/lists/device-list/device-list.component.html diff --git a/src/app/list/device-list/device-list.component.scss b/src/app/lists/device-list/device-list.component.scss similarity index 100% rename from src/app/list/device-list/device-list.component.scss rename to src/app/lists/device-list/device-list.component.scss diff --git a/src/app/list/device-list/device-list.component.spec.ts b/src/app/lists/device-list/device-list.component.spec.ts similarity index 100% rename from src/app/list/device-list/device-list.component.spec.ts rename to src/app/lists/device-list/device-list.component.spec.ts diff --git a/src/app/list/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts similarity index 100% rename from src/app/list/device-list/device-list.component.ts rename to src/app/lists/device-list/device-list.component.ts diff --git a/src/app/list/folder-list/folder-list-datasource.ts b/src/app/lists/folder-list/folder-list-datasource.ts similarity index 100% rename from src/app/list/folder-list/folder-list-datasource.ts rename to src/app/lists/folder-list/folder-list-datasource.ts diff --git a/src/app/list/folder-list/folder-list.component.html b/src/app/lists/folder-list/folder-list.component.html similarity index 100% rename from src/app/list/folder-list/folder-list.component.html rename to src/app/lists/folder-list/folder-list.component.html diff --git a/src/app/list/folder-list/folder-list.component.scss b/src/app/lists/folder-list/folder-list.component.scss similarity index 100% rename from src/app/list/folder-list/folder-list.component.scss rename to src/app/lists/folder-list/folder-list.component.scss diff --git a/src/app/list/folder-list/folder-list.component.spec.ts b/src/app/lists/folder-list/folder-list.component.spec.ts similarity index 100% rename from src/app/list/folder-list/folder-list.component.spec.ts rename to src/app/lists/folder-list/folder-list.component.spec.ts diff --git a/src/app/list/folder-list/folder-list.component.ts b/src/app/lists/folder-list/folder-list.component.ts similarity index 100% rename from src/app/list/folder-list/folder-list.component.ts rename to src/app/lists/folder-list/folder-list.component.ts diff --git a/src/app/list/status-list/status-list.component.html b/src/app/lists/status-list/status-list.component.html similarity index 100% rename from src/app/list/status-list/status-list.component.html rename to src/app/lists/status-list/status-list.component.html diff --git a/src/app/list/status-list/status-list.component.scss b/src/app/lists/status-list/status-list.component.scss similarity index 100% rename from src/app/list/status-list/status-list.component.scss rename to src/app/lists/status-list/status-list.component.scss diff --git a/src/app/list/status-list/status-list.component.spec.ts b/src/app/lists/status-list/status-list.component.spec.ts similarity index 100% rename from src/app/list/status-list/status-list.component.spec.ts rename to src/app/lists/status-list/status-list.component.spec.ts diff --git a/src/app/list/status-list/status-list.component.ts b/src/app/lists/status-list/status-list.component.ts similarity index 100% rename from src/app/list/status-list/status-list.component.ts rename to src/app/lists/status-list/status-list.component.ts diff --git a/src/app/mock/mock-config.ts b/src/app/mocks/mock-config.ts similarity index 100% rename from src/app/mock/mock-config.ts rename to src/app/mocks/mock-config.ts diff --git a/src/app/mock/mock-db-status.ts b/src/app/mocks/mock-db-status.ts similarity index 100% rename from src/app/mock/mock-db-status.ts rename to src/app/mocks/mock-db-status.ts From 05f01a5d94d24df6767bc6be81b99349511b4347 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 20 Mar 2020 19:44:21 -0400 Subject: [PATCH 045/120] start of caching, csrf interceptor, and device service --- src/app/app.module.ts | 4 ++- .../folder-chart/folder-chart.component.ts | 2 +- src/app/cookie.service.ts | 9 ------ src/app/db-status.service.ts | 24 +++++++-------- src/app/device.service.spec.ts | 16 ++++++++++ src/app/device.service.ts | 9 ++++++ src/app/folder.service.ts | 6 ++-- src/app/http-interceptors/csrf-intercepor.ts | 29 +++++++++++++++++++ src/app/http-interceptors/index.ts | 8 +++++ src/app/in-memory-config-data.service.ts | 4 +-- src/app/system-config.service.ts | 7 ++--- 11 files changed, 85 insertions(+), 33 deletions(-) create mode 100644 src/app/device.service.spec.ts create mode 100644 src/app/device.service.ts create mode 100644 src/app/http-interceptors/csrf-intercepor.ts create mode 100644 src/app/http-interceptors/index.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 4428ad605..8a454f47a 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -9,6 +9,7 @@ import { MatButtonToggleModule } from '@angular/material/button-toggle'; import { MatCardModule } from '@angular/material/card'; import { FlexLayoutModule } from '@angular/flex-layout'; +import { httpInterceptorProviders } from './http-interceptors'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; @@ -28,6 +29,7 @@ import { InMemoryConfigDataService } from './in-memory-config-data.service'; import { deviceID } from './api-utils'; import { environment } from '../environments/environment'; import { ChartItemComponent } from './charts/chart-item/chart-item.component'; +import { CSRFInterceptor } from './http-interceptors/csrf-intercepor'; @NgModule({ declarations: [ @@ -61,7 +63,7 @@ import { ChartItemComponent } from './charts/chart-item/chart-item.component'; [] : HttpClientInMemoryWebApiModule.forRoot(InMemoryConfigDataService, { dataEncapsulation: false, delay: 200 }), ], - providers: [], + providers: [httpInterceptorProviders], bootstrap: [AppComponent] }) diff --git a/src/app/charts/folder-chart/folder-chart.component.ts b/src/app/charts/folder-chart/folder-chart.component.ts index 0b2079970..8261b1c67 100644 --- a/src/app/charts/folder-chart/folder-chart.component.ts +++ b/src/app/charts/folder-chart/folder-chart.component.ts @@ -21,7 +21,7 @@ export class FolderChartComponent implements OnInit { ngOnInit(): void { for (let state in Folder.StateType) { - console.log(state); + // console.log(state); } } diff --git a/src/app/cookie.service.ts b/src/app/cookie.service.ts index a3bb17f3a..f6d3cf467 100644 --- a/src/app/cookie.service.ts +++ b/src/app/cookie.service.ts @@ -1,5 +1,4 @@ import { Injectable } from '@angular/core'; -import { deviceID } from './api-utils'; @Injectable({ providedIn: 'root' @@ -8,14 +7,6 @@ export class CookieService { constructor() { } - getCSRFHeader(): any { - const dID: String = deviceID(); - const csrfCookie = 'CSRF-Token-' + dID - const csrfHeader = {}; - csrfHeader['X-CSRF-Token-' + dID] = this.getCookie(csrfCookie); - return csrfHeader; - } - getCookie(name: string): string { let ca: Array = document.cookie.split(';'); let caLen: number = ca.length; diff --git a/src/app/db-status.service.ts b/src/app/db-status.service.ts index 11da2e7f6..4b7474b37 100644 --- a/src/app/db-status.service.ts +++ b/src/app/db-status.service.ts @@ -13,25 +13,25 @@ import Folder from './folder' providedIn: 'root' }) export class DbStatusService { - private folderStatus: Object = {}; - private headers: HttpHeaders; private dbStatusUrl = environment.production ? apiURL + 'rest/db/status' : 'api/dbStatus'; + private statuses: Map; constructor(private http: HttpClient, private cookieService: CookieService) { - this.headers = new HttpHeaders(this.cookieService.getCSRFHeader()) + this.statuses = new Map(); } getFolderStatus(id: string): Observable { - let httpOptions: { headers: HttpHeaders } | - { headers: HttpHeaders, params: HttpParams }; + // First check to see if we have a cached value + if (this.statuses.has(id)) { + return of(this.statuses.get(id)); + } + + let httpOptions: { params: HttpParams }; if (id) { httpOptions = { - headers: this.headers, params: new HttpParams().set('folder', id) }; - } else { - httpOptions = { headers: this.headers }; - } + } else { } return this.http .get(this.dbStatusUrl, httpOptions) @@ -41,13 +41,13 @@ export class DbStatusService { // Remove from array in developement // in-memory-web-api returns arrays if (!environment.production) { - console.log("status res!", res); const a: any = res as any; if (a.length > 0) { - return res[0]; + res = res[0]; } - return {}; } + // cache result + this.statuses.set(id, res) return res; }) ); diff --git a/src/app/device.service.spec.ts b/src/app/device.service.spec.ts new file mode 100644 index 000000000..d55f5fb7d --- /dev/null +++ b/src/app/device.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { DeviceService } from './device.service'; + +describe('DeviceService', () => { + let service: DeviceService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(DeviceService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/device.service.ts b/src/app/device.service.ts new file mode 100644 index 000000000..204dbb6f5 --- /dev/null +++ b/src/app/device.service.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class DeviceService { + + constructor() { } +} diff --git a/src/app/folder.service.ts b/src/app/folder.service.ts index 3c16be317..72508c380 100644 --- a/src/app/folder.service.ts +++ b/src/app/folder.service.ts @@ -26,7 +26,7 @@ export class FolderService { startIndex = startIndex + 1; this.dbStatusService.getFolderStatus(folder.id).subscribe( status => { - folder["status"] = status; + folder.status = status; observer.next(folder); // recursively get the status of the next folder @@ -41,6 +41,7 @@ export class FolderService { */ getAll(): Observable { const folderObservable: Observable = new Observable((observer) => { + this.systemConfigService.getFolders().subscribe( folders => { this.folders = folders; @@ -53,5 +54,4 @@ export class FolderService { }); return folderObservable } -} - +} \ No newline at end of file diff --git a/src/app/http-interceptors/csrf-intercepor.ts b/src/app/http-interceptors/csrf-intercepor.ts new file mode 100644 index 000000000..a76cb0146 --- /dev/null +++ b/src/app/http-interceptors/csrf-intercepor.ts @@ -0,0 +1,29 @@ +import { Injectable } from '@angular/core'; +import { deviceID } from '../api-utils'; +import { + HttpInterceptor, HttpHandler, HttpRequest, HttpHeaders +} from '@angular/common/http'; + +import { CookieService } from '../cookie.service'; + + +@Injectable() +export class CSRFInterceptor implements HttpInterceptor { + + constructor(private cookieService: CookieService) { } + + intercept(req: HttpRequest, next: HttpHandler) { + const dID: String = deviceID(); + const csrfCookie = 'CSRF-Token-' + dID + + // Clone the request and replace the original headers with + // cloned headers, updated with the CSRF information. + const csrfReq = req.clone({ + headers: req.headers.set('X-CSRF-Token-' + dID, + this.cookieService.getCookie(csrfCookie)) + }); + + // send cloned request with header to the next handler. + return next.handle(csrfReq); + } +} \ No newline at end of file diff --git a/src/app/http-interceptors/index.ts b/src/app/http-interceptors/index.ts new file mode 100644 index 000000000..3056fbff4 --- /dev/null +++ b/src/app/http-interceptors/index.ts @@ -0,0 +1,8 @@ +/* "Barrel" of Http Interceptors */ +import { HTTP_INTERCEPTORS } from '@angular/common/http'; +import { CSRFInterceptor } from './csrf-intercepor'; + +/** Http interceptor providers in outside-in order */ +export const httpInterceptorProviders = [ + { provide: HTTP_INTERCEPTORS, useClass: CSRFInterceptor, multi: true }, +]; \ No newline at end of file diff --git a/src/app/in-memory-config-data.service.ts b/src/app/in-memory-config-data.service.ts index 29c3d58bd..eba1f726f 100644 --- a/src/app/in-memory-config-data.service.ts +++ b/src/app/in-memory-config-data.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; -import { config } from './mock/mock-config' -import { dbStatus } from './mock/mock-db-status' +import { config } from './mocks/mock-config' +import { dbStatus } from './mocks/mock-db-status' @Injectable({ providedIn: 'root' diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index bf6305fd8..de5435010 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -20,17 +20,14 @@ export class SystemConfigService { private devicesSubject: Subject = new Subject(); private systemConfigUrl = environment.production ? apiURL + 'rest/system/config' : 'api/config'; - private httpOptions: any; private checkInterval: number = 100; - constructor(private http: HttpClient, private cookieService: CookieService) { - this.httpOptions = { headers: new HttpHeaders(this.cookieService.getCSRFHeader()) }; - } + constructor(private http: HttpClient) { } getSystemConfig(): Observable { return this.http - .get(this.systemConfigUrl, this.httpOptions) + .get(this.systemConfigUrl) .pipe( retry(apiRetry), map(res => { From 7d59dc6c181f176e4b3525e135613d616fc73cfd Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 24 Mar 2020 13:16:22 -0400 Subject: [PATCH 046/120] add updateData and removeAllData methods to donut chart --- .../donut-chart/donut-chart.component.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/app/charts/donut-chart/donut-chart.component.ts b/src/app/charts/donut-chart/donut-chart.component.ts index 5555ea7e8..e75adf556 100644 --- a/src/app/charts/donut-chart/donut-chart.component.ts +++ b/src/app/charts/donut-chart/donut-chart.component.ts @@ -1,5 +1,6 @@ import { Component, Input } from '@angular/core'; import { Chart } from 'chart.js' +import { LabelOptions } from '@angular/material/core'; @Component({ selector: 'app-donut-chart', @@ -23,6 +24,16 @@ export class DonutChartComponent { } } + updateData(data: { label: string, count: number }[]): void { + //Using object destructuring + for (let i = 0; i < data.length; i++) { + let s = data[i]; + this.chart.data.labels[i] = s.label; + this.chart.data.datasets[0].data[i] = s.count; + } + this.chart.update(); + } + addData(data: number): void { // this.chart.data.labels.push(label); this.chart.data.datasets.forEach((dataset) => { @@ -31,6 +42,14 @@ export class DonutChartComponent { this.chart.update(); } + removeAllData(withAnimation: boolean): void { + this.chart.data.labels.pop(); + this.chart.data.datasets.forEach((dataset) => { + dataset.data = []; + }); + this.chart.update(withAnimation); + } + ngAfterViewInit(): void { this.canvas = document.getElementById(this.elementID); this.ctx = this.canvas.getContext('2d'); From 598dc991e8c497c7806b72ed93ef0a63927241da Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 24 Mar 2020 13:17:32 -0400 Subject: [PATCH 047/120] complete observers --- src/app/folder.service.ts | 7 ++++--- src/app/system-config.service.ts | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/app/folder.service.ts b/src/app/folder.service.ts index 72508c380..e9ee24dce 100644 --- a/src/app/folder.service.ts +++ b/src/app/folder.service.ts @@ -19,7 +19,8 @@ export class FolderService { getFolderStatusInOrder(observer: Subscriber, startIndex: number) { // Return if there aren't any folders at the index if (startIndex >= (this.folders.length - 1)) { - return + observer.complete(); + return; } const folder: Folder = this.folders[startIndex]; @@ -41,7 +42,6 @@ export class FolderService { */ getAll(): Observable { const folderObservable: Observable = new Observable((observer) => { - this.systemConfigService.getFolders().subscribe( folders => { this.folders = folders; @@ -49,7 +49,8 @@ export class FolderService { // Synchronously get the status of each folder this.getFolderStatusInOrder(observer, 0); }, - err => { console.log("getAll error!", err) } + err => { console.log("getAll error!", err) }, + () => { console.log("get all complete!") } ); }); return folderObservable diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index de5435010..8a9dd57d8 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -45,12 +45,14 @@ export class SystemConfigService { const folderObservable: Observable = new Observable((observer) => { if (this.folders) { observer.next(this.folders); + observer.complete(); } else { // create timer to keep checking for folders let t = setInterval(() => { if (this.folders) { clearInterval(t); - observer.next(this.folders); + observer.next(this.folders) + observer.complete(); } }, this.checkInterval); } From f342a2a54b8404c57dd613cd9eda57b3195ae3fa Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 24 Mar 2020 13:18:01 -0400 Subject: [PATCH 048/120] refactor to use array of objects to map state data to chart update --- .../folder-chart/folder-chart.component.html | 2 +- .../folder-chart/folder-chart.component.ts | 31 ++++++++++++------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/app/charts/folder-chart/folder-chart.component.html b/src/app/charts/folder-chart/folder-chart.component.html index 286280c98..dd0c0dcd7 100644 --- a/src/app/charts/folder-chart/folder-chart.component.html +++ b/src/app/charts/folder-chart/folder-chart.component.html @@ -4,7 +4,7 @@
- +
diff --git a/src/app/charts/folder-chart/folder-chart.component.ts b/src/app/charts/folder-chart/folder-chart.component.ts index 8261b1c67..98127336a 100644 --- a/src/app/charts/folder-chart/folder-chart.component.ts +++ b/src/app/charts/folder-chart/folder-chart.component.ts @@ -12,11 +12,11 @@ import { DonutChartComponent } from '../donut-chart/donut-chart.component'; export class FolderChartComponent implements OnInit { @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; chartID: string = 'foldersChart'; - states: Map; + states: { label: string, count: number }[]; elevation: string = cardElevation; constructor(private folderService: FolderService) { - this.states = new Map(); + this.states = []; } ngOnInit(): void { @@ -28,20 +28,29 @@ export class FolderChartComponent implements OnInit { ngAfterViewInit() { this.folderService.getAll().subscribe( folder => { - // TODO: Clear existing data - this.donutChart.data([40]); - // Get StateType and convert to string const stateType: Folder.StateType = Folder.getStateType(folder); const state: string = Folder.stateTypeToString(stateType); - // Instantiate empty count states - if (!this.states.has(state)) { - this.states.set(state, 0); + // Check if state exists + let found: boolean = false; + this.states.forEach(s => { + if (s.label === state) { + s.count = s.count + 1; + found = true; + console.log("increase count", s.count); + } + }); + + if (!found) { + this.states.push({ label: state, count: 1 }); } - const count: number = this.states.get(state) + 1; - this.states.set(state, count); + + this.donutChart.updateData(this.states); + }, + err => console.error('Observer got an error: ' + err), + () => { } ); } -} +} \ No newline at end of file From 15c2556e06aaf063f0da4ba0f0a1c9a9b647cadc Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 24 Mar 2020 16:45:54 -0400 Subject: [PATCH 049/120] fix conditional logic --- src/app/folder.service.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/folder.service.ts b/src/app/folder.service.ts index e9ee24dce..8259c8432 100644 --- a/src/app/folder.service.ts +++ b/src/app/folder.service.ts @@ -18,11 +18,10 @@ export class FolderService { getFolderStatusInOrder(observer: Subscriber, startIndex: number) { // Return if there aren't any folders at the index - if (startIndex >= (this.folders.length - 1)) { + if (startIndex >= (this.folders.length)) { observer.complete(); return; } - const folder: Folder = this.folders[startIndex]; startIndex = startIndex + 1; this.dbStatusService.getFolderStatus(folder.id).subscribe( From 9589f25e57ba95b9741b0b403c3c63fad38b251c Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 24 Mar 2020 19:19:54 -0400 Subject: [PATCH 050/120] refactor to use caching interceptor --- src/app/app.module.ts | 1 - .../folder-chart/folder-chart.component.ts | 1 - src/app/db-status.service.ts | 12 +--- .../caching.interceptor.spec.ts | 16 +++++ .../http-interceptors/caching.interceptor.ts | 58 +++++++++++++++++++ src/app/http-interceptors/csrf-intercepor.ts | 29 ---------- .../csrf.interceptor.spec.ts | 16 +++++ src/app/http-interceptors/csrf.interceptor.ts | 29 ++++++++++ src/app/http-interceptors/index.ts | 6 +- .../device-list/device-list.component.ts | 1 - src/app/request-cache.service.spec.ts | 16 +++++ src/app/request-cache.service.ts | 50 ++++++++++++++++ src/app/system-config.service.ts | 1 + 13 files changed, 192 insertions(+), 44 deletions(-) create mode 100644 src/app/http-interceptors/caching.interceptor.spec.ts create mode 100644 src/app/http-interceptors/caching.interceptor.ts delete mode 100644 src/app/http-interceptors/csrf-intercepor.ts create mode 100644 src/app/http-interceptors/csrf.interceptor.spec.ts create mode 100644 src/app/http-interceptors/csrf.interceptor.ts create mode 100644 src/app/request-cache.service.spec.ts create mode 100644 src/app/request-cache.service.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 8a454f47a..7ac406714 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -29,7 +29,6 @@ import { InMemoryConfigDataService } from './in-memory-config-data.service'; import { deviceID } from './api-utils'; import { environment } from '../environments/environment'; import { ChartItemComponent } from './charts/chart-item/chart-item.component'; -import { CSRFInterceptor } from './http-interceptors/csrf-intercepor'; @NgModule({ declarations: [ diff --git a/src/app/charts/folder-chart/folder-chart.component.ts b/src/app/charts/folder-chart/folder-chart.component.ts index 98127336a..039fd5170 100644 --- a/src/app/charts/folder-chart/folder-chart.component.ts +++ b/src/app/charts/folder-chart/folder-chart.component.ts @@ -38,7 +38,6 @@ export class FolderChartComponent implements OnInit { if (s.label === state) { s.count = s.count + 1; found = true; - console.log("increase count", s.count); } }); diff --git a/src/app/db-status.service.ts b/src/app/db-status.service.ts index 4b7474b37..b1e2151ce 100644 --- a/src/app/db-status.service.ts +++ b/src/app/db-status.service.ts @@ -14,18 +14,10 @@ import Folder from './folder' }) export class DbStatusService { private dbStatusUrl = environment.production ? apiURL + 'rest/db/status' : 'api/dbStatus'; - private statuses: Map; - constructor(private http: HttpClient, private cookieService: CookieService) { - this.statuses = new Map(); - } + constructor(private http: HttpClient, private cookieService: CookieService) { } getFolderStatus(id: string): Observable { - // First check to see if we have a cached value - if (this.statuses.has(id)) { - return of(this.statuses.get(id)); - } - let httpOptions: { params: HttpParams }; if (id) { httpOptions = { @@ -46,8 +38,6 @@ export class DbStatusService { res = res[0]; } } - // cache result - this.statuses.set(id, res) return res; }) ); diff --git a/src/app/http-interceptors/caching.interceptor.spec.ts b/src/app/http-interceptors/caching.interceptor.spec.ts new file mode 100644 index 000000000..ee914ec93 --- /dev/null +++ b/src/app/http-interceptors/caching.interceptor.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { CachingInterceptor } from './caching.interceptor'; + +describe('CachingInterceptor', () => { + beforeEach(() => TestBed.configureTestingModule({ + providers: [ + CachingInterceptor + ] + })); + + it('should be created', () => { + const interceptor: CachingInterceptor = TestBed.inject(CachingInterceptor); + expect(interceptor).toBeTruthy(); + }); +}); diff --git a/src/app/http-interceptors/caching.interceptor.ts b/src/app/http-interceptors/caching.interceptor.ts new file mode 100644 index 000000000..f610d6eb8 --- /dev/null +++ b/src/app/http-interceptors/caching.interceptor.ts @@ -0,0 +1,58 @@ +import { Injectable } from '@angular/core'; +import { + HttpRequest, + HttpHandler, + HttpEvent, + HttpInterceptor, + HttpHeaders, + HttpResponse +} from '@angular/common/http'; +import { Observable, of } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { RequestCacheService } from '../request-cache.service' + +@Injectable() +export class CachingInterceptor implements HttpInterceptor { + constructor(private cache: RequestCacheService) { } + + intercept(req: HttpRequest, next: HttpHandler) { + // continue if not cachable. + if (!isCachable(req)) { return next.handle(req); } + + const cachedResponse = this.cache.get(req); + return cachedResponse ? + of(cachedResponse) : sendRequest(req, next, this.cache); + } +} + +/** Is this request cachable? */ +function isCachable(req: HttpRequest) { + // Only GET requests are cachable + return req.method === 'GET'; + /* + return req.method === 'GET' && + -1 < req.url.indexOf("url"); + */ +} + +/** + * Get server response observable by sending request to `next()`. + * Will add the response to the cache on the way out. + */ +function sendRequest( + req: HttpRequest, + next: HttpHandler, + cache: RequestCacheService): Observable> { + + // No headers allowed in npm search request + const noHeaderReq = req.clone({ headers: new HttpHeaders() }); + + return next.handle(noHeaderReq).pipe( + tap(event => { + // There may be other events besides the response. + if (event instanceof HttpResponse) { + // cache.put(req, event); // Update the cache. + } + }) + ); +} \ No newline at end of file diff --git a/src/app/http-interceptors/csrf-intercepor.ts b/src/app/http-interceptors/csrf-intercepor.ts deleted file mode 100644 index a76cb0146..000000000 --- a/src/app/http-interceptors/csrf-intercepor.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Injectable } from '@angular/core'; -import { deviceID } from '../api-utils'; -import { - HttpInterceptor, HttpHandler, HttpRequest, HttpHeaders -} from '@angular/common/http'; - -import { CookieService } from '../cookie.service'; - - -@Injectable() -export class CSRFInterceptor implements HttpInterceptor { - - constructor(private cookieService: CookieService) { } - - intercept(req: HttpRequest, next: HttpHandler) { - const dID: String = deviceID(); - const csrfCookie = 'CSRF-Token-' + dID - - // Clone the request and replace the original headers with - // cloned headers, updated with the CSRF information. - const csrfReq = req.clone({ - headers: req.headers.set('X-CSRF-Token-' + dID, - this.cookieService.getCookie(csrfCookie)) - }); - - // send cloned request with header to the next handler. - return next.handle(csrfReq); - } -} \ No newline at end of file diff --git a/src/app/http-interceptors/csrf.interceptor.spec.ts b/src/app/http-interceptors/csrf.interceptor.spec.ts new file mode 100644 index 000000000..a8f998869 --- /dev/null +++ b/src/app/http-interceptors/csrf.interceptor.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { CSRFInterceptor } from './csrf.interceptor'; + +describe('CsrfInterceptor', () => { + beforeEach(() => TestBed.configureTestingModule({ + providers: [ + CSRFInterceptor + ] + })); + + it('should be created', () => { + const interceptor: CSRFInterceptor = TestBed.inject(CSRFInterceptor); + expect(interceptor).toBeTruthy(); + }); +}); diff --git a/src/app/http-interceptors/csrf.interceptor.ts b/src/app/http-interceptors/csrf.interceptor.ts new file mode 100644 index 000000000..70cc07e9e --- /dev/null +++ b/src/app/http-interceptors/csrf.interceptor.ts @@ -0,0 +1,29 @@ +import { Injectable } from '@angular/core'; +import { deviceID } from '../api-utils'; +import { + HttpInterceptor, HttpHandler, HttpRequest, HttpHeaders +} from '@angular/common/http'; + +import { CookieService } from '../cookie.service'; + + +@Injectable() +export class CSRFInterceptor implements HttpInterceptor { + + constructor(private cookieService: CookieService) { } + + intercept(req: HttpRequest, next: HttpHandler) { + const dID: String = deviceID(); + const csrfCookie = 'CSRF-Token-' + dID + + // Clone the request and replace the original headers with + // cloned headers, updated with the CSRF information. + const csrfReq = req.clone({ + headers: req.headers.set('X-CSRF-Token-' + dID, + this.cookieService.getCookie(csrfCookie)) + }); + + // send cloned request with header to the next handler. + return next.handle(csrfReq); + } +} \ No newline at end of file diff --git a/src/app/http-interceptors/index.ts b/src/app/http-interceptors/index.ts index 3056fbff4..53635a917 100644 --- a/src/app/http-interceptors/index.ts +++ b/src/app/http-interceptors/index.ts @@ -1,8 +1,12 @@ /* "Barrel" of Http Interceptors */ import { HTTP_INTERCEPTORS } from '@angular/common/http'; -import { CSRFInterceptor } from './csrf-intercepor'; + +import { CSRFInterceptor } from './csrf.interceptor'; +import { CachingInterceptor } from './caching.interceptor'; /** Http interceptor providers in outside-in order */ export const httpInterceptorProviders = [ + { provide: HTTP_INTERCEPTORS, useClass: CachingInterceptor, multi: true }, + // CSRFInterceptor needs to be last { provide: HTTP_INTERCEPTORS, useClass: CSRFInterceptor, multi: true }, ]; \ No newline at end of file diff --git a/src/app/lists/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts index 63e971f5e..d2aaabac8 100644 --- a/src/app/lists/device-list/device-list.component.ts +++ b/src/app/lists/device-list/device-list.component.ts @@ -34,7 +34,6 @@ export class DeviceListComponent implements AfterViewInit, OnInit { this.systemConfigService.getDevices().subscribe( data => { - console.log("get data??", data) this.dataSource.data = data; this.dataSource.dataSubject.next(data); } diff --git a/src/app/request-cache.service.spec.ts b/src/app/request-cache.service.spec.ts new file mode 100644 index 000000000..4d65caa17 --- /dev/null +++ b/src/app/request-cache.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { RequestCacheService } from './request-cache.service'; + +describe('RequestCacheService', () => { + let service: RequestCacheService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(RequestCacheService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/request-cache.service.ts b/src/app/request-cache.service.ts new file mode 100644 index 000000000..2396378b6 --- /dev/null +++ b/src/app/request-cache.service.ts @@ -0,0 +1,50 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse, HttpRequest } from '@angular/common/http'; + +export interface RequestCacheEntry { + url: string; + response: HttpResponse; + lastRead: number; +} + +const maxAge = 30000; // milliseconds + +@Injectable({ + providedIn: 'root' +}) +export class RequestCacheService { + private cache: Map = new Map(); + + constructor() { } + + get(req: HttpRequest): HttpResponse | undefined { + const url = req.urlWithParams; + const cached = this.cache.get(url); + + if (!cached) { + return undefined; + } + + const isExpired = cached.lastRead < (Date.now() - maxAge); + return isExpired ? undefined : cached.response; + } + + put(req: HttpRequest, response: HttpResponse): void { + const url = req.urlWithParams; + + const entry = { url, response, lastRead: Date.now() }; + this.cache.set(url, entry); + + // Remove expired cache entries + const expired = Date.now() - maxAge; + this.cache.forEach(entry => { + if (entry.lastRead < expired) { + this.cache.delete(entry.url); + } + }); + } + + clearAll(): void { + this.cache = new Map(); + } +} diff --git a/src/app/system-config.service.ts b/src/app/system-config.service.ts index 8a9dd57d8..d045d95de 100644 --- a/src/app/system-config.service.ts +++ b/src/app/system-config.service.ts @@ -60,6 +60,7 @@ export class SystemConfigService { return folderObservable; } + // TODO switch to devices getDevices(): Observable { const deviceObserverable: Observable = new Observable((observer) => { if (this.folders) { From 2fe94736e6acff3f26d1bdf5fe03dea9cb33d3d9 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 25 Mar 2020 09:27:19 -0400 Subject: [PATCH 051/120] update device chart to use donut chart updateData --- .../device-chart/device-chart.component.html | 2 +- .../device-chart/device-chart.component.ts | 27 ++++++++++--------- .../folder-chart/folder-chart.component.ts | 6 ++--- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/app/charts/device-chart/device-chart.component.html b/src/app/charts/device-chart/device-chart.component.html index 077cf3e01..dea3ad5f2 100644 --- a/src/app/charts/device-chart/device-chart.component.html +++ b/src/app/charts/device-chart/device-chart.component.html @@ -4,7 +4,7 @@
- +
diff --git a/src/app/charts/device-chart/device-chart.component.ts b/src/app/charts/device-chart/device-chart.component.ts index 2bd4644a6..fb6720dae 100644 --- a/src/app/charts/device-chart/device-chart.component.ts +++ b/src/app/charts/device-chart/device-chart.component.ts @@ -13,11 +13,9 @@ export class DeviceChartComponent implements OnInit { @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; chartID: string = 'devicesChart'; elevation: string = cardElevation; - states: Map; + states: { label: string, count: number }[] = []; - constructor(private folderService: FolderService) { - this.states = new Map(); - } + constructor(private folderService: FolderService) { } ngOnInit(): void { @@ -27,19 +25,24 @@ export class DeviceChartComponent implements OnInit { // TODO switch to deviceService this.folderService.getAll().subscribe( folder => { - // TODO: Clear existing data - this.donutChart.data([10]); - // Get StateType and convert to string const stateType: Folder.StateType = Folder.getStateType(folder); const state: string = Folder.stateTypeToString(stateType); - // Instantiate empty count states - if (!this.states.has(state)) { - this.states.set(state, 0); + // Check if state exists + let found: boolean = false; + this.states.forEach(s => { + if (s.label === state) { + s.count = s.count + 1; + found = true; + } + }); + + if (!found) { + this.states.push({ label: state, count: 1 }); } - const count: number = this.states.get(state) + 1; - this.states.set(state, count); + + this.donutChart.updateData(this.states); } ); } diff --git a/src/app/charts/folder-chart/folder-chart.component.ts b/src/app/charts/folder-chart/folder-chart.component.ts index 039fd5170..9f8931167 100644 --- a/src/app/charts/folder-chart/folder-chart.component.ts +++ b/src/app/charts/folder-chart/folder-chart.component.ts @@ -12,12 +12,10 @@ import { DonutChartComponent } from '../donut-chart/donut-chart.component'; export class FolderChartComponent implements OnInit { @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; chartID: string = 'foldersChart'; - states: { label: string, count: number }[]; + states: { label: string, count: number }[] = []; elevation: string = cardElevation; - constructor(private folderService: FolderService) { - this.states = []; - } + constructor(private folderService: FolderService) { } ngOnInit(): void { for (let state in Folder.StateType) { From 0361d303f223c8e9b855bda317fde0069a87bb01 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 25 Mar 2020 09:41:22 -0400 Subject: [PATCH 052/120] organize services into services folder --- src/app/app.module.ts | 2 +- src/app/charts/device-chart/device-chart.component.ts | 2 +- src/app/charts/folder-chart/folder-chart.component.ts | 2 +- src/app/dashboard/dashboard.component.ts | 2 +- src/app/http-interceptors/caching.interceptor.ts | 2 +- src/app/http-interceptors/csrf.interceptor.ts | 2 +- src/app/lists/device-list/device-list-datasource.ts | 2 +- src/app/lists/device-list/device-list.component.ts | 2 +- src/app/lists/folder-list/folder-list-datasource.ts | 2 +- src/app/lists/folder-list/folder-list.component.ts | 2 +- src/app/{ => services}/cookie.service.spec.ts | 0 src/app/{ => services}/cookie.service.ts | 0 src/app/{ => services}/db-status.service.spec.ts | 0 src/app/{ => services}/db-status.service.ts | 6 +++--- src/app/{ => services}/device.service.spec.ts | 0 src/app/{ => services}/device.service.ts | 0 src/app/{ => services}/folder.service.spec.ts | 0 src/app/{ => services}/folder.service.ts | 3 +-- .../{ => services}/in-memory-config-data.service.spec.ts | 0 src/app/{ => services}/in-memory-config-data.service.ts | 4 ++-- src/app/{ => services}/request-cache.service.spec.ts | 0 src/app/{ => services}/request-cache.service.ts | 0 src/app/{ => services}/system-config.service.spec.ts | 0 src/app/{ => services}/system-config.service.ts | 8 ++++---- 24 files changed, 20 insertions(+), 21 deletions(-) rename src/app/{ => services}/cookie.service.spec.ts (100%) rename src/app/{ => services}/cookie.service.ts (100%) rename src/app/{ => services}/db-status.service.spec.ts (100%) rename src/app/{ => services}/db-status.service.ts (89%) rename src/app/{ => services}/device.service.spec.ts (100%) rename src/app/{ => services}/device.service.ts (100%) rename src/app/{ => services}/folder.service.spec.ts (100%) rename src/app/{ => services}/folder.service.ts (95%) rename src/app/{ => services}/in-memory-config-data.service.spec.ts (100%) rename src/app/{ => services}/in-memory-config-data.service.ts (67%) rename src/app/{ => services}/request-cache.service.spec.ts (100%) rename src/app/{ => services}/request-cache.service.ts (100%) rename src/app/{ => services}/system-config.service.spec.ts (100%) rename src/app/{ => services}/system-config.service.ts (92%) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 7ac406714..289a3ec0a 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -24,7 +24,7 @@ import { DashboardComponent } from './dashboard/dashboard.component'; import { ListToggleComponent } from './list-toggle/list-toggle.component'; import { HttpClientInMemoryWebApiModule } from 'angular-in-memory-web-api'; -import { InMemoryConfigDataService } from './in-memory-config-data.service'; +import { InMemoryConfigDataService } from './services/in-memory-config-data.service'; import { deviceID } from './api-utils'; import { environment } from '../environments/environment'; diff --git a/src/app/charts/device-chart/device-chart.component.ts b/src/app/charts/device-chart/device-chart.component.ts index fb6720dae..b98aa113c 100644 --- a/src/app/charts/device-chart/device-chart.component.ts +++ b/src/app/charts/device-chart/device-chart.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { cardElevation } from '../../style'; import { DonutChartComponent } from '../donut-chart/donut-chart.component'; import Folder from '../../folder' -import { FolderService } from 'src/app/folder.service'; +import { FolderService } from 'src/app/services/folder.service'; @Component({ selector: 'app-device-chart', diff --git a/src/app/charts/folder-chart/folder-chart.component.ts b/src/app/charts/folder-chart/folder-chart.component.ts index 9f8931167..8e965e71b 100644 --- a/src/app/charts/folder-chart/folder-chart.component.ts +++ b/src/app/charts/folder-chart/folder-chart.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import Folder from '../../folder' import { cardElevation } from '../../style' -import { FolderService } from 'src/app/folder.service'; +import { FolderService } from 'src/app/services/folder.service'; import { DonutChartComponent } from '../donut-chart/donut-chart.component'; @Component({ diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts index 9f03e0bf4..ef4394024 100644 --- a/src/app/dashboard/dashboard.component.ts +++ b/src/app/dashboard/dashboard.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { SystemConfigService } from '../system-config.service'; +import { SystemConfigService } from '../services/system-config.service'; @Component({ selector: 'app-dashboard', diff --git a/src/app/http-interceptors/caching.interceptor.ts b/src/app/http-interceptors/caching.interceptor.ts index f610d6eb8..48112b521 100644 --- a/src/app/http-interceptors/caching.interceptor.ts +++ b/src/app/http-interceptors/caching.interceptor.ts @@ -9,7 +9,7 @@ import { } from '@angular/common/http'; import { Observable, of } from 'rxjs'; import { tap } from 'rxjs/operators'; -import { RequestCacheService } from '../request-cache.service' +import { RequestCacheService } from '../services/request-cache.service' @Injectable() export class CachingInterceptor implements HttpInterceptor { diff --git a/src/app/http-interceptors/csrf.interceptor.ts b/src/app/http-interceptors/csrf.interceptor.ts index 70cc07e9e..d0a4df225 100644 --- a/src/app/http-interceptors/csrf.interceptor.ts +++ b/src/app/http-interceptors/csrf.interceptor.ts @@ -4,7 +4,7 @@ import { HttpInterceptor, HttpHandler, HttpRequest, HttpHeaders } from '@angular/common/http'; -import { CookieService } from '../cookie.service'; +import { CookieService } from '../services/cookie.service'; @Injectable() diff --git a/src/app/lists/device-list/device-list-datasource.ts b/src/app/lists/device-list/device-list-datasource.ts index bf266d7fc..0d60f3fe5 100644 --- a/src/app/lists/device-list/device-list-datasource.ts +++ b/src/app/lists/device-list/device-list-datasource.ts @@ -5,7 +5,7 @@ import { MatSort } from '@angular/material/sort'; import { map } from 'rxjs/operators'; import { Observable, of as observableOf, merge, Subject } from 'rxjs'; import { Device } from '../../device'; -import { SystemConfigService } from '../../system-config.service'; +import { SystemConfigService } from '../../services/system-config.service'; /** * Data source for the DeviceList view. This class should diff --git a/src/app/lists/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts index d2aaabac8..55b597cc9 100644 --- a/src/app/lists/device-list/device-list.component.ts +++ b/src/app/lists/device-list/device-list.component.ts @@ -5,7 +5,7 @@ import { MatTable } from '@angular/material/table'; import { DeviceListDataSource } from './device-list-datasource'; import { Device } from '../../device'; -import { SystemConfigService } from '../../system-config.service'; +import { SystemConfigService } from '../../services/system-config.service'; import { dataTableElevation } from '../../style'; import { Subject } from 'rxjs'; diff --git a/src/app/lists/folder-list/folder-list-datasource.ts b/src/app/lists/folder-list/folder-list-datasource.ts index 1a3da4be4..e107b629f 100644 --- a/src/app/lists/folder-list/folder-list-datasource.ts +++ b/src/app/lists/folder-list/folder-list-datasource.ts @@ -5,7 +5,7 @@ import { MatSort } from '@angular/material/sort'; import { map } from 'rxjs/operators'; import { Observable, of as observableOf, merge, Subject } from 'rxjs'; import Folder from '../../folder'; -import { SystemConfigService } from '../../system-config.service'; +import { SystemConfigService } from '../../services/system-config.service'; /** * Data source for the FolderList view. This class should diff --git a/src/app/lists/folder-list/folder-list.component.ts b/src/app/lists/folder-list/folder-list.component.ts index 7e0c344e5..f9eddd7ec 100644 --- a/src/app/lists/folder-list/folder-list.component.ts +++ b/src/app/lists/folder-list/folder-list.component.ts @@ -5,7 +5,7 @@ import { MatTable } from '@angular/material/table'; import { FolderListDataSource } from './folder-list-datasource'; import Folder from '../../folder'; -import { SystemConfigService } from '../../system-config.service'; +import { SystemConfigService } from '../../services/system-config.service'; import { dataTableElevation } from '../../style'; import { Subject } from 'rxjs'; diff --git a/src/app/cookie.service.spec.ts b/src/app/services/cookie.service.spec.ts similarity index 100% rename from src/app/cookie.service.spec.ts rename to src/app/services/cookie.service.spec.ts diff --git a/src/app/cookie.service.ts b/src/app/services/cookie.service.ts similarity index 100% rename from src/app/cookie.service.ts rename to src/app/services/cookie.service.ts diff --git a/src/app/db-status.service.spec.ts b/src/app/services/db-status.service.spec.ts similarity index 100% rename from src/app/db-status.service.spec.ts rename to src/app/services/db-status.service.spec.ts diff --git a/src/app/db-status.service.ts b/src/app/services/db-status.service.ts similarity index 89% rename from src/app/db-status.service.ts rename to src/app/services/db-status.service.ts index b1e2151ce..b3a076658 100644 --- a/src/app/db-status.service.ts +++ b/src/app/services/db-status.service.ts @@ -5,9 +5,9 @@ import { CookieService } from './cookie.service'; import { Observable, of } from 'rxjs'; import { map, retry, catchError } from 'rxjs/operators'; -import { environment } from '../environments/environment' -import { apiURL, apiRetry } from './api-utils' -import Folder from './folder' +import { environment } from '../../environments/environment' +import { apiURL, apiRetry } from '../api-utils' +import Folder from '../folder' @Injectable({ providedIn: 'root' diff --git a/src/app/device.service.spec.ts b/src/app/services/device.service.spec.ts similarity index 100% rename from src/app/device.service.spec.ts rename to src/app/services/device.service.spec.ts diff --git a/src/app/device.service.ts b/src/app/services/device.service.ts similarity index 100% rename from src/app/device.service.ts rename to src/app/services/device.service.ts diff --git a/src/app/folder.service.spec.ts b/src/app/services/folder.service.spec.ts similarity index 100% rename from src/app/folder.service.spec.ts rename to src/app/services/folder.service.spec.ts diff --git a/src/app/folder.service.ts b/src/app/services/folder.service.ts similarity index 95% rename from src/app/folder.service.ts rename to src/app/services/folder.service.ts index 8259c8432..8cfceb27b 100644 --- a/src/app/folder.service.ts +++ b/src/app/services/folder.service.ts @@ -1,8 +1,7 @@ import { Injectable } from '@angular/core'; import { SystemConfigService } from './system-config.service'; import { Observable, Subscriber } from 'rxjs'; -import { map } from 'rxjs/operators'; -import Folder from './folder'; +import Folder from '../folder'; import { DbStatusService } from './db-status.service'; @Injectable({ diff --git a/src/app/in-memory-config-data.service.spec.ts b/src/app/services/in-memory-config-data.service.spec.ts similarity index 100% rename from src/app/in-memory-config-data.service.spec.ts rename to src/app/services/in-memory-config-data.service.spec.ts diff --git a/src/app/in-memory-config-data.service.ts b/src/app/services/in-memory-config-data.service.ts similarity index 67% rename from src/app/in-memory-config-data.service.ts rename to src/app/services/in-memory-config-data.service.ts index eba1f726f..5e24e334c 100644 --- a/src/app/in-memory-config-data.service.ts +++ b/src/app/services/in-memory-config-data.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; -import { config } from './mocks/mock-config' -import { dbStatus } from './mocks/mock-db-status' +import { config } from '../mocks/mock-config' +import { dbStatus } from '../mocks/mock-db-status' @Injectable({ providedIn: 'root' diff --git a/src/app/request-cache.service.spec.ts b/src/app/services/request-cache.service.spec.ts similarity index 100% rename from src/app/request-cache.service.spec.ts rename to src/app/services/request-cache.service.spec.ts diff --git a/src/app/request-cache.service.ts b/src/app/services/request-cache.service.ts similarity index 100% rename from src/app/request-cache.service.ts rename to src/app/services/request-cache.service.ts diff --git a/src/app/system-config.service.spec.ts b/src/app/services/system-config.service.spec.ts similarity index 100% rename from src/app/system-config.service.spec.ts rename to src/app/services/system-config.service.spec.ts diff --git a/src/app/system-config.service.ts b/src/app/services/system-config.service.ts similarity index 92% rename from src/app/system-config.service.ts rename to src/app/services/system-config.service.ts index d045d95de..ba30657bf 100644 --- a/src/app/system-config.service.ts +++ b/src/app/services/system-config.service.ts @@ -4,11 +4,11 @@ import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Observable, Subject } from 'rxjs'; import { map, retry } from 'rxjs/operators'; -import Folder from './folder'; -import { Device } from './device'; +import Folder from '../folder'; +import { Device } from '../device'; import { CookieService } from './cookie.service'; -import { environment } from '../environments/environment' -import { apiURL, apiRetry } from './api-utils' +import { environment } from '../../environments/environment' +import { apiURL, apiRetry } from '../api-utils' @Injectable({ providedIn: 'root' From 78a31449aa810e4a5f440eb53dde989947a888c9 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 25 Mar 2020 16:08:07 -0400 Subject: [PATCH 053/120] create Device namespace and getStateType function --- src/app/device.ts | 67 ++++++++++++++++++- src/app/folder.ts | 12 +--- .../device-list/device-list-datasource.ts | 4 +- .../device-list/device-list.component.ts | 3 +- src/app/services/device.service.ts | 3 +- src/app/services/system-config.service.ts | 3 +- 6 files changed, 73 insertions(+), 19 deletions(-) diff --git a/src/app/device.ts b/src/app/device.ts index a2a8cc078..eeb5fdffd 100644 --- a/src/app/device.ts +++ b/src/app/device.ts @@ -1,6 +1,67 @@ -export interface Device { +interface Device { deviceID: string; name: string; + state: Device.StateType; + paused: boolean; + connected: boolean; + completion: number; + used: boolean; // indicates if a folder is using the device +} - // TODO add additional properties -} \ No newline at end of file +namespace Device { + export enum StateType { + Insync = 1, + UnusedInsync, + Unknown, + Syncing, + Paused, + UnusedPaused, + Disconnected, + UnusedDisconnected, + } + + export function stateTypeToString(s: StateType): string { + switch (s) { + case StateType.Insync: + return 'Up to Date'; + case StateType.UnusedInsync: + return 'Connected (Unused)'; + case StateType.Unknown: + return 'Unknown'; + case StateType.Syncing: + return 'Syncing'; + case StateType.Paused: + return 'Paused'; + case StateType.UnusedPaused: + return 'Paused (Unused)'; + case StateType.Disconnected: + return 'Disconnected'; + case StateType.UnusedDisconnected: + return 'Disconnected (Unused)'; + } + } + + export function getStateType(d: Device): StateType { + // TODO + /* + if (typeof $scope.connections[deviceCfg.deviceID] === 'undefined') { + return 'unknown'; + } + */ + + if (d.paused) { + return d.used ? StateType.Paused : StateType.UnusedPaused; + } + + if (d.connected) { + if (d.completion === 100) { + return d.used ? StateType.Insync : StateType.UnusedInsync; + } else { + return StateType.Syncing; + } + } + + return d.used ? StateType.Disconnected : StateType.UnusedDisconnected; + } +} +export default Device; \ No newline at end of file diff --git a/src/app/folder.ts b/src/app/folder.ts index 1971d4cf8..da217dc28 100644 --- a/src/app/folder.ts +++ b/src/app/folder.ts @@ -1,4 +1,4 @@ -import { Device } from './device'; +import Device from './device'; interface Folder { id: string; @@ -6,6 +6,7 @@ interface Folder { devices: Device[]; status: Folder.Status; paused: boolean; + completion: number; } namespace Folder { @@ -158,11 +159,4 @@ namespace Folder { version: number; } } - -export default Folder; - - - - - - +export default Folder; \ No newline at end of file diff --git a/src/app/lists/device-list/device-list-datasource.ts b/src/app/lists/device-list/device-list-datasource.ts index 0d60f3fe5..94007cacd 100644 --- a/src/app/lists/device-list/device-list-datasource.ts +++ b/src/app/lists/device-list/device-list-datasource.ts @@ -4,7 +4,7 @@ import { MatSort } from '@angular/material/sort'; import { map } from 'rxjs/operators'; import { Observable, of as observableOf, merge, Subject } from 'rxjs'; -import { Device } from '../../device'; +import Device from '../../device'; import { SystemConfigService } from '../../services/system-config.service'; /** @@ -79,4 +79,4 @@ export class DeviceListDataSource extends DataSource { function compare(a: string | number, b: string | number, isAsc: boolean) { return (a < b ? -1 : 1) * (isAsc ? 1 : -1); -} +} \ No newline at end of file diff --git a/src/app/lists/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts index 55b597cc9..2a3599684 100644 --- a/src/app/lists/device-list/device-list.component.ts +++ b/src/app/lists/device-list/device-list.component.ts @@ -4,12 +4,11 @@ import { MatSort } from '@angular/material/sort'; import { MatTable } from '@angular/material/table'; import { DeviceListDataSource } from './device-list-datasource'; -import { Device } from '../../device'; +import Device from '../../device'; import { SystemConfigService } from '../../services/system-config.service'; import { dataTableElevation } from '../../style'; import { Subject } from 'rxjs'; - @Component({ selector: 'app-device-list', templateUrl: './device-list.component.html', diff --git a/src/app/services/device.service.ts b/src/app/services/device.service.ts index 204dbb6f5..2f8081871 100644 --- a/src/app/services/device.service.ts +++ b/src/app/services/device.service.ts @@ -1,9 +1,10 @@ import { Injectable } from '@angular/core'; +import Device from '../device'; @Injectable({ providedIn: 'root' }) export class DeviceService { - + private devices: Device[]; constructor() { } } diff --git a/src/app/services/system-config.service.ts b/src/app/services/system-config.service.ts index ba30657bf..3454e533a 100644 --- a/src/app/services/system-config.service.ts +++ b/src/app/services/system-config.service.ts @@ -5,8 +5,7 @@ import { Observable, Subject } from 'rxjs'; import { map, retry } from 'rxjs/operators'; import Folder from '../folder'; -import { Device } from '../device'; -import { CookieService } from './cookie.service'; +import Device from '../device'; import { environment } from '../../environments/environment' import { apiURL, apiRetry } from '../api-utils' From bc7d71ee3d18de1345a59cf8398f719ff7237655 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 25 Mar 2020 21:36:24 -0400 Subject: [PATCH 054/120] Create system connections service, mocks, and work on updating devices chart --- .../device-chart/device-chart.component.ts | 18 +++---- .../folder-chart/folder-chart.component.ts | 4 +- src/app/connections.ts | 16 ++++++ src/app/mocks/mock-config.ts | 4 +- src/app/mocks/mock-connections.ts | 44 ++++++++++++++++ src/app/services/device.service.ts | 52 ++++++++++++++++++- .../services/in-memory-config-data.service.ts | 3 +- .../system-connections.service.spec.ts | 16 ++++++ .../services/system-connections.service.ts | 27 ++++++++++ 9 files changed, 167 insertions(+), 17 deletions(-) create mode 100644 src/app/connections.ts create mode 100644 src/app/mocks/mock-connections.ts create mode 100644 src/app/services/system-connections.service.spec.ts create mode 100644 src/app/services/system-connections.service.ts diff --git a/src/app/charts/device-chart/device-chart.component.ts b/src/app/charts/device-chart/device-chart.component.ts index b98aa113c..5fcdb69ed 100644 --- a/src/app/charts/device-chart/device-chart.component.ts +++ b/src/app/charts/device-chart/device-chart.component.ts @@ -1,8 +1,8 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { cardElevation } from '../../style'; import { DonutChartComponent } from '../donut-chart/donut-chart.component'; -import Folder from '../../folder' -import { FolderService } from 'src/app/services/folder.service'; +import { DeviceService } from 'src/app/services/device.service'; +import Device from '../../device'; @Component({ selector: 'app-device-chart', @@ -15,19 +15,17 @@ export class DeviceChartComponent implements OnInit { elevation: string = cardElevation; states: { label: string, count: number }[] = []; - constructor(private folderService: FolderService) { } + constructor(private deviceService: DeviceService) { } - ngOnInit(): void { - - } + ngOnInit(): void { } ngAfterViewInit(): void { // TODO switch to deviceService - this.folderService.getAll().subscribe( - folder => { + this.deviceService.getAll().subscribe( + device => { // Get StateType and convert to string - const stateType: Folder.StateType = Folder.getStateType(folder); - const state: string = Folder.stateTypeToString(stateType); + const stateType: Device.StateType = Device.getStateType(device); + const state: string = Device.stateTypeToString(stateType); // Check if state exists let found: boolean = false; diff --git a/src/app/charts/folder-chart/folder-chart.component.ts b/src/app/charts/folder-chart/folder-chart.component.ts index 8e965e71b..d3b184747 100644 --- a/src/app/charts/folder-chart/folder-chart.component.ts +++ b/src/app/charts/folder-chart/folder-chart.component.ts @@ -18,9 +18,7 @@ export class FolderChartComponent implements OnInit { constructor(private folderService: FolderService) { } ngOnInit(): void { - for (let state in Folder.StateType) { - // console.log(state); - } + // for (let state in Folder.StateType) { } } ngAfterViewInit() { diff --git a/src/app/connections.ts b/src/app/connections.ts new file mode 100644 index 000000000..bf5da1a55 --- /dev/null +++ b/src/app/connections.ts @@ -0,0 +1,16 @@ +export interface SystemConnections { + connections: { deviceId?: Connection }; + total: Connection; +} + +export interface Connection { + address: string; + at: string; + clientVersion: string; + connected: boolean; + crypto: string; + inBytesTotal: number; + outBytesTotal: number; + paused: boolean; + type: string; +} \ No newline at end of file diff --git a/src/app/mocks/mock-config.ts b/src/app/mocks/mock-config.ts index b09809ec0..b5cbe80a0 100644 --- a/src/app/mocks/mock-config.ts +++ b/src/app/mocks/mock-config.ts @@ -1,7 +1,7 @@ export const config = { "version": 15, "folders": [ - { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, + { "id": "GXWxf-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "YZJBJFX-RDBL7WY-6ZGKJ2D-4MJB4E7-ZATSDUY-LD6Y3L3-MLFUYWE-AEMXJAC" }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, { "id": "Tyeho-ncvqp", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, { "id": "Ihpqp-3zgnq", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, { "id": "Abqqp-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, @@ -11,7 +11,7 @@ export const config = { { "id": "Poqff-3zgnU", "label": "MyFolder", "path": "...", "type": "sendreceive", "devices": [{ "deviceID": "..." }], "rescanIntervalS": 60, "ignorePerms": false, "autoNormalize": true, "minDiskFreePct": 1, "versioning": { "type": "simple", "params": { "keep": "5" } }, "copiers": 0, "pullers": 0, "hashers": 0, "order": "random", "ignoreDelete": false, "scanProgressIntervalS": 0, "pullerSleepS": 0, "pullerPauseS": 0, "maxConflicts": 10, "disableSparseFiles": false, "disableTempIndexes": false, "fsync": false, "invalid": "" }, ], "devices": [ - { "deviceID": "...", "name": "Laptop", "addresses": ["dynamic", "tcp://192.168.1.2:22000"], "compression": "metadata", "certName": "", "introducer": false }, + { "deviceID": "YZJBJFX-RDBL7WY-6ZGKJ2D-4MJB4E7-ZATSDUY-LD6Y3L3-MLFUYWE-AEMXJAC", "name": "Laptop", "addresses": ["dynamic", "tcp://192.168.1.2:22000"], "compression": "metadata", "certName": "", "introducer": false }, { "deviceID": "...", "name": "Server", "addresses": ["dynamic", "tcp://192.168.1.3:22000"], "compression": "metadata", "certName": "", "introducer": false }, ], "gui": { diff --git a/src/app/mocks/mock-connections.ts b/src/app/mocks/mock-connections.ts new file mode 100644 index 000000000..4e77f506f --- /dev/null +++ b/src/app/mocks/mock-connections.ts @@ -0,0 +1,44 @@ +export const connections = { + "total": { + "paused": false, + "clientVersion": "", + "at": "2015-11-07T17:29:47.691637262+01:00", + "connected": false, + "inBytesTotal": 1479, + "type": "", + "outBytesTotal": 1318, + "address": "" + }, + "connections": { + "YZJBJFX-RDBL7WY-6ZGKJ2D-4MJB4E7-ZATSDUY-LD6Y3L3-MLFUYWE-AEMXJAC": { + "connected": true, + "inBytesTotal": 556, + "paused": false, + "at": "2015-11-07T17:29:47.691548971+01:00", + "clientVersion": "v0.12.1", + "address": "127.0.0.1:22002", + "type": "TCP (Client)", + "outBytesTotal": 550 + }, + "DOVII4U-SQEEESM-VZ2CVTC-CJM4YN5-QNV7DCU-5U3ASRL-YVFG6TH-W5DV5AA": { + "outBytesTotal": 0, + "type": "", + "address": "", + "at": "0001-01-01T00:00:00Z", + "clientVersion": "", + "paused": false, + "inBytesTotal": 0, + "connected": false + }, + "UYGDMA4-TPHOFO5-2VQYDCC-7CWX7XW-INZINQT-LE4B42N-4JUZTSM-IWCSXA4": { + "address": "", + "type": "", + "outBytesTotal": 0, + "connected": false, + "inBytesTotal": 0, + "paused": false, + "at": "0001-01-01T00:00:00Z", + "clientVersion": "" + } + } +} \ No newline at end of file diff --git a/src/app/services/device.service.ts b/src/app/services/device.service.ts index 2f8081871..3de7277dc 100644 --- a/src/app/services/device.service.ts +++ b/src/app/services/device.service.ts @@ -1,10 +1,60 @@ import { Injectable } from '@angular/core'; import Device from '../device'; +import { Observable } from 'rxjs'; +import { SystemConfigService } from './system-config.service'; +import { SystemConnectionsService } from './system-connections.service'; @Injectable({ providedIn: 'root' }) export class DeviceService { private devices: Device[]; - constructor() { } + constructor( + private systemConfigService: SystemConfigService, + private systemConnectionsService: SystemConnectionsService + ) { } + + getAll(): Observable { + const deviceObservable: Observable = new Observable((observer) => { + this.systemConfigService.getDevices().subscribe( + devices => { + this.devices = devices; + + // Check folder devices to see if the device is used + this.systemConfigService.getFolders().subscribe( + folders => { + // TODO: streamline + // Loop through all folder devices to see if the device is used + this.devices.forEach(device => { + folders.forEach(folder => { + folder.devices.forEach(fdevice => { + if (device.deviceID === fdevice.deviceID) { + device.used = true; + } + }); + }); + }); + + // See if the connection is connected or undefined + this.systemConnectionsService.getSystemConnections().subscribe( + connections => { + // TODO: check connection and request total + this.devices.forEach(device => { + observer.next(device); + }); + observer.complete(); + } + ); + + // Synchronously get the status of each device + // this.getDeviceStatusInOrder(observer, 0); + } + ) + }, + err => { console.log("getAll error!", err) }, + () => { console.log("get all complete!") } + ); + }); + return deviceObservable + } } diff --git a/src/app/services/in-memory-config-data.service.ts b/src/app/services/in-memory-config-data.service.ts index 5e24e334c..d2cb7b073 100644 --- a/src/app/services/in-memory-config-data.service.ts +++ b/src/app/services/in-memory-config-data.service.ts @@ -1,13 +1,14 @@ import { Injectable } from '@angular/core'; import { config } from '../mocks/mock-config' import { dbStatus } from '../mocks/mock-db-status' +import { connections } from '../mocks/mock-connections' @Injectable({ providedIn: 'root' }) export class InMemoryConfigDataService { createDb() { - return { config, dbStatus }; + return { config, dbStatus, connections }; } constructor() { } diff --git a/src/app/services/system-connections.service.spec.ts b/src/app/services/system-connections.service.spec.ts new file mode 100644 index 000000000..bac82fabb --- /dev/null +++ b/src/app/services/system-connections.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { SystemConnectionsService } from './system-connections.service'; + +describe('SystemConnectionsService', () => { + let service: SystemConnectionsService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(SystemConnectionsService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/system-connections.service.ts b/src/app/services/system-connections.service.ts new file mode 100644 index 000000000..09a66c8a4 --- /dev/null +++ b/src/app/services/system-connections.service.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { apiURL, apiRetry } from '../api-utils'; +import { HttpClient } from '@angular/common/http'; +import { retry, map } from 'rxjs/operators'; +import { Observable } from 'rxjs'; +import { SystemConnections } from '../connections'; + +@Injectable({ + providedIn: 'root' +}) +export class SystemConnectionsService { + private systemConfigUrl = environment.production ? apiURL + 'rest/system/connections' : 'api/connections'; + + constructor(private http: HttpClient) { } + + getSystemConnections(): Observable { + return this.http + .get(this.systemConfigUrl) + .pipe( + retry(apiRetry), + map(res => { + return res; + }) + ); + } +} From 09673ba0c64faf71fae4742a5e1e97b3e8b2ffa8 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 26 Mar 2020 16:17:03 -0400 Subject: [PATCH 055/120] create db completion service and mock data --- .../device-chart/device-chart.component.ts | 3 +- src/app/completion.ts | 6 +++ src/app/mocks/mock-db-completion.ts | 24 +++++++++++ .../services/db-completion.service.spec.ts | 16 +++++++ src/app/services/db-completion.service.ts | 43 +++++++++++++++++++ src/app/services/db-status.service.ts | 2 +- src/app/services/device.service.ts | 15 +++++-- .../services/in-memory-config-data.service.ts | 3 +- src/app/services/system-config.service.ts | 3 +- 9 files changed, 107 insertions(+), 8 deletions(-) create mode 100644 src/app/completion.ts create mode 100644 src/app/mocks/mock-db-completion.ts create mode 100644 src/app/services/db-completion.service.spec.ts create mode 100644 src/app/services/db-completion.service.ts diff --git a/src/app/charts/device-chart/device-chart.component.ts b/src/app/charts/device-chart/device-chart.component.ts index 5fcdb69ed..7cc70be2b 100644 --- a/src/app/charts/device-chart/device-chart.component.ts +++ b/src/app/charts/device-chart/device-chart.component.ts @@ -20,9 +20,10 @@ export class DeviceChartComponent implements OnInit { ngOnInit(): void { } ngAfterViewInit(): void { - // TODO switch to deviceService this.deviceService.getAll().subscribe( device => { + console.log("device", device); + // Get StateType and convert to string const stateType: Device.StateType = Device.getStateType(device); const state: string = Device.stateTypeToString(stateType); diff --git a/src/app/completion.ts b/src/app/completion.ts new file mode 100644 index 000000000..686ab57b5 --- /dev/null +++ b/src/app/completion.ts @@ -0,0 +1,6 @@ +export interface Completion { + completion: number; + globalBytes: number; + needBytes: number; + needDeletes: number; +} \ No newline at end of file diff --git a/src/app/mocks/mock-db-completion.ts b/src/app/mocks/mock-db-completion.ts new file mode 100644 index 000000000..7ef778d61 --- /dev/null +++ b/src/app/mocks/mock-db-completion.ts @@ -0,0 +1,24 @@ +export const dbCompletion = + [ + { + "device": "YZJBJFX-RDBL7WY-6ZGKJ2D-4MJB4E7-ZATSDUY-LD6Y3L3-MLFUYWE-AEMXJAC", + "completion": 100, + "globalBytes": 156793013575, + "needBytes": 0, + "needDeletes": 0 + }, + { + "completion": 80, + "globalBytes": 3013575, + "needBytes": 100, + "needDeletes": 0 + } + ] +/* +{ + "completion": 100, + "globalBytes": 156793013575, + "needBytes": 0, + "needDeletes": 0 +} +*/ \ No newline at end of file diff --git a/src/app/services/db-completion.service.spec.ts b/src/app/services/db-completion.service.spec.ts new file mode 100644 index 000000000..90b9a8ed8 --- /dev/null +++ b/src/app/services/db-completion.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { DbCompletionService } from './db-completion.service'; + +describe('DbCompletionService', () => { + let service: DbCompletionService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(DbCompletionService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/db-completion.service.ts b/src/app/services/db-completion.service.ts new file mode 100644 index 000000000..00cb4f36c --- /dev/null +++ b/src/app/services/db-completion.service.ts @@ -0,0 +1,43 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpParams } from '@angular/common/http'; +import { environment } from 'src/environments/environment'; +import { apiURL, apiRetry } from '../api-utils'; +import { Completion } from '../completion'; +import { retry, map } from 'rxjs/operators'; +import { Observable } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class DbCompletionService { + private dbStatusUrl = environment.production ? apiURL + 'rest/db/completion' : 'api/dbCompletion'; + + constructor(private http: HttpClient) { } + + getDeviceCompletion(id: string): Observable { + let httpOptions: { params: HttpParams }; + if (id) { + httpOptions = { + params: new HttpParams().set('device', id) + }; + } else { } + + return this.http + .get(this.dbStatusUrl, httpOptions) + .pipe( + retry(apiRetry), + map(res => { + // Remove from array in developement + // in-memory-web-api returns arrays + if (!environment.production) { + const a: any = res as any; + if (a.length > 0) { + res = res[0]; + } + } + return res; + }) + ); + + } +} \ No newline at end of file diff --git a/src/app/services/db-status.service.ts b/src/app/services/db-status.service.ts index b3a076658..dd2ff2665 100644 --- a/src/app/services/db-status.service.ts +++ b/src/app/services/db-status.service.ts @@ -15,7 +15,7 @@ import Folder from '../folder' export class DbStatusService { private dbStatusUrl = environment.production ? apiURL + 'rest/db/status' : 'api/dbStatus'; - constructor(private http: HttpClient, private cookieService: CookieService) { } + constructor(private http: HttpClient) { } getFolderStatus(id: string): Observable { let httpOptions: { params: HttpParams }; diff --git a/src/app/services/device.service.ts b/src/app/services/device.service.ts index 3de7277dc..05505222e 100644 --- a/src/app/services/device.service.ts +++ b/src/app/services/device.service.ts @@ -3,6 +3,7 @@ import Device from '../device'; import { Observable } from 'rxjs'; import { SystemConfigService } from './system-config.service'; import { SystemConnectionsService } from './system-connections.service'; +import { DbCompletionService } from './db-completion.service'; @Injectable({ providedIn: 'root' @@ -11,7 +12,8 @@ export class DeviceService { private devices: Device[]; constructor( private systemConfigService: SystemConfigService, - private systemConnectionsService: SystemConnectionsService + private systemConnectionsService: SystemConnectionsService, + private dbCompletionService: DbCompletionService ) { } getAll(): Observable { @@ -40,9 +42,16 @@ export class DeviceService { connections => { // TODO: check connection and request total this.devices.forEach(device => { - observer.next(device); + // TODO make this synchronous + this.dbCompletionService.getDeviceCompletion(device.deviceID).subscribe( + c => { + device.completion = c.completion; + observer.next(device); + }); + + //TODO complete observer when finished + // observer.complete(); }); - observer.complete(); } ); diff --git a/src/app/services/in-memory-config-data.service.ts b/src/app/services/in-memory-config-data.service.ts index d2cb7b073..5e4949828 100644 --- a/src/app/services/in-memory-config-data.service.ts +++ b/src/app/services/in-memory-config-data.service.ts @@ -2,13 +2,14 @@ import { Injectable } from '@angular/core'; import { config } from '../mocks/mock-config' import { dbStatus } from '../mocks/mock-db-status' import { connections } from '../mocks/mock-connections' +import { dbCompletion } from '../mocks/mock-db-completion' @Injectable({ providedIn: 'root' }) export class InMemoryConfigDataService { createDb() { - return { config, dbStatus, connections }; + return { config, dbStatus, connections, dbCompletion }; } constructor() { } diff --git a/src/app/services/system-config.service.ts b/src/app/services/system-config.service.ts index 3454e533a..16d845c93 100644 --- a/src/app/services/system-config.service.ts +++ b/src/app/services/system-config.service.ts @@ -59,10 +59,9 @@ export class SystemConfigService { return folderObservable; } - // TODO switch to devices getDevices(): Observable { const deviceObserverable: Observable = new Observable((observer) => { - if (this.folders) { + if (this.devices) { observer.next(this.devices); } else { let t = setInterval(() => { From 9d126760fab8b35c24f3d74a42c592f71e1efb12 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 26 Mar 2020 18:23:53 -0400 Subject: [PATCH 056/120] Synchronously get the status of each device --- src/app/device.ts | 8 ++--- src/app/services/device.service.ts | 56 +++++++++++++++++++++--------- src/app/services/folder.service.ts | 2 ++ 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/app/device.ts b/src/app/device.ts index eeb5fdffd..72d3d47fc 100644 --- a/src/app/device.ts +++ b/src/app/device.ts @@ -42,12 +42,10 @@ namespace Device { } export function getStateType(d: Device): StateType { - // TODO - /* - if (typeof $scope.connections[deviceCfg.deviceID] === 'undefined') { - return 'unknown'; + // StateType Unknown is set in DeviceService + if (d.state === StateType.Unknown) { + return StateType.Unknown; } - */ if (d.paused) { return d.used ? StateType.Paused : StateType.UnusedPaused; diff --git a/src/app/services/device.service.ts b/src/app/services/device.service.ts index 05505222e..37f7d84f7 100644 --- a/src/app/services/device.service.ts +++ b/src/app/services/device.service.ts @@ -1,23 +1,57 @@ import { Injectable } from '@angular/core'; import Device from '../device'; -import { Observable } from 'rxjs'; +import { Observable, Subscriber } from 'rxjs'; import { SystemConfigService } from './system-config.service'; import { SystemConnectionsService } from './system-connections.service'; import { DbCompletionService } from './db-completion.service'; +import { SystemConnections } from '../connections'; @Injectable({ providedIn: 'root' }) export class DeviceService { private devices: Device[]; + private sysConns: SystemConnections; + constructor( private systemConfigService: SystemConfigService, private systemConnectionsService: SystemConnectionsService, private dbCompletionService: DbCompletionService ) { } + getDeviceStatusInOrder(observer: Subscriber, startIndex: number) { + // Return if there aren't any device at the index + if (startIndex >= (this.devices.length)) { + observer.complete(); + return; + } + const device: Device = this.devices[startIndex]; + startIndex = startIndex + 1; + + // Check if device in the connections + if (this.sysConns.connections[device.deviceID] === undefined) { + console.log(this.sysConns.connections) + console.log("connections undefined", device.deviceID); + device.state = Device.StateType.Unknown; + } else { + // Set connected + device.connected = this.sysConns.connections[device.deviceID].connected; + } + + this.dbCompletionService.getDeviceCompletion(device.deviceID).subscribe( + c => { + device.completion = c.completion; + observer.next(device); + + // recursively get the status of the next folder + this.getDeviceStatusInOrder(observer, startIndex); + }); + } + getAll(): Observable { const deviceObservable: Observable = new Observable((observer) => { + // TODO return devices if cached + this.systemConfigService.getDevices().subscribe( devices => { this.devices = devices; @@ -25,7 +59,6 @@ export class DeviceService { // Check folder devices to see if the device is used this.systemConfigService.getFolders().subscribe( folders => { - // TODO: streamline // Loop through all folder devices to see if the device is used this.devices.forEach(device => { folders.forEach(folder => { @@ -39,24 +72,13 @@ export class DeviceService { // See if the connection is connected or undefined this.systemConnectionsService.getSystemConnections().subscribe( - connections => { - // TODO: check connection and request total - this.devices.forEach(device => { - // TODO make this synchronous - this.dbCompletionService.getDeviceCompletion(device.deviceID).subscribe( - c => { - device.completion = c.completion; - observer.next(device); - }); + c => { + this.sysConns = c; - //TODO complete observer when finished - // observer.complete(); - }); + // Synchronously get the status of each device + this.getDeviceStatusInOrder(observer, 0); } ); - - // Synchronously get the status of each device - // this.getDeviceStatusInOrder(observer, 0); } ) }, diff --git a/src/app/services/folder.service.ts b/src/app/services/folder.service.ts index 8cfceb27b..8726d83bd 100644 --- a/src/app/services/folder.service.ts +++ b/src/app/services/folder.service.ts @@ -39,6 +39,8 @@ export class FolderService { * set all their statuses */ getAll(): Observable { + // TODO return this.folders if cached + const folderObservable: Observable = new Observable((observer) => { this.systemConfigService.getFolders().subscribe( folders => { From 9fe0c302991e3d1117b8cfc0635d89a00bc1b75a Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 27 Mar 2020 09:09:52 -0400 Subject: [PATCH 057/120] update mock names --- src/app/mocks/{mock-config.ts => mock-system-config.ts} | 0 .../mocks/{mock-connections.ts => mock-system-connections.ts} | 0 src/app/services/in-memory-config-data.service.ts | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename src/app/mocks/{mock-config.ts => mock-system-config.ts} (100%) rename src/app/mocks/{mock-connections.ts => mock-system-connections.ts} (100%) diff --git a/src/app/mocks/mock-config.ts b/src/app/mocks/mock-system-config.ts similarity index 100% rename from src/app/mocks/mock-config.ts rename to src/app/mocks/mock-system-config.ts diff --git a/src/app/mocks/mock-connections.ts b/src/app/mocks/mock-system-connections.ts similarity index 100% rename from src/app/mocks/mock-connections.ts rename to src/app/mocks/mock-system-connections.ts diff --git a/src/app/services/in-memory-config-data.service.ts b/src/app/services/in-memory-config-data.service.ts index 5e4949828..b9b6c8089 100644 --- a/src/app/services/in-memory-config-data.service.ts +++ b/src/app/services/in-memory-config-data.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; -import { config } from '../mocks/mock-config' +import { config } from '../mocks/mock-system-config' import { dbStatus } from '../mocks/mock-db-status' -import { connections } from '../mocks/mock-connections' +import { connections } from '../mocks/mock-system-connections' import { dbCompletion } from '../mocks/mock-db-completion' @Injectable({ From b7f3425f362951467dcdda7a9c3081cdb2d5a861 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 27 Mar 2020 09:59:40 -0400 Subject: [PATCH 058/120] add system status service and mock data --- src/app/mocks/mock-system-status.ts | 59 +++++++++++++++++++ src/app/services/device.service.ts | 56 +++++++++++------- .../services/in-memory-config-data.service.ts | 11 ++-- .../services/system-status.service.spec.ts | 16 +++++ src/app/services/system-status.service.ts | 28 +++++++++ src/app/system-status.ts | 17 ++++++ 6 files changed, 162 insertions(+), 25 deletions(-) create mode 100644 src/app/mocks/mock-system-status.ts create mode 100644 src/app/services/system-status.service.spec.ts create mode 100644 src/app/services/system-status.service.ts create mode 100644 src/app/system-status.ts diff --git a/src/app/mocks/mock-system-status.ts b/src/app/mocks/mock-system-status.ts new file mode 100644 index 000000000..1a6472f19 --- /dev/null +++ b/src/app/mocks/mock-system-status.ts @@ -0,0 +1,59 @@ +export const systemStatus = { + "alloc": 30618136, + "connectionServiceStatus": { + "dynamic+https://relays.syncthing.net/endpoint": { + "error": null, + "lanAddresses": [ + "relay://23.92.71.120:443/?id=53STGR7-YBM6FCX-PAZ2RHM-YPY6OEJ-WYHVZO7-PCKQRCK-PZLTP7T-434XCAD&pingInterval=1m0s&networkTimeout=2m0s&sessionLimitBps=0&globalLimitBps=0&statusAddr=:22070&providedBy=canton7" + ], + "wanAddresses": [ + "relay://23.92.71.120:443/?id=53STGR7-YBM6FCX-PAZ2RHM-YPY6OEJ-WYHVZO7-PCKQRCK-PZLTP7T-434XCAD&pingInterval=1m0s&networkTimeout=2m0s&sessionLimitBps=0&globalLimitBps=0&statusAddr=:22070&providedBy=canton7" + ] + }, + "tcp://0.0.0.0:22000": { + "error": null, + "lanAddresses": [ + "tcp://0.0.0.0:22000" + ], + "wanAddresses": [ + "tcp://0.0.0.0:22000" + ] + } + }, + "cpuPercent": 0, + "discoveryEnabled": true, + "discoveryErrors": { + "global@https://discovery-v4-1.syncthing.net/v2/": "500 Internal Server Error", + "global@https://discovery-v4-2.syncthing.net/v2/": "Post https://discovery-v4-2.syncthing.net/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)", + "global@https://discovery-v4-3.syncthing.net/v2/": "Post https://discovery-v4-3.syncthing.net/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)", + "global@https://discovery-v6-1.syncthing.net/v2/": "Post https://discovery-v6-1.syncthing.net/v2/: dial tcp [2001:470:28:4d6::5]:443: connect: no route to host", + "global@https://discovery-v6-2.syncthing.net/v2/": "Post https://discovery-v6-2.syncthing.net/v2/: dial tcp [2604:a880:800:10::182:a001]:443: connect: no route to host", + "global@https://discovery-v6-3.syncthing.net/v2/": "Post https://discovery-v6-3.syncthing.net/v2/: dial tcp [2400:6180:0:d0::d9:d001]:443: connect: no route to host" + }, + "discoveryMethods": 8, + "goroutines": 49, + "lastDialStatus": { + "tcp://10.20.30.40": { + "when": "2019-05-16T07:41:23Z", + "error": "dial tcp 10.20.30.40:22000: i/o timeout" + }, + "tcp://172.16.33.3:22000": { + "when": "2019-05-16T07:40:43Z", + "ok": true + }, + "tcp://83.233.120.221:22000": { + "when": "2019-05-16T07:41:13Z", + "error": "dial tcp 83.233.120.221:22000: connect: connection refused" + } + }, + "myID": "YZJBJFX-RDBL7WY-6ZGKJ2D-4MJB4E7-ZATSDUY-LD6Y3L3-MLFUYWE-AEMXJAC", + "pathSeparator": "/", + "startTime": "2016-06-06T19:41:43.039284753+02:00", + "sys": 42092792, + "themes": [ + "default", + "dark" + ], + "tilde": "/Users/jb", + "uptime": 2635 +} \ No newline at end of file diff --git a/src/app/services/device.service.ts b/src/app/services/device.service.ts index 37f7d84f7..a988af366 100644 --- a/src/app/services/device.service.ts +++ b/src/app/services/device.service.ts @@ -5,6 +5,7 @@ import { SystemConfigService } from './system-config.service'; import { SystemConnectionsService } from './system-connections.service'; import { DbCompletionService } from './db-completion.service'; import { SystemConnections } from '../connections'; +import { SystemStatusService } from './system-status.service'; @Injectable({ providedIn: 'root' @@ -12,11 +13,13 @@ import { SystemConnections } from '../connections'; export class DeviceService { private devices: Device[]; private sysConns: SystemConnections; + thisDevice: Device; constructor( private systemConfigService: SystemConfigService, private systemConnectionsService: SystemConnectionsService, - private dbCompletionService: DbCompletionService + private dbCompletionService: DbCompletionService, + private systemStatusService: SystemStatusService ) { } getDeviceStatusInOrder(observer: Subscriber, startIndex: number) { @@ -56,29 +59,42 @@ export class DeviceService { devices => { this.devices = devices; - // Check folder devices to see if the device is used - this.systemConfigService.getFolders().subscribe( - folders => { - // Loop through all folder devices to see if the device is used + // First check to see which device is local 'thisDevice' + this.systemStatusService.getSystemStatus().subscribe( + status => { this.devices.forEach(device => { - folders.forEach(folder => { - folder.devices.forEach(fdevice => { - if (device.deviceID === fdevice.deviceID) { - device.used = true; - } - }); - }); + if (device.deviceID === status.myID) { + console.log("found thisDevice!", device); + this.thisDevice = device; + } }); - // See if the connection is connected or undefined - this.systemConnectionsService.getSystemConnections().subscribe( - c => { - this.sysConns = c; + // TODO Determine if it should ignore thisDevice - // Synchronously get the status of each device - this.getDeviceStatusInOrder(observer, 0); - } - ); + // Check folder devices to see if the device is used + this.systemConfigService.getFolders().subscribe( + folders => { + // Loop through all folder devices to see if the device is used + this.devices.forEach(device => { + folders.forEach(folder => { + folder.devices.forEach(fdevice => { + if (device.deviceID === fdevice.deviceID) { + device.used = true; + } + }); + }); + }); + + // See if the connection is connected or undefined + this.systemConnectionsService.getSystemConnections().subscribe( + c => { + this.sysConns = c; + + // Synchronously get the status of each device + this.getDeviceStatusInOrder(observer, 0); + } + ); + }); } ) }, diff --git a/src/app/services/in-memory-config-data.service.ts b/src/app/services/in-memory-config-data.service.ts index b9b6c8089..d44fbb50c 100644 --- a/src/app/services/in-memory-config-data.service.ts +++ b/src/app/services/in-memory-config-data.service.ts @@ -1,15 +1,16 @@ import { Injectable } from '@angular/core'; -import { config } from '../mocks/mock-system-config' -import { dbStatus } from '../mocks/mock-db-status' -import { connections } from '../mocks/mock-system-connections' -import { dbCompletion } from '../mocks/mock-db-completion' +import { config } from '../mocks/mock-system-config'; +import { dbStatus } from '../mocks/mock-db-status'; +import { connections } from '../mocks/mock-system-connections'; +import { dbCompletion } from '../mocks/mock-db-completion'; +import { systemStatus } from '../mocks/mock-system-status'; @Injectable({ providedIn: 'root' }) export class InMemoryConfigDataService { createDb() { - return { config, dbStatus, connections, dbCompletion }; + return { config, dbStatus, connections, dbCompletion, systemStatus }; } constructor() { } diff --git a/src/app/services/system-status.service.spec.ts b/src/app/services/system-status.service.spec.ts new file mode 100644 index 000000000..8b47a3a6a --- /dev/null +++ b/src/app/services/system-status.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { SystemStatusService } from './system-status.service'; + +describe('SystemStatusService', () => { + let service: SystemStatusService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(SystemStatusService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/system-status.service.ts b/src/app/services/system-status.service.ts new file mode 100644 index 000000000..b5e88f1a5 --- /dev/null +++ b/src/app/services/system-status.service.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; +import { environment } from 'src/environments/environment'; +import { apiURL, apiRetry } from '../api-utils'; +import { Observable } from 'rxjs'; +import { HttpClient } from '@angular/common/http'; +import { retry, map } from 'rxjs/operators'; +import { SystemStatus } from '../system-status'; + +@Injectable({ + providedIn: 'root' +}) +export class SystemStatusService { + + private systemStatusUrl = environment.production ? apiURL + 'rest/system/status' : 'api/systemStatus'; + + constructor(private http: HttpClient) { } + + getSystemStatus(): Observable { + return this.http + .get(this.systemStatusUrl) + .pipe( + retry(apiRetry), + map(res => { + return res; + }) + ); + } +} diff --git a/src/app/system-status.ts b/src/app/system-status.ts new file mode 100644 index 000000000..5f4be45ed --- /dev/null +++ b/src/app/system-status.ts @@ -0,0 +1,17 @@ +export interface SystemStatus { + alloc: number; + connectionServiceStatus: any; + cpuPercent: number; // allows returns 0 + discoveryEnabled: boolean; + discoveryErrors: any; + discoveryMethods: number; + goroutines: number; + lastDialStatus: any; + myID: string; + pathSeparator: string; + startTime: string; + sys: number; + themes: string[]; + tilde: string; + uptime: number; +} \ No newline at end of file From 3840d57f8d3b6f11104bd07d075df1fd05c575aa Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 27 Mar 2020 15:49:19 -0400 Subject: [PATCH 059/120] temporarily handle current device in device list --- src/app/services/device.service.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/app/services/device.service.ts b/src/app/services/device.service.ts index a988af366..f2a37d33f 100644 --- a/src/app/services/device.service.ts +++ b/src/app/services/device.service.ts @@ -39,6 +39,11 @@ export class DeviceService { } else { // Set connected device.connected = this.sysConns.connections[device.deviceID].connected; + + // TODO ? temporarily set to connected + if (device.deviceID === this.thisDevice.deviceID) { + device.connected = true; + } } this.dbCompletionService.getDeviceCompletion(device.deviceID).subscribe( From 7aca2bcbc0482dd70b71a953ed1ff142aa2769be Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 27 Mar 2020 15:49:35 -0400 Subject: [PATCH 060/120] add custom chartjs tooltip --- .../donut-chart/donut-chart.component.ts | 7 ++- src/app/charts/tooltip.ts | 62 +++++++++++++++++++ src/index.html | 3 + src/styles.scss | 24 +++++++ 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 src/app/charts/tooltip.ts diff --git a/src/app/charts/donut-chart/donut-chart.component.ts b/src/app/charts/donut-chart/donut-chart.component.ts index e75adf556..296075141 100644 --- a/src/app/charts/donut-chart/donut-chart.component.ts +++ b/src/app/charts/donut-chart/donut-chart.component.ts @@ -1,6 +1,6 @@ import { Component, Input } from '@angular/core'; import { Chart } from 'chart.js' -import { LabelOptions } from '@angular/material/core'; +import { tooltip } from '../tooltip' @Component({ selector: 'app-donut-chart', @@ -71,6 +71,11 @@ export class DonutChartComponent { responsive: false, legend: { display: false + }, + tooltips: { + // Disable the on-canvas tooltip + enabled: false, + custom: tooltip(), } } }); diff --git a/src/app/charts/tooltip.ts b/src/app/charts/tooltip.ts new file mode 100644 index 000000000..d46e33848 --- /dev/null +++ b/src/app/charts/tooltip.ts @@ -0,0 +1,62 @@ +// Adapted from https://www.chartjs.org/samples/latest/tooltips/custom-pie.html +export let tooltip: () => (tooltip: any) => void = + function (): (tooltip: any) => void { + return function (tooltip: any): void { + // Tooltip Element + const tooltipEl = document.getElementById('chartjs-tooltip'); + + // Hide if no tooltip + if (tooltip.opacity === 0) { + tooltipEl.style.opacity = '0'; + return; + } + + // Set caret Position + tooltipEl.classList.remove('above', 'below', 'no-transform'); + if (tooltip.yAlign) { + tooltipEl.classList.add(tooltip.yAlign); + } else { + tooltipEl.classList.add('no-transform'); + } + + function getBody(bodyItem) { + return bodyItem.lines; + } + + // Set Text + if (tooltip.body) { + let titleLines = tooltip.title || []; + const bodyLines = tooltip.body.map(getBody); + + let innerHtml = '
'; + + titleLines.forEach(function (title) { + innerHtml += ''; + }); + innerHtml += ''; + + bodyLines.forEach(function (body, i) { + let colors = tooltip.labelColors[i]; + let style = 'background:' + colors.backgroundColor; + style += '; border-color:' + colors.borderColor; + style += '; border-width: 2px'; + let span = ''; + innerHtml += ''; + }); + innerHtml += ''; + + let tableRoot = tooltipEl.querySelector('table'); + tableRoot.innerHTML = innerHtml; + } + + var position = this._chart.canvas.getBoundingClientRect(); + + // Display, position, and set styles for font + tooltipEl.style.opacity = '1'; + tooltipEl.style.position = 'absolute'; + tooltipEl.style.left = position.left + window.pageXOffset + tooltip.caretX + 'px'; + tooltipEl.style.top = position.top + window.pageYOffset + tooltip.caretY + 'px'; + tooltipEl.style.padding = tooltip.yPadding + 'px ' + tooltip.xPadding + 'px'; + tooltipEl.style.pointerEvents = 'none'; + } + }; \ No newline at end of file diff --git a/src/index.html b/src/index.html index 86438a1d6..fc77e57e2 100644 --- a/src/index.html +++ b/src/index.html @@ -11,6 +11,9 @@ +
+
Id{{row.id}}{{row.deviceID}}
' + title + '
' + span + body + '
+
diff --git a/src/styles.scss b/src/styles.scss index 638ff235e..ac9d610ad 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,3 +1,27 @@ +// Chart.js styles +#chartjs-tooltip { + /* max z-index value */ + z-index: 2147483647; + opacity: 0; + position: absolute; + background: rgba(0, 0, 0, .7); + color: white; + border-radius: 3px; + -webkit-transition: opacity .3s ease; + transition: opacity .3s ease; + pointer-events: none; + -webkit-transform: translate(-50%, 0); + transform: translate(-50%, 0); +} + +.chartjs-tooltip-key { + display: inline-block; + width: 10px; + height: 10px; + margin-right: 10px; +} + + // Custom Theming for Angular Material // For more information: https://material.angular.io/guide/theming @import '~@angular/material/theming'; From 7226a87c6d06fa11217b1e9feb1e4e715cabcece Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 27 Mar 2020 21:51:24 -0400 Subject: [PATCH 061/120] Create tech ui card css to replace material cards --- .../device-chart/device-chart.component.html | 10 +++++----- .../folder-chart/folder-chart.component.html | 10 +++++----- .../lists/status-list/status-list.component.html | 12 ++++++------ src/styles.scss | 14 +++++++++++++- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/app/charts/device-chart/device-chart.component.html b/src/app/charts/device-chart/device-chart.component.html index dea3ad5f2..4f8165b37 100644 --- a/src/app/charts/device-chart/device-chart.component.html +++ b/src/app/charts/device-chart/device-chart.component.html @@ -1,6 +1,6 @@ - - Devices - +
+
Devices
+
@@ -8,5 +8,5 @@
- - \ No newline at end of file +
+
\ No newline at end of file diff --git a/src/app/charts/folder-chart/folder-chart.component.html b/src/app/charts/folder-chart/folder-chart.component.html index dd0c0dcd7..afbf6959e 100644 --- a/src/app/charts/folder-chart/folder-chart.component.html +++ b/src/app/charts/folder-chart/folder-chart.component.html @@ -1,6 +1,6 @@ - - Folders - +
+
Folders
+
@@ -8,5 +8,5 @@
- - \ No newline at end of file +
+
\ No newline at end of file diff --git a/src/app/lists/status-list/status-list.component.html b/src/app/lists/status-list/status-list.component.html index 0ac37624e..35a3a0d8e 100644 --- a/src/app/lists/status-list/status-list.component.html +++ b/src/app/lists/status-list/status-list.component.html @@ -1,10 +1,10 @@ - +
- Status - +
Status
+
- +
- - \ No newline at end of file +
+
\ No newline at end of file diff --git a/src/styles.scss b/src/styles.scss index ac9d610ad..8ab16a842 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -78,6 +78,18 @@ html, body { font-family: mat-font-family($tech-ui-typography); line-height: mat-line-height($tech-ui-typography, body-1); } -.mat-card-title { + +.tui-card { + background-color: white; + border-radius: 4px; + height: 100%; +} + +.tui-card-title { + padding: 16px 16px 0 16px; font-size: mat-font-size($tech-ui-typography, subheading-2) +} + +.tui-card-content { + padding: 16px; } \ No newline at end of file From 485a23426308baaa563ffbb0c26ae10f6812d383 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 27 Mar 2020 21:51:40 -0400 Subject: [PATCH 062/120] Use flexbox for dashboard layout --- src/app/dashboard/dashboard.component.html | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html index 9b5a4a951..434d48291 100644 --- a/src/app/dashboard/dashboard.component.html +++ b/src/app/dashboard/dashboard.component.html @@ -1,15 +1,12 @@ -
-
-

Tech UI

-
-
- -
-
- + + +
+

Tech UI

+
+ +
-
-
+
\ No newline at end of file From 6158b20a8c6207c79415894b2ec0c7ee8c35e83d Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 27 Mar 2020 21:52:13 -0400 Subject: [PATCH 063/120] Style donut chart and add total count --- .../charts/device-chart/device-chart.component.ts | 5 ++++- .../charts/donut-chart/donut-chart.component.html | 5 ++++- .../charts/donut-chart/donut-chart.component.scss | 12 ++++++++++++ src/app/charts/donut-chart/donut-chart.component.ts | 3 ++- .../charts/folder-chart/folder-chart.component.ts | 5 +++++ 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/app/charts/device-chart/device-chart.component.ts b/src/app/charts/device-chart/device-chart.component.ts index 7cc70be2b..eeba45c95 100644 --- a/src/app/charts/device-chart/device-chart.component.ts +++ b/src/app/charts/device-chart/device-chart.component.ts @@ -20,9 +20,12 @@ export class DeviceChartComponent implements OnInit { ngOnInit(): void { } ngAfterViewInit(): void { + let totalCount: number = 0; this.deviceService.getAll().subscribe( device => { - console.log("device", device); + // Count the number of folders and set chart + totalCount++; + this.donutChart.count = totalCount; // Get StateType and convert to string const stateType: Device.StateType = Device.getStateType(device); diff --git a/src/app/charts/donut-chart/donut-chart.component.html b/src/app/charts/donut-chart/donut-chart.component.html index 8a3811eee..9decab29d 100644 --- a/src/app/charts/donut-chart/donut-chart.component.html +++ b/src/app/charts/donut-chart/donut-chart.component.html @@ -1 +1,4 @@ - \ No newline at end of file +
+ +
{{count}}
+
\ No newline at end of file diff --git a/src/app/charts/donut-chart/donut-chart.component.scss b/src/app/charts/donut-chart/donut-chart.component.scss index e69de29bb..74bdf8cde 100644 --- a/src/app/charts/donut-chart/donut-chart.component.scss +++ b/src/app/charts/donut-chart/donut-chart.component.scss @@ -0,0 +1,12 @@ +.chart-container { + position: relative; + } + +.center { + position: absolute; + left: 0; + top: 40%; + width: 100%; + text-align: center; + font-size: 18px; +} \ No newline at end of file diff --git a/src/app/charts/donut-chart/donut-chart.component.ts b/src/app/charts/donut-chart/donut-chart.component.ts index 296075141..25b483aa7 100644 --- a/src/app/charts/donut-chart/donut-chart.component.ts +++ b/src/app/charts/donut-chart/donut-chart.component.ts @@ -9,6 +9,7 @@ import { tooltip } from '../tooltip' }) export class DonutChartComponent { @Input() elementID: string; + count: number; private canvas: any; private ctx: any; @@ -56,7 +57,6 @@ export class DonutChartComponent { this.chart = new Chart(this.ctx, { type: 'doughnut', data: { - labels: ["Up to Date", "Syncing", "Waiting to Sync", "Out of Sync", "Failed Items"], datasets: [{ data: [], backgroundColor: [ @@ -68,6 +68,7 @@ export class DonutChartComponent { }] }, options: { + cutoutPercentage: 70, responsive: false, legend: { display: false diff --git a/src/app/charts/folder-chart/folder-chart.component.ts b/src/app/charts/folder-chart/folder-chart.component.ts index d3b184747..f34a52396 100644 --- a/src/app/charts/folder-chart/folder-chart.component.ts +++ b/src/app/charts/folder-chart/folder-chart.component.ts @@ -22,8 +22,13 @@ export class FolderChartComponent implements OnInit { } ngAfterViewInit() { + let totalCount: number = 0; this.folderService.getAll().subscribe( folder => { + // Count the number of folders and set chart + totalCount++; + this.donutChart.count = totalCount; + // Get StateType and convert to string const stateType: Folder.StateType = Folder.getStateType(folder); const state: string = Folder.stateTypeToString(stateType); From d67c9b66d347bbd4a1db72974cc33fed0caa3980 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sat, 28 Mar 2020 09:45:17 -0400 Subject: [PATCH 064/120] determine chart color based on state type --- .../device-chart/device-chart.component.ts | 5 ++- .../donut-chart/donut-chart.component.ts | 27 ++----------- .../folder-chart/folder-chart.component.ts | 6 ++- src/app/device.ts | 27 +++++++++++++ src/app/folder.ts | 38 ++++++++++++++++++- src/app/style.ts | 10 ++++- 6 files changed, 84 insertions(+), 29 deletions(-) diff --git a/src/app/charts/device-chart/device-chart.component.ts b/src/app/charts/device-chart/device-chart.component.ts index eeba45c95..703515a29 100644 --- a/src/app/charts/device-chart/device-chart.component.ts +++ b/src/app/charts/device-chart/device-chart.component.ts @@ -13,7 +13,7 @@ export class DeviceChartComponent implements OnInit { @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; chartID: string = 'devicesChart'; elevation: string = cardElevation; - states: { label: string, count: number }[] = []; + states: { label: string, count: number, color: string }[] = []; constructor(private deviceService: DeviceService) { } @@ -30,6 +30,7 @@ export class DeviceChartComponent implements OnInit { // Get StateType and convert to string const stateType: Device.StateType = Device.getStateType(device); const state: string = Device.stateTypeToString(stateType); + const color: string = Device.stateTypeToColor(stateType); // Check if state exists let found: boolean = false; @@ -41,7 +42,7 @@ export class DeviceChartComponent implements OnInit { }); if (!found) { - this.states.push({ label: state, count: 1 }); + this.states.push({ label: state, count: 1, color: color }); } this.donutChart.updateData(this.states); diff --git a/src/app/charts/donut-chart/donut-chart.component.ts b/src/app/charts/donut-chart/donut-chart.component.ts index 25b483aa7..8755bf1d4 100644 --- a/src/app/charts/donut-chart/donut-chart.component.ts +++ b/src/app/charts/donut-chart/donut-chart.component.ts @@ -17,32 +17,17 @@ export class DonutChartComponent { constructor() { } - data(val: number[]) { - if (this.chart) { - val.forEach((v) => { - this.addData(v) - }); - } - } - - updateData(data: { label: string, count: number }[]): void { - //Using object destructuring + updateData(data: { label: string, count: number, color: string }[]): void { + // Using object destructuring for (let i = 0; i < data.length; i++) { let s = data[i]; this.chart.data.labels[i] = s.label; this.chart.data.datasets[0].data[i] = s.count; + this.chart.data.datasets[0].backgroundColor[i] = s.color; } this.chart.update(); } - addData(data: number): void { - // this.chart.data.labels.push(label); - this.chart.data.datasets.forEach((dataset) => { - dataset.data.push(data); - }); - this.chart.update(); - } - removeAllData(withAnimation: boolean): void { this.chart.data.labels.pop(); this.chart.data.datasets.forEach((dataset) => { @@ -59,11 +44,7 @@ export class DonutChartComponent { data: { datasets: [{ data: [], - backgroundColor: [ - '#56C568', - 'rgba(54, 162, 235, 1)', - 'rgba(255, 206, 86, 1)' - ], + backgroundColor: [], borderWidth: 1 }] }, diff --git a/src/app/charts/folder-chart/folder-chart.component.ts b/src/app/charts/folder-chart/folder-chart.component.ts index f34a52396..de8a505ea 100644 --- a/src/app/charts/folder-chart/folder-chart.component.ts +++ b/src/app/charts/folder-chart/folder-chart.component.ts @@ -12,7 +12,7 @@ import { DonutChartComponent } from '../donut-chart/donut-chart.component'; export class FolderChartComponent implements OnInit { @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; chartID: string = 'foldersChart'; - states: { label: string, count: number }[] = []; + states: { label: string, count: number, color: string }[] = []; elevation: string = cardElevation; constructor(private folderService: FolderService) { } @@ -32,6 +32,7 @@ export class FolderChartComponent implements OnInit { // Get StateType and convert to string const stateType: Folder.StateType = Folder.getStateType(folder); const state: string = Folder.stateTypeToString(stateType); + const color: string = Folder.stateTypeToColor(stateType); // Check if state exists let found: boolean = false; @@ -43,7 +44,8 @@ export class FolderChartComponent implements OnInit { }); if (!found) { - this.states.push({ label: state, count: 1 }); + console.log(color, "look!!!") + this.states.push({ label: state, count: 1, color: color }); } this.donutChart.updateData(this.states); diff --git a/src/app/device.ts b/src/app/device.ts index 72d3d47fc..aeb70cbe2 100644 --- a/src/app/device.ts +++ b/src/app/device.ts @@ -1,3 +1,5 @@ +import { colors } from './style'; + interface Device { deviceID: string; name: string; @@ -41,6 +43,31 @@ namespace Device { } } + /** + * stateTypeToColor looks up a hex color string based on StateType + * @param s StateType + */ + export function stateTypeToColor(s: StateType): string { + switch (s) { + case StateType.Insync: + return colors.get("green"); + case StateType.UnusedInsync: + return colors.get("grey"); + case StateType.Unknown: + return colors.get("grey"); + case StateType.Syncing: + return colors.get("blue"); + case StateType.Paused: + return colors.get("grey"); + case StateType.UnusedPaused: + return colors.get("grey"); + case StateType.Disconnected: + return colors.get("yellow"); + case StateType.UnusedDisconnected: + return colors.get("grey"); + } + } + export function getStateType(d: Device): StateType { // StateType Unknown is set in DeviceService if (d.state === StateType.Unknown) { diff --git a/src/app/folder.ts b/src/app/folder.ts index da217dc28..3015c0fd2 100644 --- a/src/app/folder.ts +++ b/src/app/folder.ts @@ -1,4 +1,5 @@ import Device from './device'; +import { colors } from './style'; interface Folder { id: string; @@ -63,7 +64,42 @@ namespace Folder { } /** - * getStatusType looks at a folder and determines the correct + * stateTypeToColor looks up a hex color string based on StateType + * @param s StateType + */ + export function stateTypeToColor(s: StateType): string { + switch (s) { + case StateType.Paused: + return colors.get("grey"); + case StateType.Unknown: + return colors.get("grey"); + case StateType.Unshared: + return colors.get("grey"); + case StateType.WaitingToSync: + return colors.get("yellow"); + case StateType.Stopped: + return colors.get("grey"); + case StateType.Scanning: + return colors.get("grey"); + case StateType.Idle: + return colors.get("green"); + case StateType.LocalAdditions: + return colors.get("grey"); + case StateType.WaitingToScan: + return colors.get("grey"); + case StateType.PreparingToSync: + return colors.get("grey"); + case StateType.Syncing: + return colors.get("blue"); + case StateType.OutOfSync: + return colors.get("grey"); + case StateType.FailedItems: + return colors.get("red"); + } + } + + /** + * getStateType looks at a folder and determines the correct * StateType to return * * Possible state values from API diff --git a/src/app/style.ts b/src/app/style.ts index 67db8a077..37f3aa670 100644 --- a/src/app/style.ts +++ b/src/app/style.ts @@ -1,3 +1,11 @@ // material design elevation for all dashboard components export const cardElevation: string = "mat-elevation-z2"; -export const dataTableElevation: string = "mat-elevation-z0"; \ No newline at end of file +export const dataTableElevation: string = "mat-elevation-z0"; + +export const colors: Map = new Map([ + ["blue", "#0891D1"], + ["yellow", "#FFC400"], + ["green", "#56C568"], + ["grey", "#DDDDDD"], + ["red", "#EB5757"] +]); \ No newline at end of file From 86141c1eef54831b223fe26c0d0b2f004f3c4fbf Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sun, 29 Mar 2020 16:38:06 -0400 Subject: [PATCH 065/120] enable chart canvas responsiveness --- src/app/charts/device-chart/device-chart.component.html | 6 +++--- src/app/charts/donut-chart/donut-chart.component.html | 4 ++-- src/app/charts/donut-chart/donut-chart.component.scss | 6 ++++-- src/app/charts/donut-chart/donut-chart.component.ts | 6 +++--- src/app/charts/folder-chart/folder-chart.component.html | 6 +++--- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/app/charts/device-chart/device-chart.component.html b/src/app/charts/device-chart/device-chart.component.html index 4f8165b37..8f74dd7e9 100644 --- a/src/app/charts/device-chart/device-chart.component.html +++ b/src/app/charts/device-chart/device-chart.component.html @@ -1,9 +1,9 @@
Devices
-
- -
+
+ +
diff --git a/src/app/charts/donut-chart/donut-chart.component.html b/src/app/charts/donut-chart/donut-chart.component.html index 9decab29d..88e37515c 100644 --- a/src/app/charts/donut-chart/donut-chart.component.html +++ b/src/app/charts/donut-chart/donut-chart.component.html @@ -1,4 +1,4 @@ -
- +
+
{{count}}
\ No newline at end of file diff --git a/src/app/charts/donut-chart/donut-chart.component.scss b/src/app/charts/donut-chart/donut-chart.component.scss index 74bdf8cde..30348140f 100644 --- a/src/app/charts/donut-chart/donut-chart.component.scss +++ b/src/app/charts/donut-chart/donut-chart.component.scss @@ -1,6 +1,8 @@ .chart-container { position: relative; - } + width: 100%; + height: 100%; + } .center { position: absolute; @@ -8,5 +10,5 @@ top: 40%; width: 100%; text-align: center; - font-size: 18px; + font-size:1.8rem; } \ No newline at end of file diff --git a/src/app/charts/donut-chart/donut-chart.component.ts b/src/app/charts/donut-chart/donut-chart.component.ts index 8755bf1d4..4d7268feb 100644 --- a/src/app/charts/donut-chart/donut-chart.component.ts +++ b/src/app/charts/donut-chart/donut-chart.component.ts @@ -49,8 +49,8 @@ export class DonutChartComponent { }] }, options: { - cutoutPercentage: 70, - responsive: false, + cutoutPercentage: 75, + responsive: true, legend: { display: false }, @@ -62,4 +62,4 @@ export class DonutChartComponent { } }); } -} +} \ No newline at end of file diff --git a/src/app/charts/folder-chart/folder-chart.component.html b/src/app/charts/folder-chart/folder-chart.component.html index afbf6959e..3e0f7170f 100644 --- a/src/app/charts/folder-chart/folder-chart.component.html +++ b/src/app/charts/folder-chart/folder-chart.component.html @@ -1,9 +1,9 @@
Folders
-
- -
+
+ +
From c382aa04e4fa3805f2a3701e9aa9c2622f5fd324 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sun, 29 Mar 2020 17:45:08 -0400 Subject: [PATCH 066/120] right justify chart items --- src/app/charts/device-chart/device-chart.component.html | 2 +- src/app/charts/folder-chart/folder-chart.component.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/charts/device-chart/device-chart.component.html b/src/app/charts/device-chart/device-chart.component.html index 8f74dd7e9..f8225dd75 100644 --- a/src/app/charts/device-chart/device-chart.component.html +++ b/src/app/charts/device-chart/device-chart.component.html @@ -3,7 +3,7 @@
-
+
diff --git a/src/app/charts/folder-chart/folder-chart.component.html b/src/app/charts/folder-chart/folder-chart.component.html index 3e0f7170f..6a8b23725 100644 --- a/src/app/charts/folder-chart/folder-chart.component.html +++ b/src/app/charts/folder-chart/folder-chart.component.html @@ -3,7 +3,7 @@
-
+
From e5b85ff1a035dd851c5599b651e7ce6369c7e5b4 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 30 Mar 2020 11:54:24 -0400 Subject: [PATCH 067/120] update angular cli, devkit and node --- package-lock.json | 2794 ++++++++++++++++++++++++++++----------------- package.json | 6 +- 2 files changed, 1723 insertions(+), 1077 deletions(-) diff --git a/package-lock.json b/package-lock.json index 31a6d9536..ecd0ee68a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,199 +5,244 @@ "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "0.900.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.900.5.tgz", - "integrity": "sha512-4du29cYI5awsZ34xoS9WWSbEv7HazIlsQWaee/fRdvv4WmyB1w6geLMLHveGT2cYL/lhxsMUdYyDMa6sXcYeFA==", + "version": "0.901.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.901.0.tgz", + "integrity": "sha512-SlqEBkPrT40zMCy5344AsUqC76pEPCaGPaAkCIvadaz2dC9vNMzQrvubCPJHViD/TumkSX1kYmLS3iYASVM9GQ==", "dev": true, "requires": { - "@angular-devkit/core": "9.0.5", - "rxjs": "6.5.3" - }, - "dependencies": { - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } + "@angular-devkit/core": "9.1.0", + "rxjs": "6.5.4" } }, "@angular-devkit/build-angular": { - "version": "0.900.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.900.5.tgz", - "integrity": "sha512-WCfmQNTzQNgdh8baeNJm5uIhXbWp62e+upsZzh6eJ1ZrIeJSPJxE5mI1VvqBoAQH3hKjuAaAW3axpWGar4kJjw==", + "version": "0.901.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.901.0.tgz", + "integrity": "sha512-ftJVNlKvIomqRfr5jFVraPqlLSUJu8YyVbFv/aCsvhNpuZGkYpTOMoJDwyywdslSTH608BIoU63IAnIz9PwUdw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.900.5", - "@angular-devkit/build-optimizer": "0.900.5", - "@angular-devkit/build-webpack": "0.900.5", - "@angular-devkit/core": "9.0.5", - "@babel/core": "7.7.7", - "@babel/generator": "7.7.7", - "@babel/preset-env": "7.7.7", - "@ngtools/webpack": "9.0.5", - "ajv": "6.10.2", - "autoprefixer": "9.7.1", + "@angular-devkit/architect": "0.901.0", + "@angular-devkit/build-optimizer": "0.901.0", + "@angular-devkit/build-webpack": "0.901.0", + "@angular-devkit/core": "9.1.0", + "@babel/core": "7.9.0", + "@babel/generator": "7.9.3", + "@babel/preset-env": "7.9.0", + "@babel/template": "7.8.6", + "@jsdevtools/coverage-istanbul-loader": "3.0.3", + "@ngtools/webpack": "9.1.0", + "ajv": "6.12.0", + "autoprefixer": "9.7.4", "babel-loader": "8.0.6", - "browserslist": "4.8.3", - "cacache": "13.0.1", - "caniuse-lite": "1.0.30001020", + "browserslist": "^4.9.1", + "cacache": "15.0.0", + "caniuse-lite": "^1.0.30001032", "circular-dependency-plugin": "5.2.0", "copy-webpack-plugin": "5.1.1", "core-js": "3.6.4", - "coverage-istanbul-loader": "2.0.3", "cssnano": "4.1.10", - "file-loader": "4.2.0", - "find-cache-dir": "3.0.0", - "glob": "7.1.5", - "jest-worker": "24.9.0", + "file-loader": "6.0.0", + "find-cache-dir": "3.3.1", + "glob": "7.1.6", + "jest-worker": "25.1.0", "karma-source-map-support": "1.4.0", - "less": "3.10.3", + "less": "3.11.1", "less-loader": "5.0.0", - "license-webpack-plugin": "2.1.3", - "loader-utils": "1.2.3", - "magic-string": "0.25.4", - "mini-css-extract-plugin": "0.8.0", + "license-webpack-plugin": "2.1.4", + "loader-utils": "2.0.0", + "mini-css-extract-plugin": "0.9.0", "minimatch": "3.0.4", - "open": "7.0.0", + "open": "7.0.3", "parse5": "4.0.0", - "postcss": "7.0.21", + "postcss": "7.0.27", "postcss-import": "12.0.1", "postcss-loader": "3.0.0", - "raw-loader": "3.1.0", - "regenerator-runtime": "0.13.3", - "rimraf": "3.0.0", - "rollup": "1.25.2", - "rxjs": "6.5.3", - "sass": "1.23.3", - "sass-loader": "8.0.0", - "semver": "6.3.0", + "raw-loader": "4.0.0", + "regenerator-runtime": "0.13.5", + "rimraf": "3.0.2", + "rollup": "2.1.0", + "rxjs": "6.5.4", + "sass": "1.26.3", + "sass-loader": "8.0.2", + "semver": "7.1.3", "source-map": "0.7.3", "source-map-loader": "0.2.4", "source-map-support": "0.5.16", "speed-measure-webpack-plugin": "1.3.1", - "style-loader": "1.0.0", + "style-loader": "1.1.3", "stylus": "0.54.7", "stylus-loader": "3.0.2", - "terser": "4.5.1", - "terser-webpack-plugin": "2.3.3", + "terser": "4.6.7", + "terser-webpack-plugin": "2.3.5", "tree-kill": "1.2.2", - "webpack": "4.41.2", + "webpack": "4.42.0", "webpack-dev-middleware": "3.7.2", - "webpack-dev-server": "3.9.0", + "webpack-dev-server": "3.10.3", "webpack-merge": "4.2.2", "webpack-sources": "1.4.3", - "webpack-subresource-integrity": "1.3.4", - "worker-plugin": "3.2.0" + "webpack-subresource-integrity": "1.4.0", + "worker-plugin": "4.0.2" }, "dependencies": { - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "@babel/generator": { + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", + "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", "dev": true, "requires": { - "tslib": "^1.9.0" + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } + }, + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true } } }, "@angular-devkit/build-optimizer": { - "version": "0.900.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.900.5.tgz", - "integrity": "sha512-BdmvD58DnAAf6/o/fRzU2l+2g4IwuIJf8x/rd9AGWd7fHrcwgJDhB9rYetB7JqYR8uOWk+AFElDpvNOj8YUy0w==", + "version": "0.901.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.901.0.tgz", + "integrity": "sha512-Y9sz8uf2zjilhPUVYb0K9Mio6c1d5c+csuDc15CCKzELXJwyyDxilIFgn6Eu+edM0HNQGzbIwkjy4DkR9mtuTQ==", "dev": true, "requires": { - "loader-utils": "1.2.3", + "loader-utils": "2.0.0", "source-map": "0.7.3", - "tslib": "1.10.0", - "typescript": "3.6.4", + "tslib": "1.11.1", + "typescript": "3.8.3", "webpack-sources": "1.4.3" }, "dependencies": { - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - }, "typescript": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", - "integrity": "sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.900.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.900.5.tgz", - "integrity": "sha512-4fYZNg8X73wTjlXV37m0BRVMa27GSwhAupgv5cb9Q3Vys9sYxEUL+GJetXDxypA5YbMj5xX/xqyU9TPtvXhgRg==", + "version": "0.901.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.901.0.tgz", + "integrity": "sha512-Oze0VzIvHnoW12C80fiNH4HBu/GWmhJPXdNA7nRkU/tBQlIKnfngf8rQ0QbgecN2qdEXQpZJsP/XclTi3zugsg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.900.5", - "@angular-devkit/core": "9.0.5", - "rxjs": "6.5.3" - }, - "dependencies": { - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } + "@angular-devkit/architect": "0.901.0", + "@angular-devkit/core": "9.1.0", + "rxjs": "6.5.4" } }, "@angular-devkit/core": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.0.5.tgz", - "integrity": "sha512-9TPQPzfSRbV5wVEnfo1d1CS+oVXROfE7VnBRuRMilFnNhuc29wX3zvBQRTreDVyxJetLBEb9sRlcKYGaJzpKPw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.1.0.tgz", + "integrity": "sha512-vHTsrB4JaVUQ95FRnKrgo79Y3F6FokImrZdrmwkQmwAThpjXeXmpUEKZS+ZSTFRgesjiIysVGOFijARP4BQ7Bg==", "dev": true, "requires": { - "ajv": "6.10.2", - "fast-json-stable-stringify": "2.0.0", - "magic-string": "0.25.4", - "rxjs": "6.5.3", + "ajv": "6.12.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.5.4", "source-map": "0.7.3" }, "dependencies": { - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { - "tslib": "^1.9.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "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 + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" } } } }, "@angular-devkit/schematics": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.0.5.tgz", - "integrity": "sha512-PbOYoy4YyEbR6f1jO18Rt3fJuyaaTJ3bFmws5qWGGNK2yZiP/hnSaM3VffOwoL4sgyKkI2FNKSPiQZgTl8b0Tg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-9.1.0.tgz", + "integrity": "sha512-cb9PSvskMwWlL54fPfCcpJoyNDWAX6Wo7CzL5qpIB2cJCPLAuyfRUYYrkO77YUST+n2HvypHz0cZ5SNGMfaaBQ==", "dev": true, "requires": { - "@angular-devkit/core": "9.0.5", - "ora": "4.0.2", - "rxjs": "6.5.3" - }, - "dependencies": { - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - } + "@angular-devkit/core": "9.1.0", + "ora": "4.0.3", + "rxjs": "6.5.4" } }, "@angular/animations": { @@ -222,31 +267,31 @@ } }, "@angular/cli": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.0.5.tgz", - "integrity": "sha512-hRGpmIwnm908eW5sA4zrVkCGaIUHYLSNu5koaLulK0jj5Iy+vkieDiBuAkD2uVvG7M59s4s4u+L0DMetIpvZQg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-9.1.0.tgz", + "integrity": "sha512-ofum4gPE/W3fKyzuJrpdHeOS0ZL8x0eYCgsrMyUoFodSpb5LWPqeW+56NgDTpIeny+Trx3pM9dr9QTUVTJ0vYg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.900.5", - "@angular-devkit/core": "9.0.5", - "@angular-devkit/schematics": "9.0.5", - "@schematics/angular": "9.0.5", - "@schematics/update": "0.900.5", + "@angular-devkit/architect": "0.901.0", + "@angular-devkit/core": "9.1.0", + "@angular-devkit/schematics": "9.1.0", + "@schematics/angular": "9.1.0", + "@schematics/update": "0.901.0", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", - "debug": "^4.1.1", + "debug": "4.1.1", "ini": "1.3.5", - "inquirer": "7.0.0", - "npm-package-arg": "6.1.1", - "npm-pick-manifest": "3.0.2", - "open": "7.0.0", - "pacote": "9.5.8", + "inquirer": "7.1.0", + "npm-package-arg": "8.0.1", + "npm-pick-manifest": "6.0.0", + "open": "7.0.3", + "pacote": "11.1.4", "read-package-tree": "5.3.1", - "rimraf": "3.0.0", - "semver": "6.3.0", + "rimraf": "3.0.2", + "semver": "7.1.3", "symbol-observable": "1.2.0", - "universal-analytics": "^0.4.20", - "uuid": "^3.3.2" + "universal-analytics": "0.4.20", + "uuid": "7.0.2" }, "dependencies": { "ansi-colors": { @@ -254,6 +299,18 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + }, + "uuid": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz", + "integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw==", + "dev": true } } }, @@ -418,35 +475,93 @@ "@babel/highlight": "^7.8.3" } }, - "@babel/core": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.7.tgz", - "integrity": "sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ==", + "@babel/compat-data": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz", + "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.7", - "@babel/helpers": "^7.7.4", - "@babel/parser": "^7.7.7", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4", + "browserslist": "^4.9.1", + "invariant": "^2.2.4", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "json5": "^2.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "@babel/generator": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } }, "semver": { @@ -502,26 +617,82 @@ "@babel/types": "^7.8.3" } }, - "@babel/helper-call-delegate": { + "@babel/helper-compilation-targets": { "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz", - "integrity": "sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ==", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", + "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.7" + "@babel/compat-data": "^7.8.6", + "browserslist": "^4.9.1", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.6.tgz", - "integrity": "sha512-bPyujWfsHhV/ztUkwGHz/RPV1T1TDEsSZDsN42JPehndA+p1KKTh3npvTadux0ZhCrytx9tvjpWNowKby3tM6A==", + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", + "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.6.0" + "regexpu-core": "^4.7.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + } } }, "@babel/helper-define-map": { @@ -593,9 +764,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz", - "integrity": "sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.8.3", @@ -603,8 +774,21 @@ "@babel/helper-simple-access": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", "@babel/template": "^7.8.6", - "@babel/types": "^7.8.6", + "@babel/types": "^7.9.0", "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-optimise-call-expression": { @@ -675,6 +859,12 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, "@babel/helper-wrap-function": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", @@ -688,14 +878,68 @@ } }, "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", "dev": true, "requires": { "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "dev": true, + "requires": { + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/highlight": { @@ -746,10 +990,30 @@ "@babel/plugin-syntax-json-strings": "^7.8.0" } }, - "@babel/plugin-proposal-object-rest-spread": { + "@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz", + "integrity": "sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", @@ -766,13 +1030,23 @@ "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", - "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", + "@babel/plugin-proposal-optional-chaining": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", + "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", + "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.8", "@babel/helper-plugin-utils": "^7.8.3" } }, @@ -803,6 +1077,24 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, "@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", @@ -821,6 +1113,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, "@babel/plugin-syntax-top-level-await": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", @@ -870,9 +1171,9 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.6.tgz", - "integrity": "sha512-k9r8qRay/R6v5aWZkrEclEhKO6mc1CCQr2dLsVHBmOQiMpN6I2bpjX3vgnldUWeEI1GHVNByULVxZ4BdP4Hmdg==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz", + "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", @@ -895,9 +1196,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", - "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz", + "integrity": "sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" @@ -933,9 +1234,9 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.6.tgz", - "integrity": "sha512-M0pw4/1/KI5WAxPsdcUL/w2LJ7o89YHN3yLkzNjg7Yl15GlVGgzHyCU+FMeAxevHGsLVmUqbirlUIKTafPmzdw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", + "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" @@ -970,47 +1271,47 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", - "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz", + "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", - "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", + "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", "@babel/helper-simple-access": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", - "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz", + "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", - "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", + "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3" } }, @@ -1043,12 +1344,11 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.7.tgz", - "integrity": "sha512-brYWaEPTRimOctz2NDA3jnBbDi7SVN2T4wYuu0aqSzxC3nozFZngGaw29CJ9ZPweB7k+iFmZuoG3IVPIcXmD2g==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz", + "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.8.7", "@babel/helper-get-function-arity": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" } @@ -1138,64 +1438,84 @@ } }, "@babel/preset-env": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.7.tgz", - "integrity": "sha512-pCu0hrSSDVI7kCVUOdcMNQEbOPJ52E+LrQ14sN8uL2ALfSqePZQlKrOy+tM4uhEdYlCHi4imr8Zz2cZe9oSdIg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", + "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.7.4", - "@babel/plugin-proposal-dynamic-import": "^7.7.4", - "@babel/plugin-proposal-json-strings": "^7.7.4", - "@babel/plugin-proposal-object-rest-spread": "^7.7.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.7.7", - "@babel/plugin-syntax-async-generators": "^7.7.4", - "@babel/plugin-syntax-dynamic-import": "^7.7.4", - "@babel/plugin-syntax-json-strings": "^7.7.4", - "@babel/plugin-syntax-object-rest-spread": "^7.7.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", - "@babel/plugin-syntax-top-level-await": "^7.7.4", - "@babel/plugin-transform-arrow-functions": "^7.7.4", - "@babel/plugin-transform-async-to-generator": "^7.7.4", - "@babel/plugin-transform-block-scoped-functions": "^7.7.4", - "@babel/plugin-transform-block-scoping": "^7.7.4", - "@babel/plugin-transform-classes": "^7.7.4", - "@babel/plugin-transform-computed-properties": "^7.7.4", - "@babel/plugin-transform-destructuring": "^7.7.4", - "@babel/plugin-transform-dotall-regex": "^7.7.7", - "@babel/plugin-transform-duplicate-keys": "^7.7.4", - "@babel/plugin-transform-exponentiation-operator": "^7.7.4", - "@babel/plugin-transform-for-of": "^7.7.4", - "@babel/plugin-transform-function-name": "^7.7.4", - "@babel/plugin-transform-literals": "^7.7.4", - "@babel/plugin-transform-member-expression-literals": "^7.7.4", - "@babel/plugin-transform-modules-amd": "^7.7.5", - "@babel/plugin-transform-modules-commonjs": "^7.7.5", - "@babel/plugin-transform-modules-systemjs": "^7.7.4", - "@babel/plugin-transform-modules-umd": "^7.7.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", - "@babel/plugin-transform-new-target": "^7.7.4", - "@babel/plugin-transform-object-super": "^7.7.4", - "@babel/plugin-transform-parameters": "^7.7.7", - "@babel/plugin-transform-property-literals": "^7.7.4", - "@babel/plugin-transform-regenerator": "^7.7.5", - "@babel/plugin-transform-reserved-words": "^7.7.4", - "@babel/plugin-transform-shorthand-properties": "^7.7.4", - "@babel/plugin-transform-spread": "^7.7.4", - "@babel/plugin-transform-sticky-regex": "^7.7.4", - "@babel/plugin-transform-template-literals": "^7.7.4", - "@babel/plugin-transform-typeof-symbol": "^7.7.4", - "@babel/plugin-transform-unicode-regex": "^7.7.4", - "@babel/types": "^7.7.4", - "browserslist": "^4.6.0", - "core-js-compat": "^3.6.0", + "@babel/compat-data": "^7.9.0", + "@babel/helper-compilation-targets": "^7.8.7", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.9.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.9.0", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.9.0", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.9.0", + "@babel/plugin-transform-modules-commonjs": "^7.9.0", + "@babel/plugin-transform-modules-systemjs": "^7.9.0", + "@babel/plugin-transform-modules-umd": "^7.9.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.7", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.9.0", + "browserslist": "^4.9.1", + "core-js-compat": "^3.6.2", "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", + "levenary": "^1.1.1", "semver": "^5.5.0" }, "dependencies": { + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -1204,21 +1524,26 @@ } } }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, "@babel/runtime": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.7.tgz", - "integrity": "sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz", - "integrity": "sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g==", - "dev": true - } } }, "@babel/template": { @@ -1286,91 +1611,157 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, - "@ngtools/webpack": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.0.5.tgz", - "integrity": "sha512-xe0rGpme04MNRK/PpPOx8cza9k8F/XuAOmxC3Tk4dIgigqIzYsP6v6N/At8vPRDrf88X4ZyR94lL5RrUYf/KNQ==", + "@jsdevtools/coverage-istanbul-loader": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.3.tgz", + "integrity": "sha512-TAdNkeGB5Fe4Og+ZkAr1Kvn9by2sfL44IAHFtxlh1BA1XJ5cLpO9iSNki5opWESv3l3vSHsZ9BNKuqFKbEbFaA==", "dev": true, "requires": { - "@angular-devkit/core": "9.0.5", - "enhanced-resolve": "4.1.1", - "rxjs": "6.5.3", - "webpack-sources": "1.4.3" + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.1", + "loader-utils": "^1.4.0", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.6.4" }, "dependencies": { - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "tslib": "^1.9.0" + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } } } }, + "@ngtools/webpack": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.1.0.tgz", + "integrity": "sha512-kQ+1N/F+5tuUXiiaoqJwhcOIM0I93EEvF3xwpTLRm91wl2i8R1261LvsD/uQPrgLrZNGR6eFhFF1Izn2PnIjQA==", + "dev": true, + "requires": { + "@angular-devkit/core": "9.1.0", + "enhanced-resolve": "4.1.1", + "rxjs": "6.5.4", + "webpack-sources": "1.4.3" + } + }, + "@npmcli/ci-detect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.2.0.tgz", + "integrity": "sha512-JtktVH7ASBVIWsQTFlFpeOzhBJskvoBCTfeeRhhZy7ybATcUvwiwotZ8j5rkqUUyB69lIy/AvboiiiGBjYBKBA==", + "dev": true + }, + "@npmcli/git": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.1.tgz", + "integrity": "sha512-hVatexiBtx71F01Ars38Hr5AFUGmJgHAfQtRlO5fJlnAawRGSXwEFgjB5i3XdUUmElZU/RXy7fefN02dZKxgPw==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^1.1.0", + "mkdirp": "^1.0.3", + "npm-pick-manifest": "^6.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "unique-filename": "^1.1.1", + "which": "^2.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", + "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1", + "read-package-json-fast": "^1.1.1", + "readdir-scoped-modules": "^1.1.0" + } + }, + "@npmcli/promise-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.1.0.tgz", + "integrity": "sha512-FwbuYN9KXBkloLeIR3xRgI8dyOdfK/KzaJlChszNuwmUXD1lHXfLlSeo4n4KrKt2udIK9K9/TzlnyCA3ubM2fA==", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, "@schematics/angular": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.0.5.tgz", - "integrity": "sha512-OUCC5J5+9v2tc3O/GL+2E9LfIXeqYCo/gdOTgb+jSos0aQQ7wnXOmufuoOsgt0KrWpAt34MIBktLNUF1n+RgcQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-9.1.0.tgz", + "integrity": "sha512-qkehaITQ1S1udfnnBY5CXGWnk1iVFI8cZayjLUlRfD5w+6v9if3VIuqPssX96MqvkbjyRu1N214+ieaawzLmuA==", "dev": true, "requires": { - "@angular-devkit/core": "9.0.5", - "@angular-devkit/schematics": "9.0.5" + "@angular-devkit/core": "9.1.0", + "@angular-devkit/schematics": "9.1.0" } }, "@schematics/update": { - "version": "0.900.5", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.900.5.tgz", - "integrity": "sha512-Nte+9DfQHQkrgqZPX1viccs6UXL+FDGHkTIB/KTisJAvC4s+o9hjKAoCldWBsPi9/p5rXPNZ+EWmXx7vSLGSNQ==", + "version": "0.901.0", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.901.0.tgz", + "integrity": "sha512-u2VESL1dgOSGZK/wcWEz0WcCU/yv764zhzCQerCwUtbV1CISSSDZ6x+prVYDXOdxWBGtDos2MbCF3GEJJI1T+w==", "dev": true, "requires": { - "@angular-devkit/core": "9.0.5", - "@angular-devkit/schematics": "9.0.5", + "@angular-devkit/core": "9.1.0", + "@angular-devkit/schematics": "9.1.0", "@yarnpkg/lockfile": "1.1.0", "ini": "1.3.5", - "npm-package-arg": "^7.0.0", - "pacote": "9.5.8", - "rxjs": "6.5.3", - "semver": "6.3.0", + "npm-package-arg": "^8.0.0", + "pacote": "11.1.4", + "rxjs": "6.5.4", + "semver": "7.1.3", "semver-intersect": "1.4.0" }, "dependencies": { - "npm-package-arg": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz", - "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==", - "dev": true, - "requires": { - "hosted-git-info": "^3.0.2", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "rxjs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", - "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true } } }, - "@types/estree": { - "version": "0.0.42", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.42.tgz", - "integrity": "sha512-K1DPVvnBCPxzD+G51/cxVIoc2X8uUVl1zpJeE6iKcgHMj4+tbat5Xu4TjV7v2QSDbIeAfLi2hIk+u2+s0MlpUQ==", + "@tootallnate/once": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", + "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, "@types/events": { @@ -1436,9 +1827,9 @@ "dev": true }, "@types/webpack-sources": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.6.tgz", - "integrity": "sha512-FtAWR7wR5ocJ9+nP137DV81tveD/ZgB1sadnJ/axUGM3BUVfRPx8oQNMtv3JNfTeHx3VP7cXiyfR/jmtEsVHsQ==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.7.tgz", + "integrity": "sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw==", "dev": true, "requires": { "@types/node": "*", @@ -1648,16 +2039,6 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -1714,11 +2095,13 @@ } }, "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.0.tgz", + "integrity": "sha512-CW/n1wxF8RpEuuiq6Vbn9S8m0VSYDMnZESqaJ6F2cWN9fY8rei2qaxweIaRgq+ek8TqfoFIsUjaGNKGGEHElSg==", "dev": true, "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", "humanize-ms": "^1.2.1" } }, @@ -2069,17 +2452,17 @@ "dev": true }, "autoprefixer": { - "version": "9.7.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", - "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", + "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", "dev": true, "requires": { - "browserslist": "^4.7.2", - "caniuse-lite": "^1.0.30001006", + "browserslist": "^4.8.3", + "caniuse-lite": "^1.0.30001020", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.21", + "postcss": "^7.0.26", "postcss-value-parser": "^4.0.2" } }, @@ -2154,6 +2537,26 @@ "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } } } }, @@ -2504,14 +2907,15 @@ } }, "browserslist": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", - "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.0.tgz", + "integrity": "sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001017", - "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.44" + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.380", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" } }, "browserstack": { @@ -2616,31 +3020,36 @@ "dev": true }, "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.0.tgz", + "integrity": "sha512-L0JpXHhplbJSiDGzyJJnJCTL7er7NzbBgxzVqLswEb4bO91Zbv17OUMuUeu/q0ZwKn3V+1HM4wb9tO4eVE/K8g==", "dev": true, "requires": { "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", "fs-minipass": "^2.0.0", "glob": "^7.1.4", - "graceful-fs": "^4.2.2", "infer-owner": "^1.0.4", "lru-cache": "^5.1.1", - "minipass": "^3.0.0", + "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", + "mkdirp": "^1.0.3", "move-concurrently": "^1.0.1", "p-map": "^3.0.0", "promise-inflight": "^1.0.1", "rimraf": "^2.7.1", - "ssri": "^7.0.0", + "ssri": "^8.0.0", + "tar": "^6.0.1", "unique-filename": "^1.1.1" }, "dependencies": { + "mkdirp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "dev": true + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -2723,9 +3132,9 @@ "integrity": "sha512-2ZReq+OHqHhsIQSiv8OVNhQ6Ht9eYJpwblZydHV8nI44Od6J5YUl3J9Wxvjry/v969jCHH5fR9+C6FwJ41XbOQ==" }, "caniuse-lite": { - "version": "1.0.30001020", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz", - "integrity": "sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA==", + "version": "1.0.30001038", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz", + "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ==", "dev": true }, "canonical-path": { @@ -3780,9 +4189,9 @@ }, "dependencies": { "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { "bluebird": "^3.5.5", @@ -3813,6 +4222,26 @@ "pkg-dir": "^3.0.0" } }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -3822,6 +4251,17 @@ "glob": "^7.1.3" } }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -3874,31 +4314,6 @@ "parse-json": "^4.0.0" } }, - "coverage-istanbul-loader": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/coverage-istanbul-loader/-/coverage-istanbul-loader-2.0.3.tgz", - "integrity": "sha512-LiGRvyIuzVYs3M1ZYK1tF0HekjH0DJ8zFdUwAZq378EJzqOgToyb1690dp3TAUlP6Y+82uu42LRjuROVeJ54CA==", - "dev": true, - "requires": { - "convert-source-map": "^1.7.0", - "istanbul-lib-instrument": "^4.0.0", - "loader-utils": "^1.2.3", - "merge-source-map": "^1.1.0", - "schema-utils": "^2.6.1" - }, - "dependencies": { - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } - } - }, "cp": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/cp/-/cp-0.1.1.tgz", @@ -4172,12 +4587,36 @@ "dev": true }, "csso": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", - "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", "dev": true, "requires": { - "css-tree": "1.0.0-alpha.37" + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "dev": true + }, + "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 + } } }, "custom-event": { @@ -4770,9 +5209,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.374", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.374.tgz", - "integrity": "sha512-M4Y9onOJ4viRk3A4M/LH+r9+1zQioRZJvGJn/S/o7KaBJQLgFiaHMUlDwM0QMJd5ki6hFxKiWdC6jp5Ub0zMmw==", + "version": "1.3.390", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.390.tgz", + "integrity": "sha512-4RvbM5x+002gKI8sltkqWEk5pptn0UnzekUx8RTThAMPDSb8jjpm6SwGiSnEve7f85biyZl8DMXaipaCxDjXag==", "dev": true }, "elliptic": { @@ -4802,9 +5241,9 @@ "dev": true }, "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, "encodeurl": { @@ -4818,6 +5257,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "dev": true, + "optional": true, "requires": { "iconv-lite": "~0.4.13" } @@ -4993,9 +5433,9 @@ } }, "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", @@ -5477,9 +5917,9 @@ } }, "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, "figures": { @@ -5492,25 +5932,13 @@ } }, "file-loader": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.2.0.tgz", - "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", + "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", "dev": true, "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - } + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.5" } }, "file-uri-to-path": { @@ -5572,13 +6000,13 @@ } }, "find-cache-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz", - "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "dev": true, "requires": { "commondir": "^1.0.1", - "make-dir": "^3.0.0", + "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" }, "dependencies": { @@ -5861,10 +6289,10 @@ "resolved": "https://registry.npmjs.org/generator-supported/-/generator-supported-0.0.1.tgz", "integrity": "sha1-kivSIBpsONj6y4FdWT2KA8iYwpk=" }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", "dev": true }, "get-caller-file": { @@ -6018,9 +6446,9 @@ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "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 }, "har-schema": { @@ -6233,9 +6661,9 @@ "dev": true }, "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "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 }, "http-deceiver": { @@ -6283,29 +6711,24 @@ } }, "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "agent-base": "4", - "debug": "3.1.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", "dev": true, "requires": { - "ms": "2.0.0" + "debug": "4" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, @@ -6505,23 +6928,23 @@ "dev": true }, "inquirer": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", - "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", + "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.15", "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" }, "dependencies": { @@ -6531,6 +6954,47 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, "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", @@ -6546,34 +7010,24 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } @@ -6743,6 +7197,12 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "dev": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -6776,6 +7236,12 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -7115,22 +7581,28 @@ "dev": true }, "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", + "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", "dev": true, "requires": { "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" + "supports-color": "^7.0.0" }, "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } @@ -7140,12 +7612,6 @@ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=" }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7180,6 +7646,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.2.0.tgz", + "integrity": "sha512-2tLgY7LRNZ9Hd6gmCuBG5/OjRHQpSgJQqJoYyLLOhUgn8LdOYrjaZLcxkWnDads+AD/haWWioPNziXQcgvQJ/g==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -7205,12 +7677,12 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "jsonfile": { @@ -7405,9 +7877,9 @@ } }, "less": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/less/-/less-3.10.3.tgz", - "integrity": "sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz", + "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==", "dev": true, "requires": { "clone": "^2.1.2", @@ -7418,7 +7890,8 @@ "mkdirp": "^0.5.0", "promise": "^7.1.1", "request": "^2.83.0", - "source-map": "~0.6.0" + "source-map": "~0.6.0", + "tslib": "^1.10.0" }, "dependencies": { "source-map": { @@ -7439,6 +7912,43 @@ "clone": "^2.1.1", "loader-utils": "^1.1.0", "pify": "^4.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" } }, "levn": { @@ -7451,9 +7961,9 @@ } }, "license-webpack-plugin": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.3.tgz", - "integrity": "sha512-vTSY5r9HOq4sxR2BIxdIXWKI+9n3b+DoQkhKHedB3TdSxTfXUDRxKXdAj5iejR+qNXprXsxvEu9W+zOhgGIkAw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.4.tgz", + "integrity": "sha512-1Xq72fmPbTg5KofXs+yI5L4QqPFjQ6mZxoeI6D7gfiEDOtaEIk6PGrdLaej90bpDqKNHNxlQ/MW4tMAL6xMPJQ==", "dev": true, "requires": { "@types/webpack-sources": "^0.1.5", @@ -7476,14 +7986,14 @@ "dev": true }, "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", "dev": true, "requires": { "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } }, "locate-path": { @@ -7613,63 +8123,45 @@ "dev": true }, "make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.4.tgz", + "integrity": "sha512-hIFoqGq1db0QMiy/Atr/pI1Rs4rDV+ZdGSey2SQyF3KK3u1z4aj9mS5UdNnZkdQpA+H3pGn0J3KlEwsi2x4EqA==", "dev": true, "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", + "agentkeepalive": "^4.1.0", + "cacache": "^15.0.0", + "http-cache-semantics": "^4.0.4", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.1.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" }, "dependencies": { - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "agent-base": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", "dev": true, "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "debug": "4" } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, "requires": { - "glob": "^7.1.3" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" + "agent-base": "6", + "debug": "4" } } } @@ -7939,9 +8431,9 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", - "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -7950,6 +8442,26 @@ "webpack-sources": "^1.1.0" }, "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "normalize-url": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", @@ -7961,6 +8473,17 @@ "query-string": "^4.1.0", "sort-keys": "^1.0.0" } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } } } }, @@ -7985,9 +8508,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "minipass": { @@ -8008,6 +8531,19 @@ "minipass": "^3.0.0" } }, + "minipass-fetch": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.2.1.tgz", + "integrity": "sha512-ssHt0dkljEDaKmTgQ04DQgx2ag6G2gMPxA5hpcsoeTbfDgRf2fC2gNSRc6kISjD7ckCpHwwQvXxuTBK8402fXg==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-pipeline": "^1.2.2", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, "minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -8017,6 +8553,16 @@ "minipass": "^3.0.0" } }, + "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, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, "minipass-pipeline": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", @@ -8026,31 +8572,23 @@ "minipass": "^3.0.0" } }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "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, "requires": { - "minipass": "^2.9.0" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" } }, "mississippi": { @@ -8223,17 +8761,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-fetch-npm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", - "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } - }, "node-forge": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", @@ -8280,13 +8807,10 @@ } }, "node-releases": { - "version": "1.1.51", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.51.tgz", - "integrity": "sha512-1eQEs6HFYY1kMXQPOLzCf7HdjReErmvn85tZESMczdCNVWP3Y7URYLBAyYynuI7yef1zj4HN5q+oB2x67QU0lw==", - "dev": true, - "requires": { - "semver": "^6.3.0" - } + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", + "dev": true }, "nopt": { "version": "2.2.1", @@ -8367,6 +8891,23 @@ "npm-normalize-package-bin": "^1.0.1" } }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "requires": { + "semver": "^7.1.1" + }, + "dependencies": { + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + } + } + }, "npm-normalize-package-bin": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", @@ -8374,82 +8915,85 @@ "dev": true }, "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", "dev": true, "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", "validate-npm-package-name": "^3.0.0" }, "dependencies": { - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", "dev": true } } }, "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.1.tgz", + "integrity": "sha512-95TSDvGwujIhqfSpIiRRLodEF+y6mJMopuZdahoGzqtRDFZXGav46S0p6ngeWaiAkb5R72w6eVARhzej0HvZeQ==", "dev": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.0.0.tgz", + "integrity": "sha512-PdJpXMvjqt4nftNEDpCgjBUF8yI3Q3MyuAmVB9nemnnCg32F4BPL/JFBfdj8DubgHCYUFQhtLWmBPvdsFtjWMg==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", "dev": true } } }, "npm-registry-fetch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.3.tgz", - "integrity": "sha512-WGvUx0lkKFhu9MbiGFuT9nG2NpfQ+4dCJwRwwtK2HK5izJEvwDxMeUyqbuMS7N/OkpVCqDorV6rO5E4V9F8lJw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-8.0.0.tgz", + "integrity": "sha512-975WwLvZjX97y9UWWQ8nAyr7bw02s9xKPHqvEm5T900LQsB1HXb8Gb9ebYtCBLSX+K8gSOrO5KS/9yV/naLZmQ==", "dev": true, "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", + "@npmcli/ci-detect": "^1.0.0", "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true - } + "make-fetch-happen": "^8.0.2", + "minipass": "^3.0.0", + "minipass-fetch": "^1.1.2", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" } }, "npm-run-path": { @@ -8640,12 +9184,13 @@ } }, "open": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.0.tgz", - "integrity": "sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", + "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", "dev": true, "requires": { - "is-wsl": "^2.1.0" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" } }, "opn": { @@ -8697,33 +9242,84 @@ } }, "ora": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.2.tgz", - "integrity": "sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz", + "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==", "dev": true, "requires": { - "chalk": "^2.4.2", + "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.2.0", "is-interactive": "^1.0.0", "log-symbols": "^3.0.0", - "strip-ansi": "^5.2.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } @@ -8743,12 +9339,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", @@ -8766,16 +9356,6 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -8895,74 +9475,41 @@ } }, "pacote": { - "version": "9.5.8", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.8.tgz", - "integrity": "sha512-0Tl8Oi/K0Lo4MZmH0/6IsT3gpGf9eEAznLXEQPKgPq7FscnbUOyopnVpwXlnQdIbCUaojWy1Wd7VMyqfVsRrIw==", + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.4.tgz", + "integrity": "sha512-eUGJvSSpWFZKn3z8gig/HgnBmUl6gIWByIIaHzSyEr3tOWX0w8tFEADXtpu8HGv5E0ShCeTP6enRq8iHKCHSvw==", "dev": true, "requires": { - "bluebird": "^3.5.3", - "cacache": "^12.0.2", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.5", + "@npmcli/promise-spawn": "^1.1.0", + "cacache": "^15.0.0", + "chownr": "^1.1.4", + "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^3.0.0", - "npm-registry-fetch": "^4.0.0", - "osenv": "^0.1.5", + "minipass": "^3.0.1", + "minipass-fetch": "^1.2.1", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^8.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" + "read-package-json-fast": "^1.1.3", + "rimraf": "^2.7.1", + "semver": "^7.1.3", + "ssri": "^8.0.0", + "tar": "^6.0.1", + "which": "^2.0.2" }, "dependencies": { - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } + "mkdirp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "dev": true }, "rimraf": { "version": "2.7.1", @@ -8974,25 +9521,19 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", "dev": true }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "isexe": "^2.0.0" } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true } } }, @@ -9200,6 +9741,15 @@ "find-up": "^3.0.0" } }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "portfinder": { "version": "1.0.25", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", @@ -9229,9 +9779,9 @@ "dev": true }, "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -9265,34 +9815,6 @@ "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.0.2" - }, - "dependencies": { - "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "postcss-colormin": { @@ -9410,6 +9932,39 @@ "postcss": "^7.0.0", "postcss-load-config": "^2.0.0", "schema-utils": "^1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } } }, "postcss-merge-longhand": { @@ -9867,15 +10422,6 @@ } } }, - "protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", - "dev": true, - "requires": { - "genfun": "^5.0.0" - } - }, "protractor": { "version": "5.4.3", "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.3.tgz", @@ -10306,23 +10852,33 @@ } }, "raw-loader": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz", - "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.0.tgz", + "integrity": "sha512-iINUOYvl1cGEmfoaLjnZXt4bKfT2LJnZZib5N/LLyAphC+Dd11vNP9CNVb38j+SAJpFI1uo8j9frmih53ASy7Q==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^2.0.1" + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" }, "dependencies": { - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } } } @@ -10357,6 +10913,16 @@ "npm-normalize-package-bin": "^1.0.0" } }, + "read-package-json-fast": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.1.3.tgz", + "integrity": "sha512-MmFqiyfCXV2Dmm4jH24DEGhxdkUDFivJQj4oPZQPOKywxR7HWBE6WnMWDAapfFHi3wm1b+mhR+XHlUH0CL8axg==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, "read-package-tree": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", @@ -10484,15 +11050,15 @@ } }, "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", "dev": true }, "regenerator-transform": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.2.tgz", - "integrity": "sha512-V4+lGplCM/ikqi5/mkkpJ06e9Bujq1NFmNLvsCs56zg3ZbzrnUzAtizZ24TXxtRX/W2jcdScwQCnbL0CICTFkQ==", + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", "dev": true, "requires": { "@babel/runtime": "^7.8.4", @@ -10703,9 +11269,9 @@ } }, "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -10722,14 +11288,12 @@ } }, "rollup": { - "version": "1.25.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.25.2.tgz", - "integrity": "sha512-+7z6Wab/L45QCPcfpuTZKwKiB0tynj05s/+s2U3F2Bi7rOLPr9UcjUwO7/xpjlPNXA/hwnth6jBExFRGyf3tMg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.1.0.tgz", + "integrity": "sha512-gfE1455AEazVVTJoeQtcOq/U6GSxwoj4XPSWVsuWmgIxj7sBQNLDOSA82PbdMe+cP8ql8fR1jogPFe8Wg8g4SQ==", "dev": true, "requires": { - "@types/estree": "*", - "@types/node": "*", - "acorn": "^7.1.0" + "fsevents": "~2.1.2" } }, "run-async": { @@ -10804,35 +11368,45 @@ } }, "sass": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.23.3.tgz", - "integrity": "sha512-1DKRZxJMOh4Bme16AbWTyYeJAjTlrvw2+fWshHHaepeJfGq2soFZTnt0YhWit+bohtDu4LdyPoEj6VFD4APHog==", + "version": "1.26.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.3.tgz", + "integrity": "sha512-5NMHI1+YFYw4sN3yfKjpLuV9B5l7MqQ6FlkTcC4FT+oHbBRUZoSjHrrt/mE0nFXJyY2kQtU9ou9HxvFVjLFuuw==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" } }, "sass-loader": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.0.tgz", - "integrity": "sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", "dev": true, "requires": { "clone-deep": "^4.0.1", "loader-utils": "^1.2.3", "neo-async": "^2.6.1", - "schema-utils": "^2.1.0", + "schema-utils": "^2.6.1", "semver": "^6.3.0" }, "dependencies": { - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } } } @@ -10853,14 +11427,33 @@ "dev": true }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + } } }, "select-hose": { @@ -11506,22 +12099,23 @@ } }, "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", "dev": true, "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" }, "dependencies": { "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "debug": "4" } } } @@ -11555,6 +12149,28 @@ "requires": { "async": "^2.5.0", "loader-utils": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } } }, "source-map-resolve": { @@ -11722,12 +12338,11 @@ } }, "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1", "minipass": "^3.1.1" } }, @@ -11882,24 +12497,46 @@ } } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "string.prototype.trimend": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz", + "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==", "dev": true, "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" } }, "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", "dev": true, "requires": { "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz", + "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "string_decoder": { @@ -11942,23 +12579,33 @@ "dev": true }, "style-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", - "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", + "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", "dev": true, "requires": { "loader-utils": "^1.2.3", - "schema-utils": "^2.0.1" + "schema-utils": "^2.6.4" }, "dependencies": { - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" } } } @@ -12029,6 +12676,28 @@ "loader-utils": "^1.0.2", "lodash.clonedeep": "^4.5.0", "when": "~3.6.x" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } } }, "superagent": { @@ -12125,43 +12794,23 @@ "dev": true }, "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.1.tgz", + "integrity": "sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==", "dev": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "chownr": "^1.1.3", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "dependencies": { - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "mkdirp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", "dev": true } } @@ -12182,9 +12831,9 @@ } }, "terser": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.5.1.tgz", - "integrity": "sha512-lH9zLIbX8PRBEFCTvfHGCy0s9HEKnNso1Dx9swSopF3VUnFLB8DpQ61tHxoofovNC/sG0spajJM3EIIRSTByiQ==", + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz", + "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==", "dev": true, "requires": { "commander": "^2.20.0", @@ -12201,9 +12850,9 @@ } }, "terser-webpack-plugin": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.3.tgz", - "integrity": "sha512-gWHkaGzGYjmDoYxksFZynWTzvXOAjQ5dd7xuTMYlv4zpWlLSb6v0QLSZjELzP5dMs1ox30O1BIPs9dgqlMHuLQ==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz", + "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==", "dev": true, "requires": { "cacache": "^13.0.1", @@ -12217,93 +12866,39 @@ "webpack-sources": "^1.4.3" }, "dependencies": { - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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 - }, - "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "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, - "requires": { - "find-up": "^4.0.0" - } - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" + "glob": "^7.1.3" } }, "source-map": { @@ -12312,13 +12907,14 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "supports-color": { + "ssri": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" } } } @@ -13029,12 +13625,12 @@ "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", "dev": true, "requires": { - "chokidar": "^2.0.2", + "chokidar": "^2.1.8", "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" }, @@ -13126,9 +13722,9 @@ } }, "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", "dev": true, "optional": true, "requires": { @@ -13182,7 +13778,7 @@ } }, "chownr": { - "version": "1.1.3", + "version": "1.1.4", "bundled": true, "dev": true, "optional": true @@ -13354,7 +13950,7 @@ } }, "minimist": { - "version": "0.0.8", + "version": "1.2.5", "bundled": true, "dev": true, "optional": true @@ -13379,12 +13975,12 @@ } }, "mkdirp": { - "version": "0.5.1", + "version": "0.5.3", "bundled": true, "dev": true, "optional": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "ms": { @@ -13394,7 +13990,7 @@ "optional": true }, "needle": { - "version": "2.4.0", + "version": "2.3.3", "bundled": true, "dev": true, "optional": true, @@ -13423,7 +14019,7 @@ } }, "nopt": { - "version": "4.0.1", + "version": "4.0.3", "bundled": true, "dev": true, "optional": true, @@ -13448,13 +14044,14 @@ "optional": true }, "npm-packlist": { - "version": "1.4.7", + "version": "1.4.8", "bundled": true, "dev": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npmlog": { @@ -13534,18 +14131,10 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } } }, "readable-stream": { - "version": "2.3.6", + "version": "2.3.7", "bundled": true, "dev": true, "optional": true, @@ -13762,9 +14351,9 @@ } }, "webpack": { - "version": "4.41.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", - "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", + "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -13787,7 +14376,7 @@ "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.1", + "terser-webpack-plugin": "^1.4.3", "watchpack": "^1.6.0", "webpack-sources": "^1.4.1" }, @@ -13799,9 +14388,9 @@ "dev": true }, "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { "bluebird": "^3.5.5", @@ -13838,6 +14427,26 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -13857,6 +14466,17 @@ "glob": "^7.1.3" } }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13923,9 +14543,9 @@ } }, "webpack-dev-server": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", - "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", + "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -13943,7 +14563,7 @@ "ip": "^1.1.5", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.4", + "loglevel": "^1.6.6", "opn": "^5.5.0", "p-retry": "^3.0.1", "portfinder": "^1.0.25", @@ -14050,9 +14670,9 @@ } }, "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", "dev": true, "optional": true, "requires": { @@ -14106,7 +14726,7 @@ } }, "chownr": { - "version": "1.1.3", + "version": "1.1.4", "bundled": true, "dev": true, "optional": true @@ -14278,7 +14898,7 @@ } }, "minimist": { - "version": "0.0.8", + "version": "1.2.5", "bundled": true, "dev": true, "optional": true @@ -14303,12 +14923,12 @@ } }, "mkdirp": { - "version": "0.5.1", + "version": "0.5.3", "bundled": true, "dev": true, "optional": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "ms": { @@ -14318,7 +14938,7 @@ "optional": true }, "needle": { - "version": "2.4.0", + "version": "2.3.3", "bundled": true, "dev": true, "optional": true, @@ -14347,7 +14967,7 @@ } }, "nopt": { - "version": "4.0.1", + "version": "4.0.3", "bundled": true, "dev": true, "optional": true, @@ -14372,13 +14992,14 @@ "optional": true }, "npm-packlist": { - "version": "1.4.7", + "version": "1.4.8", "bundled": true, "dev": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npmlog": { @@ -14458,18 +15079,10 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } } }, "readable-stream": { - "version": "2.3.6", + "version": "2.3.7", "bundled": true, "dev": true, "optional": true, @@ -14651,6 +15264,17 @@ "readable-stream": "^2.0.2" } }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -14710,9 +15334,9 @@ } }, "webpack-subresource-integrity": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.3.4.tgz", - "integrity": "sha512-6XbGYzjh30cGQT/NsC+9IAkJP8IL7/t47sbwR5DLSsamiD56Rwv4/+hsgEHsviPvrEFZ0JRAQtCRN3UsR2Pw9g==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.4.0.tgz", + "integrity": "sha512-GB1kB/LwAWC3CxwcedGhMkxGpNZxSheCe1q+KJP1bakuieAdX/rGHEcf5zsEzhKXpqsGqokgsDoD9dIkr61VDQ==", "dev": true, "requires": { "webpack-sources": "^1.3.0" @@ -14787,12 +15411,34 @@ } }, "worker-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-3.2.0.tgz", - "integrity": "sha512-W5nRkw7+HlbsEt3qRP6MczwDDISjiRj2GYt9+bpe8A2La00TmJdwzG5bpdMXhRt1qcWmwAvl1TiKaHRa+XDS9Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-4.0.2.tgz", + "integrity": "sha512-V+1zSZMOOKk+uBzKyNIODLQLsx59zSIOaI75J1EMS0iR1qy+KQR3y/pQ3T0vIhvPfDFapGRMsoMvQNEL3okqSA==", "dev": true, "requires": { "loader-utils": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } } }, "wrap-ansi": { diff --git a/package.json b/package.json index fb4298a64..23d1f2402 100644 --- a/package.json +++ b/package.json @@ -30,13 +30,13 @@ "zone.js": "~0.10.2" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.900.5", - "@angular/cli": "~9.0.5", + "@angular-devkit/build-angular": "^0.901.0", + "@angular/cli": "^9.1.0", "@angular/compiler-cli": "~9.0.5", "@angular/language-service": "~9.0.5", - "@types/node": "^12.11.1", "@types/jasmine": "~3.5.0", "@types/jasminewd2": "~2.0.3", + "@types/node": "^12.11.1", "codelyzer": "^5.1.2", "jasmine-core": "~3.5.0", "jasmine-spec-reporter": "~4.2.1", From 933a57af7a36bd080089c11cdec84b49ec3b04ee Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 30 Mar 2020 11:54:54 -0400 Subject: [PATCH 068/120] Add title to donut chart and media queries --- .../device-chart/device-chart.component.html | 4 +- .../device-chart/device-chart.component.ts | 1 + .../donut-chart/donut-chart.component.html | 7 +++- .../donut-chart/donut-chart.component.scss | 39 ++++++++++++++++--- .../donut-chart/donut-chart.component.ts | 1 + .../folder-chart/folder-chart.component.html | 4 +- .../folder-chart/folder-chart.component.ts | 1 + 7 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/app/charts/device-chart/device-chart.component.html b/src/app/charts/device-chart/device-chart.component.html index f8225dd75..d4c1b7cc5 100644 --- a/src/app/charts/device-chart/device-chart.component.html +++ b/src/app/charts/device-chart/device-chart.component.html @@ -1,8 +1,8 @@
-
Devices
+
{{title}}
- +
diff --git a/src/app/charts/device-chart/device-chart.component.ts b/src/app/charts/device-chart/device-chart.component.ts index 703515a29..764d025e0 100644 --- a/src/app/charts/device-chart/device-chart.component.ts +++ b/src/app/charts/device-chart/device-chart.component.ts @@ -14,6 +14,7 @@ export class DeviceChartComponent implements OnInit { chartID: string = 'devicesChart'; elevation: string = cardElevation; states: { label: string, count: number, color: string }[] = []; + title: string = "Devices"; constructor(private deviceService: DeviceService) { } diff --git a/src/app/charts/donut-chart/donut-chart.component.html b/src/app/charts/donut-chart/donut-chart.component.html index 88e37515c..3d7ae2b4f 100644 --- a/src/app/charts/donut-chart/donut-chart.component.html +++ b/src/app/charts/donut-chart/donut-chart.component.html @@ -1,4 +1,7 @@ -
+
-
{{count}}
+
+
{{count}}
+
{{title}}
+
\ No newline at end of file diff --git a/src/app/charts/donut-chart/donut-chart.component.scss b/src/app/charts/donut-chart/donut-chart.component.scss index 30348140f..b8f62a322 100644 --- a/src/app/charts/donut-chart/donut-chart.component.scss +++ b/src/app/charts/donut-chart/donut-chart.component.scss @@ -6,9 +6,38 @@ .center { position: absolute; - left: 0; - top: 40%; - width: 100%; - text-align: center; - font-size:1.8rem; + top: 0; left: 0; bottom: 0; right: 0; + width: 50%; + height: 50%; + overflow: auto; + margin: auto; +} + +.count { + font-size: calc(1rem + 0.625vw); +} + +.title { + font-size: calc(0.5rem + 0.625vw); + display:none; +} + +@media (max-width: 640px) { + +} +@media (min-width: 640px) and (max-width: 1000px) { + .title { + display:none; + font-size: calc(0.35rem + 0.625vw); + } + + .count { + font-size: calc(1.35rem + 0.625vw); + } +} + +@media (min-width:1000px) { + .title { + display: inline; + } } \ No newline at end of file diff --git a/src/app/charts/donut-chart/donut-chart.component.ts b/src/app/charts/donut-chart/donut-chart.component.ts index 4d7268feb..d1f25b339 100644 --- a/src/app/charts/donut-chart/donut-chart.component.ts +++ b/src/app/charts/donut-chart/donut-chart.component.ts @@ -9,6 +9,7 @@ import { tooltip } from '../tooltip' }) export class DonutChartComponent { @Input() elementID: string; + @Input() title: number; count: number; private canvas: any; diff --git a/src/app/charts/folder-chart/folder-chart.component.html b/src/app/charts/folder-chart/folder-chart.component.html index 6a8b23725..d4c1b7cc5 100644 --- a/src/app/charts/folder-chart/folder-chart.component.html +++ b/src/app/charts/folder-chart/folder-chart.component.html @@ -1,8 +1,8 @@
-
Folders
+
{{title}}
- +
diff --git a/src/app/charts/folder-chart/folder-chart.component.ts b/src/app/charts/folder-chart/folder-chart.component.ts index de8a505ea..0e42ea68f 100644 --- a/src/app/charts/folder-chart/folder-chart.component.ts +++ b/src/app/charts/folder-chart/folder-chart.component.ts @@ -14,6 +14,7 @@ export class FolderChartComponent implements OnInit { chartID: string = 'foldersChart'; states: { label: string, count: number, color: string }[] = []; elevation: string = cardElevation; + title: string = "Folders"; constructor(private folderService: FolderService) { } From 6af2657d7e315e1f75802c9a91575832e2996276 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 30 Mar 2020 13:44:54 -0400 Subject: [PATCH 069/120] Combine folder and device chart component into chart component --- src/app/app.module.ts | 6 +- src/app/chart.ts | 4 + .../chart.component.html} | 2 +- .../chart.component.scss} | 0 .../chart.component.spec.ts} | 12 +-- src/app/charts/chart/chart.component.ts | 91 +++++++++++++++++++ .../device-chart.component.spec.ts | 25 ----- .../device-chart/device-chart.component.ts | 53 ----------- .../folder-chart/folder-chart.component.html | 12 --- .../folder-chart/folder-chart.component.scss | 0 .../folder-chart/folder-chart.component.ts | 59 ------------ src/app/dashboard/dashboard.component.html | 4 +- src/app/dashboard/dashboard.component.ts | 4 +- src/styles.scss | 3 +- 14 files changed, 111 insertions(+), 164 deletions(-) create mode 100644 src/app/chart.ts rename src/app/charts/{device-chart/device-chart.component.html => chart/chart.component.html} (89%) rename src/app/charts/{device-chart/device-chart.component.scss => chart/chart.component.scss} (100%) rename src/app/charts/{folder-chart/folder-chart.component.spec.ts => chart/chart.component.spec.ts} (53%) create mode 100644 src/app/charts/chart/chart.component.ts delete mode 100644 src/app/charts/device-chart/device-chart.component.spec.ts delete mode 100644 src/app/charts/device-chart/device-chart.component.ts delete mode 100644 src/app/charts/folder-chart/folder-chart.component.html delete mode 100644 src/app/charts/folder-chart/folder-chart.component.scss delete mode 100644 src/app/charts/folder-chart/folder-chart.component.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 289a3ec0a..addad321b 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -18,8 +18,6 @@ import { StatusListComponent } from './lists/status-list/status-list.component'; import { FolderListComponent } from './lists/folder-list/folder-list.component'; import { DeviceListComponent } from './lists/device-list/device-list.component'; import { DonutChartComponent } from './charts/donut-chart/donut-chart.component'; -import { DeviceChartComponent } from './charts/device-chart/device-chart.component'; -import { FolderChartComponent } from './charts/folder-chart/folder-chart.component'; import { DashboardComponent } from './dashboard/dashboard.component'; import { ListToggleComponent } from './list-toggle/list-toggle.component'; @@ -29,6 +27,7 @@ import { InMemoryConfigDataService } from './services/in-memory-config-data.serv import { deviceID } from './api-utils'; import { environment } from '../environments/environment'; import { ChartItemComponent } from './charts/chart-item/chart-item.component'; +import { ChartComponent } from './charts/chart/chart.component'; @NgModule({ declarations: [ @@ -39,8 +38,7 @@ import { ChartItemComponent } from './charts/chart-item/chart-item.component'; ListToggleComponent, DashboardComponent, DonutChartComponent, - DeviceChartComponent, - FolderChartComponent, + ChartComponent, ChartItemComponent, ], imports: [ diff --git a/src/app/chart.ts b/src/app/chart.ts new file mode 100644 index 000000000..b6145574c --- /dev/null +++ b/src/app/chart.ts @@ -0,0 +1,4 @@ +export const enum ChartType { + Folder = 0, + Device +} \ No newline at end of file diff --git a/src/app/charts/device-chart/device-chart.component.html b/src/app/charts/chart/chart.component.html similarity index 89% rename from src/app/charts/device-chart/device-chart.component.html rename to src/app/charts/chart/chart.component.html index d4c1b7cc5..3b741f09c 100644 --- a/src/app/charts/device-chart/device-chart.component.html +++ b/src/app/charts/chart/chart.component.html @@ -1,5 +1,5 @@
-
{{title}}
+
{{title | uppercase}}
diff --git a/src/app/charts/device-chart/device-chart.component.scss b/src/app/charts/chart/chart.component.scss similarity index 100% rename from src/app/charts/device-chart/device-chart.component.scss rename to src/app/charts/chart/chart.component.scss diff --git a/src/app/charts/folder-chart/folder-chart.component.spec.ts b/src/app/charts/chart/chart.component.spec.ts similarity index 53% rename from src/app/charts/folder-chart/folder-chart.component.spec.ts rename to src/app/charts/chart/chart.component.spec.ts index 1a9754940..4bfa61135 100644 --- a/src/app/charts/folder-chart/folder-chart.component.spec.ts +++ b/src/app/charts/chart/chart.component.spec.ts @@ -1,20 +1,20 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FolderChartComponent } from './folder-chart.component'; +import { ChartComponent } from './chart.component'; -describe('FolderChartComponent', () => { - let component: FolderChartComponent; - let fixture: ComponentFixture; +describe('ChartComponent', () => { + let component: ChartComponent; + let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ FolderChartComponent ] + declarations: [ ChartComponent ] }) .compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(FolderChartComponent); + fixture = TestBed.createComponent(ChartComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/charts/chart/chart.component.ts b/src/app/charts/chart/chart.component.ts new file mode 100644 index 000000000..32d1c3bcb --- /dev/null +++ b/src/app/charts/chart/chart.component.ts @@ -0,0 +1,91 @@ +import { Component, OnInit, ViewChild, Input } from '@angular/core'; +import Folder from '../../folder' +import { cardElevation } from '../../style' +import { FolderService } from 'src/app/services/folder.service'; +import { DonutChartComponent } from '../donut-chart/donut-chart.component'; +import { DeviceService } from 'src/app/services/device.service'; +import Device from 'src/app/device'; +import { ChartType } from '../../chart'; + + + +@Component({ + selector: 'app-chart', + templateUrl: './chart.component.html', + styleUrls: ['./chart.component.scss'] +}) + +export class ChartComponent implements OnInit { + @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; + @Input() type: ChartType; + title: string; + chartID: string; + states: { label: string, count: number, color: string }[] = []; + elevation: string = cardElevation; + service: any; + namespace: any; + + constructor(private folderService: FolderService, private deviceServce: DeviceService) { } + + ngOnInit(): void { + switch (this.type) { + case ChartType.Folder: + this.title = "Folders"; + this.chartID = 'foldersChart'; + this.service = this.folderService; + break; + case ChartType.Device: + this.title = "Devices"; + this.chartID = 'devicesChart'; + this.service = this.deviceServce; + break; + } + } + + ngAfterViewInit() { + let totalCount: number = 0; + this.service.getAll().subscribe( + folder => { + // Count the number of folders and set chart + totalCount++; + this.donutChart.count = totalCount; + + // Get StateType and convert to string + let stateType; + let state: string; + let color; + switch (this.type) { + case ChartType.Folder: + stateType = Folder.getStateType(folder); + state = Folder.stateTypeToString(stateType); + color = Folder.stateTypeToColor(stateType); + break; + case ChartType.Device: + stateType = Device.getStateType(folder); + state = Device.stateTypeToString(stateType); + color = Device.stateTypeToColor(stateType); + break; + } + + // Check if state exists + let found: boolean = false; + this.states.forEach(s => { + if (s.label === state) { + s.count = s.count + 1; + found = true; + } + }); + + if (!found) { + console.log(color, "look!!!") + this.states.push({ label: state, count: 1, color: color }); + } + + this.donutChart.updateData(this.states); + }, + err => console.error('Observer got an error: ' + err), + () => { + } + ); + } +} \ No newline at end of file diff --git a/src/app/charts/device-chart/device-chart.component.spec.ts b/src/app/charts/device-chart/device-chart.component.spec.ts deleted file mode 100644 index 9f40493dc..000000000 --- a/src/app/charts/device-chart/device-chart.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { DeviceChartComponent } from './device-chart.component'; - -describe('DeviceChartComponent', () => { - let component: DeviceChartComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ DeviceChartComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(DeviceChartComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/charts/device-chart/device-chart.component.ts b/src/app/charts/device-chart/device-chart.component.ts deleted file mode 100644 index 764d025e0..000000000 --- a/src/app/charts/device-chart/device-chart.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { cardElevation } from '../../style'; -import { DonutChartComponent } from '../donut-chart/donut-chart.component'; -import { DeviceService } from 'src/app/services/device.service'; -import Device from '../../device'; - -@Component({ - selector: 'app-device-chart', - templateUrl: './device-chart.component.html', - styleUrls: ['./device-chart.component.scss'] -}) -export class DeviceChartComponent implements OnInit { - @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; - chartID: string = 'devicesChart'; - elevation: string = cardElevation; - states: { label: string, count: number, color: string }[] = []; - title: string = "Devices"; - - constructor(private deviceService: DeviceService) { } - - ngOnInit(): void { } - - ngAfterViewInit(): void { - let totalCount: number = 0; - this.deviceService.getAll().subscribe( - device => { - // Count the number of folders and set chart - totalCount++; - this.donutChart.count = totalCount; - - // Get StateType and convert to string - const stateType: Device.StateType = Device.getStateType(device); - const state: string = Device.stateTypeToString(stateType); - const color: string = Device.stateTypeToColor(stateType); - - // Check if state exists - let found: boolean = false; - this.states.forEach(s => { - if (s.label === state) { - s.count = s.count + 1; - found = true; - } - }); - - if (!found) { - this.states.push({ label: state, count: 1, color: color }); - } - - this.donutChart.updateData(this.states); - } - ); - } -} diff --git a/src/app/charts/folder-chart/folder-chart.component.html b/src/app/charts/folder-chart/folder-chart.component.html deleted file mode 100644 index d4c1b7cc5..000000000 --- a/src/app/charts/folder-chart/folder-chart.component.html +++ /dev/null @@ -1,12 +0,0 @@ -
-
{{title}}
-
-
- -
- - -
-
-
-
\ No newline at end of file diff --git a/src/app/charts/folder-chart/folder-chart.component.scss b/src/app/charts/folder-chart/folder-chart.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/app/charts/folder-chart/folder-chart.component.ts b/src/app/charts/folder-chart/folder-chart.component.ts deleted file mode 100644 index 0e42ea68f..000000000 --- a/src/app/charts/folder-chart/folder-chart.component.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import Folder from '../../folder' -import { cardElevation } from '../../style' -import { FolderService } from 'src/app/services/folder.service'; -import { DonutChartComponent } from '../donut-chart/donut-chart.component'; - -@Component({ - selector: 'app-folder-chart', - templateUrl: './folder-chart.component.html', - styleUrls: ['./folder-chart.component.scss'] -}) -export class FolderChartComponent implements OnInit { - @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; - chartID: string = 'foldersChart'; - states: { label: string, count: number, color: string }[] = []; - elevation: string = cardElevation; - title: string = "Folders"; - - constructor(private folderService: FolderService) { } - - ngOnInit(): void { - // for (let state in Folder.StateType) { } - } - - ngAfterViewInit() { - let totalCount: number = 0; - this.folderService.getAll().subscribe( - folder => { - // Count the number of folders and set chart - totalCount++; - this.donutChart.count = totalCount; - - // Get StateType and convert to string - const stateType: Folder.StateType = Folder.getStateType(folder); - const state: string = Folder.stateTypeToString(stateType); - const color: string = Folder.stateTypeToColor(stateType); - - // Check if state exists - let found: boolean = false; - this.states.forEach(s => { - if (s.label === state) { - s.count = s.count + 1; - found = true; - } - }); - - if (!found) { - console.log(color, "look!!!") - this.states.push({ label: state, count: 1, color: color }); - } - - this.donutChart.updateData(this.states); - }, - err => console.error('Observer got an error: ' + err), - () => { - } - ); - } -} \ No newline at end of file diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html index 434d48291..96df08d62 100644 --- a/src/app/dashboard/dashboard.component.html +++ b/src/app/dashboard/dashboard.component.html @@ -4,8 +4,8 @@

Tech UI

- - + +
diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts index ef4394024..30d8f6729 100644 --- a/src/app/dashboard/dashboard.component.ts +++ b/src/app/dashboard/dashboard.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { SystemConfigService } from '../services/system-config.service'; +import { ChartType } from '../chart'; @Component({ selector: 'app-dashboard', @@ -7,7 +8,8 @@ import { SystemConfigService } from '../services/system-config.service'; styleUrls: ['./dashboard.component.scss'] }) export class DashboardComponent { - + folderChart: ChartType = ChartType.Folder; + deviceChart: ChartType = ChartType.Device; constructor(private systemConfigService: SystemConfigService) { } diff --git a/src/styles.scss b/src/styles.scss index 8ab16a842..08d859424 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -87,7 +87,8 @@ html, body { .tui-card-title { padding: 16px 16px 0 16px; - font-size: mat-font-size($tech-ui-typography, subheading-2) + font-size: mat-font-size($tech-ui-typography, subheading-2); + color: #0891D1; } .tui-card-content { From 7fed8334b98b1dca3af9c2a270835d90cf68aa08 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 30 Mar 2020 14:44:20 -0400 Subject: [PATCH 070/120] Use a smaller font when device or folder counts are above 4 digits --- .../donut-chart/donut-chart.component.html | 2 +- .../donut-chart/donut-chart.component.scss | 23 +++++++++++-------- .../donut-chart/donut-chart.component.ts | 11 +++++++-- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/app/charts/donut-chart/donut-chart.component.html b/src/app/charts/donut-chart/donut-chart.component.html index 3d7ae2b4f..83bc1ce1b 100644 --- a/src/app/charts/donut-chart/donut-chart.component.html +++ b/src/app/charts/donut-chart/donut-chart.component.html @@ -1,7 +1,7 @@
-
{{count}}
+
{{_count}}
{{title}}
\ No newline at end of file diff --git a/src/app/charts/donut-chart/donut-chart.component.scss b/src/app/charts/donut-chart/donut-chart.component.scss index b8f62a322..1793f03ff 100644 --- a/src/app/charts/donut-chart/donut-chart.component.scss +++ b/src/app/charts/donut-chart/donut-chart.component.scss @@ -13,25 +13,30 @@ margin: auto; } -.count { - font-size: calc(1rem + 0.625vw); -} - .title { font-size: calc(0.5rem + 0.625vw); display:none; } -@media (max-width: 640px) { - +.count-total { + font-size: calc(1rem + 0.625vw); } -@media (min-width: 640px) and (max-width: 1000px) { + +.large-count-total { + font-size: calc(0.5rem + 0.625vw); +} + +@media (max-width: 800px) { + .count-total { + font-size: calc(1.00rem + 0.625vw); + } +} +@media (min-width: 800px) and (max-width: 1000px) { .title { - display:none; font-size: calc(0.35rem + 0.625vw); } - .count { + .count-total { font-size: calc(1.35rem + 0.625vw); } } diff --git a/src/app/charts/donut-chart/donut-chart.component.ts b/src/app/charts/donut-chart/donut-chart.component.ts index d1f25b339..f652a851f 100644 --- a/src/app/charts/donut-chart/donut-chart.component.ts +++ b/src/app/charts/donut-chart/donut-chart.component.ts @@ -10,7 +10,14 @@ import { tooltip } from '../tooltip' export class DonutChartComponent { @Input() elementID: string; @Input() title: number; - count: number; + _count: number; + _countClass = "count-total"; + set count(n: number) { + if (n >= 1000) { // use a smaller font + this._countClass = "large-count-total" + } + this._count = n; + } private canvas: any; private ctx: any; @@ -50,7 +57,7 @@ export class DonutChartComponent { }] }, options: { - cutoutPercentage: 75, + cutoutPercentage: 77, responsive: true, legend: { display: false From 8851f4571c10bfe8eb5d716bee88161f99c83b4f Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 30 Mar 2020 14:44:52 -0400 Subject: [PATCH 071/120] Add header and logo --- src/app/dashboard/dashboard.component.html | 7 ++- src/app/dashboard/dashboard.component.scss | 6 ++- src/app/device.ts | 4 +- src/app/folder.ts | 4 +- .../status-list/status-list.component.html | 2 +- .../status-list/status-list.component.ts | 1 + src/assets/logo-horizontal.svg | 54 +++++++++++++++++++ 7 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 src/assets/logo-horizontal.svg diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html index 96df08d62..6af4bc21d 100644 --- a/src/app/dashboard/dashboard.component.html +++ b/src/app/dashboard/dashboard.component.html @@ -1,8 +1,13 @@ +
+
+ + Tech UI +
+
-

Tech UI

diff --git a/src/app/dashboard/dashboard.component.scss b/src/app/dashboard/dashboard.component.scss index 0b6973a09..84c7e85b0 100644 --- a/src/app/dashboard/dashboard.component.scss +++ b/src/app/dashboard/dashboard.component.scss @@ -1,3 +1,7 @@ +.header { + margin: 20px 3vw 20px 3vw; +} .grid-container { - margin: 20px; + margin: 10px calc(10px + 3.3vw); + min-width: 600px; } \ No newline at end of file diff --git a/src/app/device.ts b/src/app/device.ts index aeb70cbe2..42a889a30 100644 --- a/src/app/device.ts +++ b/src/app/device.ts @@ -50,13 +50,13 @@ namespace Device { export function stateTypeToColor(s: StateType): string { switch (s) { case StateType.Insync: - return colors.get("green"); + return colors.get("blue"); case StateType.UnusedInsync: return colors.get("grey"); case StateType.Unknown: return colors.get("grey"); case StateType.Syncing: - return colors.get("blue"); + return colors.get("green"); case StateType.Paused: return colors.get("grey"); case StateType.UnusedPaused: diff --git a/src/app/folder.ts b/src/app/folder.ts index 3015c0fd2..fb8169e64 100644 --- a/src/app/folder.ts +++ b/src/app/folder.ts @@ -82,7 +82,7 @@ namespace Folder { case StateType.Scanning: return colors.get("grey"); case StateType.Idle: - return colors.get("green"); + return colors.get("blue"); case StateType.LocalAdditions: return colors.get("grey"); case StateType.WaitingToScan: @@ -90,7 +90,7 @@ namespace Folder { case StateType.PreparingToSync: return colors.get("grey"); case StateType.Syncing: - return colors.get("blue"); + return colors.get("green"); case StateType.OutOfSync: return colors.get("grey"); case StateType.FailedItems: diff --git a/src/app/lists/status-list/status-list.component.html b/src/app/lists/status-list/status-list.component.html index 35a3a0d8e..8fd9d2fa6 100644 --- a/src/app/lists/status-list/status-list.component.html +++ b/src/app/lists/status-list/status-list.component.html @@ -1,6 +1,6 @@
-
Status
+
{{title | uppercase}}
diff --git a/src/app/lists/status-list/status-list.component.ts b/src/app/lists/status-list/status-list.component.ts index de2f2dfba..b0ad877c8 100644 --- a/src/app/lists/status-list/status-list.component.ts +++ b/src/app/lists/status-list/status-list.component.ts @@ -12,6 +12,7 @@ export class StatusListComponent implements OnInit { currentListType: ListType = ListType.Folders; listType = ListType; // used in html elevation: string = cardElevation; + title: string = 'Status'; constructor() { } diff --git a/src/assets/logo-horizontal.svg b/src/assets/logo-horizontal.svg new file mode 100644 index 000000000..de8850f53 --- /dev/null +++ b/src/assets/logo-horizontal.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 192e8439894dc99ffe37cd59ea385c04666a07a2 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 31 Mar 2020 15:54:40 +0200 Subject: [PATCH 072/120] README/LICENSE --- LICENSE | 19 +++++++++++++++++++ README.md | 37 +++++++++++++++++-------------------- 2 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..aae787f3a --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2020 Kastelo AB + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +- The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 3697cc4c0..714709ffb 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,28 @@ -# TechUi - -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.0.5. +# Syncthing Tech UI ## Development server -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. +Run `npm run serve` for a dev server. Navigate to `http://localhost:4200/`. The +app will automatically reload if you change any of the source files. ## Production server -Run `ng build --prod --base-href /tech-ui/` and build [syncthing tech-ui branch](https://github.com/kastelo/syncthing/tree/tech-ui). Run `export STNOUPGRADE=1 STTECHUIDIR=/path/to/angular/build/; ./bin/syncthing` and navigate to `http://localhost:8384/tech-ui/`. +In production we serve the UI through Syncthing itself. The easiest way to +do that is to simply put the built assets in the `gui` subdirectory of +Syncthing's config directory. + +- `npm run build -- --prod` +- `rsync -va --delete dist/tech-ui/ ~/.config/syncthing/gui/default/tech-ui/` + +Adjust for your actual Syncthing config dir if different. Navigate to +`http://localhost:8384/tech-ui/`. ## 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`. +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 +# License -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). +MIT From 33398b0b6b36c6f838ac8523f6ad8fee16fa965c Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 31 Mar 2020 16:14:09 +0200 Subject: [PATCH 073/120] Also mention STGUIASSETS --- README.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 714709ffb..e032af24b 100644 --- a/README.md +++ b/README.md @@ -11,12 +11,27 @@ In production we serve the UI through Syncthing itself. The easiest way to do that is to simply put the built assets in the `gui` subdirectory of Syncthing's config directory. -- `npm run build -- --prod` -- `rsync -va --delete dist/tech-ui/ ~/.config/syncthing/gui/default/tech-ui/` +``` +$ npm run build -- --prod +$ rsync -va --delete dist/tech-ui/ ~/.config/syncthing/gui/default/tech-ui/ +``` Adjust for your actual Syncthing config dir if different. Navigate to `http://localhost:8384/tech-ui/`. +Another option is to start Syncthing with the STGUIASSETS environment +variable pointing to the distribution directory. + +``` +$ npm run build -- --prod +$ ln -sf . dist/default +$ export STGUIASSETS=$(pwd)/dist +$ syncthing +``` + +The magic is symlink is because Syncthing will look for the GUI in the +`default` subdirectory. Navigate to `http://localhost:8384/tech-ui/`. + ## Code scaffolding Run `ng generate component component-name` to generate a new component. You From dae1f990a55ebc8903c5c65b98b5c439d7ba4d55 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 30 Mar 2020 17:02:46 -0400 Subject: [PATCH 074/120] Combine types --- src/app/chart.ts | 4 ---- src/app/charts/chart/chart.component.ts | 12 ++++++------ src/app/dashboard/dashboard.component.ts | 6 +++--- src/app/list-toggle/list-toggle.component.html | 4 ++-- src/app/list-toggle/list-toggle.component.ts | 12 ++++++------ src/app/list-type.ts | 4 ---- src/app/lists/status-list/status-list.component.html | 4 ++-- src/app/lists/status-list/status-list.component.ts | 9 +++++---- src/app/type.ts | 4 ++++ 9 files changed, 28 insertions(+), 31 deletions(-) delete mode 100644 src/app/chart.ts delete mode 100644 src/app/list-type.ts create mode 100644 src/app/type.ts diff --git a/src/app/chart.ts b/src/app/chart.ts deleted file mode 100644 index b6145574c..000000000 --- a/src/app/chart.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const enum ChartType { - Folder = 0, - Device -} \ No newline at end of file diff --git a/src/app/charts/chart/chart.component.ts b/src/app/charts/chart/chart.component.ts index 32d1c3bcb..dd7beb3fe 100644 --- a/src/app/charts/chart/chart.component.ts +++ b/src/app/charts/chart/chart.component.ts @@ -5,7 +5,7 @@ import { FolderService } from 'src/app/services/folder.service'; import { DonutChartComponent } from '../donut-chart/donut-chart.component'; import { DeviceService } from 'src/app/services/device.service'; import Device from 'src/app/device'; -import { ChartType } from '../../chart'; +import { Type } from '../../type'; @@ -17,7 +17,7 @@ import { ChartType } from '../../chart'; export class ChartComponent implements OnInit { @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; - @Input() type: ChartType; + @Input() type: Type; title: string; chartID: string; states: { label: string, count: number, color: string }[] = []; @@ -29,12 +29,12 @@ export class ChartComponent implements OnInit { ngOnInit(): void { switch (this.type) { - case ChartType.Folder: + case Type.Folder: this.title = "Folders"; this.chartID = 'foldersChart'; this.service = this.folderService; break; - case ChartType.Device: + case Type.Device: this.title = "Devices"; this.chartID = 'devicesChart'; this.service = this.deviceServce; @@ -55,12 +55,12 @@ export class ChartComponent implements OnInit { let state: string; let color; switch (this.type) { - case ChartType.Folder: + case Type.Folder: stateType = Folder.getStateType(folder); state = Folder.stateTypeToString(stateType); color = Folder.stateTypeToColor(stateType); break; - case ChartType.Device: + case Type.Device: stateType = Device.getStateType(folder); state = Device.stateTypeToString(stateType); color = Device.stateTypeToColor(stateType); diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts index 30d8f6729..7a956f569 100644 --- a/src/app/dashboard/dashboard.component.ts +++ b/src/app/dashboard/dashboard.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { SystemConfigService } from '../services/system-config.service'; -import { ChartType } from '../chart'; +import { Type } from '../type'; @Component({ selector: 'app-dashboard', @@ -8,8 +8,8 @@ import { ChartType } from '../chart'; styleUrls: ['./dashboard.component.scss'] }) export class DashboardComponent { - folderChart: ChartType = ChartType.Folder; - deviceChart: ChartType = ChartType.Device; + folderChart: Type = Type.Folder; + deviceChart: Type = Type.Device; constructor(private systemConfigService: SystemConfigService) { } diff --git a/src/app/list-toggle/list-toggle.component.html b/src/app/list-toggle/list-toggle.component.html index 16b2bec0d..f360d7f5d 100644 --- a/src/app/list-toggle/list-toggle.component.html +++ b/src/app/list-toggle/list-toggle.component.html @@ -1,4 +1,4 @@ - Folders - Devices + Folders + Devices \ No newline at end of file diff --git a/src/app/list-toggle/list-toggle.component.ts b/src/app/list-toggle/list-toggle.component.ts index db5d523f3..e1f3e6a0e 100644 --- a/src/app/list-toggle/list-toggle.component.ts +++ b/src/app/list-toggle/list-toggle.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, OnInit, Output } from '@angular/core'; -import { ListType } from '../list-type'; +import { Type } from '../type'; @@ -10,20 +10,20 @@ import { ListType } from '../list-type'; }) export class ListToggleComponent implements OnInit { - public listType = ListType; - @Output() listTypeEvent = new EventEmitter(); + public listType = Type; + @Output() listTypeEvent = new EventEmitter(); constructor() { } ngOnInit(): void { } - onSelect(t: ListType): void { + onSelect(t: Type): void { this.listTypeEvent.emit(t); switch (t) { - case ListType.Folders: + case Type.Folder: console.log("folder action"); break; - case ListType.Devices: + case Type.Device: console.log("Device action"); break; } diff --git a/src/app/list-type.ts b/src/app/list-type.ts deleted file mode 100644 index 9aa953a9c..000000000 --- a/src/app/list-type.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum ListType { - Folders = 1, - Devices, -} \ No newline at end of file diff --git a/src/app/lists/status-list/status-list.component.html b/src/app/lists/status-list/status-list.component.html index 8fd9d2fa6..8783944a5 100644 --- a/src/app/lists/status-list/status-list.component.html +++ b/src/app/lists/status-list/status-list.component.html @@ -4,7 +4,7 @@
- - + +
\ No newline at end of file diff --git a/src/app/lists/status-list/status-list.component.ts b/src/app/lists/status-list/status-list.component.ts index b0ad877c8..910ca4798 100644 --- a/src/app/lists/status-list/status-list.component.ts +++ b/src/app/lists/status-list/status-list.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { ListType } from '../../list-type'; +import { Type } from '../../type'; import { cardElevation } from '../../style'; @@ -9,17 +9,18 @@ import { cardElevation } from '../../style'; styleUrls: ['./status-list.component.scss'] }) export class StatusListComponent implements OnInit { - currentListType: ListType = ListType.Folders; - listType = ListType; // used in html + currentListType: Type = Type.Folder; + listType = Type; // used in html elevation: string = cardElevation; title: string = 'Status'; + folderList: Type = Type.Folder; constructor() { } ngOnInit(): void { } - onToggle(t: ListType) { + onToggle(t: Type) { this.currentListType = t; } } diff --git a/src/app/type.ts b/src/app/type.ts new file mode 100644 index 000000000..ac23f2e66 --- /dev/null +++ b/src/app/type.ts @@ -0,0 +1,4 @@ +export enum Type { + Folder = 1, + Device, +} \ No newline at end of file From 42fa03aa4a340f116ca5f0a2d5bc05b8f583dcb4 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 30 Mar 2020 17:02:59 -0400 Subject: [PATCH 075/120] start of list filtering --- src/app/app.module.ts | 6 +- .../device-list/device-list.component.html | 36 ++++---- .../device-list/device-list.component.ts | 12 +-- .../folder-list/folder-list-datasource.ts | 82 ------------------- .../folder-list/folder-list.component.html | 24 +++--- .../folder-list/folder-list.component.scss | 4 +- .../folder-list/folder-list.component.spec.ts | 17 +--- .../folder-list/folder-list.component.ts | 21 +++-- 8 files changed, 53 insertions(+), 149 deletions(-) delete mode 100644 src/app/lists/folder-list/folder-list-datasource.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index addad321b..9d17cc917 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -5,6 +5,7 @@ import { HttpClientModule, HttpClientXsrfModule } from '@angular/common/http'; import { MatTableModule } from '@angular/material/table'; import { MatPaginatorModule } from '@angular/material/paginator'; import { MatSortModule } from '@angular/material/sort'; +import { MatInputModule } from '@angular/material/input'; import { MatButtonToggleModule } from '@angular/material/button-toggle'; import { MatCardModule } from '@angular/material/card'; import { FlexLayoutModule } from '@angular/flex-layout'; @@ -15,7 +16,6 @@ import { AppComponent } from './app.component'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { StatusListComponent } from './lists/status-list/status-list.component'; -import { FolderListComponent } from './lists/folder-list/folder-list.component'; import { DeviceListComponent } from './lists/device-list/device-list.component'; import { DonutChartComponent } from './charts/donut-chart/donut-chart.component'; import { DashboardComponent } from './dashboard/dashboard.component'; @@ -28,23 +28,25 @@ import { deviceID } from './api-utils'; import { environment } from '../environments/environment'; import { ChartItemComponent } from './charts/chart-item/chart-item.component'; import { ChartComponent } from './charts/chart/chart.component'; +import { FolderListComponent } from './lists/folder-list/folder-list.component'; @NgModule({ declarations: [ AppComponent, StatusListComponent, - FolderListComponent, DeviceListComponent, ListToggleComponent, DashboardComponent, DonutChartComponent, ChartComponent, ChartItemComponent, + FolderListComponent, ], imports: [ BrowserModule, AppRoutingModule, BrowserAnimationsModule, + MatInputModule, MatTableModule, MatPaginatorModule, MatSortModule, diff --git a/src/app/lists/device-list/device-list.component.html b/src/app/lists/device-list/device-list.component.html index 86d7bcfef..7500bd3c4 100644 --- a/src/app/lists/device-list/device-list.component.html +++ b/src/app/lists/device-list/device-list.component.html @@ -1,22 +1,20 @@ -
- - - - - - +
Id{{row.deviceID}}
+ + + + + - - - - - + + + + + - - -
Id{{row.deviceID}}Name{{row.name}}Name{{row.name}}
+ + + - - -
\ No newline at end of file + + \ No newline at end of file diff --git a/src/app/lists/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts index 2a3599684..f29dc59d5 100644 --- a/src/app/lists/device-list/device-list.component.ts +++ b/src/app/lists/device-list/device-list.component.ts @@ -1,13 +1,10 @@ import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { MatTable } from '@angular/material/table'; +import { MatTable, MatTableDataSource } from '@angular/material/table'; -import { DeviceListDataSource } from './device-list-datasource'; import Device from '../../device'; import { SystemConfigService } from '../../services/system-config.service'; -import { dataTableElevation } from '../../style'; -import { Subject } from 'rxjs'; @Component({ selector: 'app-device-list', @@ -18,8 +15,7 @@ export class DeviceListComponent implements AfterViewInit, OnInit { @ViewChild(MatPaginator) paginator: MatPaginator; @ViewChild(MatSort) sort: MatSort; @ViewChild(MatTable) table: MatTable; - dataSource: DeviceListDataSource; - elevation: string = dataTableElevation; + dataSource: MatTableDataSource; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['id', 'name']; @@ -27,14 +23,12 @@ export class DeviceListComponent implements AfterViewInit, OnInit { constructor(private systemConfigService: SystemConfigService) { }; ngOnInit() { - this.dataSource = new DeviceListDataSource(this.systemConfigService); - this.dataSource.dataSubject = new Subject() + this.dataSource = new MatTableDataSource(); this.dataSource.data = []; this.systemConfigService.getDevices().subscribe( data => { this.dataSource.data = data; - this.dataSource.dataSubject.next(data); } ); } diff --git a/src/app/lists/folder-list/folder-list-datasource.ts b/src/app/lists/folder-list/folder-list-datasource.ts deleted file mode 100644 index e107b629f..000000000 --- a/src/app/lists/folder-list/folder-list-datasource.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { DataSource } from '@angular/cdk/collections'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; - -import { map } from 'rxjs/operators'; -import { Observable, of as observableOf, merge, Subject } from 'rxjs'; -import Folder from '../../folder'; -import { SystemConfigService } from '../../services/system-config.service'; - -/** - * Data source for the FolderList view. This class should - * encapsulate all logic for fetching and manipulating the displayed data - * (including sorting, pagination, and filtering). - */ -export class FolderListDataSource extends DataSource { - data: Folder[]; - dataSubject: Subject; - paginator: MatPaginator; - sort: MatSort; - - constructor(private systemConfigService: SystemConfigService) { - super(); - } - - /** - * Connect this data source to the table. The table will only update when - * the returned stream emits new items. - * @returns A stream of the items to be rendered. - */ - connect(): Observable { - // Combine everything that affects the rendered data into one update - // st - const dataMutations = [ - this.dataSubject, - observableOf(this.data), - this.paginator.page, - this.sort.sortChange - ]; - - return merge(...dataMutations).pipe(map(() => { - return this.getPagedData(this.getSortedData([...this.data])); - })); - } - - /** - * Called when the table is being destroyed. Use this function, to clean up - * any open connections or free any held resources that were set up during connect. - */ - disconnect() { } - - /** - * Paginate the data (client-side). If you're using server-side pagination, - * this would be replaced by requesting the appropriate data from the server. - */ - private getPagedData(data: Folder[]) { - const startIndex = this.paginator.pageIndex * this.paginator.pageSize; - return data.splice(startIndex, this.paginator.pageSize); - } - - /** - * Sort the data (client-side). If you're using server-side sorting, - * this would be replaced by requesting the appropriate data from the server. - */ - private getSortedData(data: Folder[]) { - if (!this.sort.active || this.sort.direction === '') { - return data; - } - - return data.sort((a, b) => { - const isAsc = this.sort.direction === 'asc'; - switch (this.sort.active) { - case 'label': return compare(a.label, b.label, isAsc); - case 'id': return compare(+a.id, +b.id, isAsc); - default: return 0; - } - }); - } -} - -function compare(a: string | number, b: string | number, isAsc: boolean) { - return (a < b ? -1 : 1) * (isAsc ? 1 : -1); -} diff --git a/src/app/lists/folder-list/folder-list.component.html b/src/app/lists/folder-list/folder-list.component.html index 90f3840a3..d4bee42e4 100644 --- a/src/app/lists/folder-list/folder-list.component.html +++ b/src/app/lists/folder-list/folder-list.component.html @@ -1,22 +1,24 @@ -
- + + Filter + + +
- - + + - + - - + + -
Id{{row.id}}Id{{row.id}} Label{{row.label}}Name{{row.label}}
+ - - -
\ No newline at end of file + \ No newline at end of file diff --git a/src/app/lists/folder-list/folder-list.component.scss b/src/app/lists/folder-list/folder-list.component.scss index 5050fb6e0..fe285c560 100644 --- a/src/app/lists/folder-list/folder-list.component.scss +++ b/src/app/lists/folder-list/folder-list.component.scss @@ -1,3 +1,3 @@ .full-width-table { - width: 100%; -} + width: 100%; +} \ No newline at end of file diff --git a/src/app/lists/folder-list/folder-list.component.spec.ts b/src/app/lists/folder-list/folder-list.component.spec.ts index af35e6f7e..225398c99 100644 --- a/src/app/lists/folder-list/folder-list.component.spec.ts +++ b/src/app/lists/folder-list/folder-list.component.spec.ts @@ -1,8 +1,4 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatSortModule } from '@angular/material/sort'; -import { MatTableModule } from '@angular/material/table'; import { FolderListComponent } from './folder-list.component'; @@ -12,14 +8,9 @@ describe('FolderListComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [FolderListComponent], - imports: [ - NoopAnimationsModule, - MatPaginatorModule, - MatSortModule, - MatTableModule, - ] - }).compileComponents(); + declarations: [ FolderListComponent ] + }) + .compileComponents(); })); beforeEach(() => { @@ -28,7 +19,7 @@ describe('FolderListComponent', () => { fixture.detectChanges(); }); - it('should compile', () => { + it('should create', () => { expect(component).toBeTruthy(); }); }); diff --git a/src/app/lists/folder-list/folder-list.component.ts b/src/app/lists/folder-list/folder-list.component.ts index f9eddd7ec..cae3ba900 100644 --- a/src/app/lists/folder-list/folder-list.component.ts +++ b/src/app/lists/folder-list/folder-list.component.ts @@ -1,13 +1,10 @@ -import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, OnInit, ViewChild, Input } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { MatTable } from '@angular/material/table'; +import { MatTable, MatTableDataSource } from '@angular/material/table'; -import { FolderListDataSource } from './folder-list-datasource'; import Folder from '../../folder'; import { SystemConfigService } from '../../services/system-config.service'; -import { dataTableElevation } from '../../style'; -import { Subject } from 'rxjs'; @Component({ selector: 'app-folder-list', @@ -18,8 +15,12 @@ export class FolderListComponent implements AfterViewInit, OnInit { @ViewChild(MatPaginator) paginator: MatPaginator; @ViewChild(MatSort) sort: MatSort; @ViewChild(MatTable) table: MatTable; - dataSource: FolderListDataSource; - elevation: string = dataTableElevation; + dataSource: MatTableDataSource; + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value; + this.dataSource.filter = filterValue.trim().toLowerCase(); + } /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['id', 'label']; @@ -27,14 +28,12 @@ export class FolderListComponent implements AfterViewInit, OnInit { constructor(private systemConfigService: SystemConfigService) { }; ngOnInit() { - this.dataSource = new FolderListDataSource(this.systemConfigService); - this.dataSource.dataSubject = new Subject(); + this.dataSource = new MatTableDataSource(); this.dataSource.data = []; this.systemConfigService.getFolders().subscribe( data => { this.dataSource.data = data; - this.dataSource.dataSubject.next(data); } ); } @@ -44,4 +43,4 @@ export class FolderListComponent implements AfterViewInit, OnInit { this.dataSource.paginator = this.paginator; this.table.dataSource = this.dataSource; } -} +} \ No newline at end of file From d384ac52a1ef3c76e2eec7f9395fc64577bbdf55 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 31 Mar 2020 09:28:15 -0400 Subject: [PATCH 076/120] use relative path for base-href and meta.js --- src/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.html b/src/index.html index fc77e57e2..1f9d1b7bd 100644 --- a/src/index.html +++ b/src/index.html @@ -4,10 +4,10 @@ TechUi - + - + From f59a26cb80c625ca804671a6aadacabb544fc9db Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 31 Mar 2020 09:33:00 -0400 Subject: [PATCH 077/120] relative path apiURL --- src/app/api-utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/api-utils.ts b/src/app/api-utils.ts index cf37ad807..fa2d54bda 100644 --- a/src/app/api-utils.ts +++ b/src/app/api-utils.ts @@ -5,6 +5,6 @@ export const deviceID = (): String => { return dID.substring(0, 5) } -export const apiURL: String = 'http://127.0.0.1:8384/' +export const apiURL: String = '/' export const apiRetry: number = 3; \ No newline at end of file From 865f1f2ea691ee3c35e115c99953562748fb3794 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 31 Mar 2020 19:23:40 -0400 Subject: [PATCH 078/120] reduce mock data delay for testing --- src/app/app.module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 9d17cc917..2a8d96159 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -60,7 +60,7 @@ import { FolderListComponent } from './lists/folder-list/folder-list.component'; }), environment.production ? [] : HttpClientInMemoryWebApiModule.forRoot(InMemoryConfigDataService, - { dataEncapsulation: false, delay: 200 }), + { dataEncapsulation: false, delay: 10 }), ], providers: [httpInterceptorProviders], bootstrap: [AppComponent] From 06eacb87d8f08e442011fd73c2eee2e709769c0d Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 31 Mar 2020 19:24:36 -0400 Subject: [PATCH 079/120] Add additional columns, styling and data to lists --- src/app/api-utils.ts | 1 - src/app/charts/chart/chart.component.ts | 12 +-- src/app/device.ts | 5 +- src/app/folder.ts | 3 + .../list-toggle/list-toggle.component.html | 2 +- .../device-list/device-list-datasource.ts | 82 ------------------- .../device-list/device-list.component.html | 6 ++ .../device-list/device-list.component.ts | 2 +- .../folder-list/folder-list.component.html | 14 +++- .../folder-list/folder-list.component.ts | 2 +- .../status-list/status-list.component.html | 2 +- .../status-list/status-list.component.scss | 7 ++ src/app/services/device.service.ts | 4 +- src/app/services/folder.service.ts | 2 + src/styles.scss | 9 +- 15 files changed, 51 insertions(+), 102 deletions(-) delete mode 100644 src/app/lists/device-list/device-list-datasource.ts diff --git a/src/app/api-utils.ts b/src/app/api-utils.ts index fa2d54bda..50d0a874d 100644 --- a/src/app/api-utils.ts +++ b/src/app/api-utils.ts @@ -6,5 +6,4 @@ export const deviceID = (): String => { } export const apiURL: String = '/' - export const apiRetry: number = 3; \ No newline at end of file diff --git a/src/app/charts/chart/chart.component.ts b/src/app/charts/chart/chart.component.ts index dd7beb3fe..f719e5a30 100644 --- a/src/app/charts/chart/chart.component.ts +++ b/src/app/charts/chart/chart.component.ts @@ -45,24 +45,20 @@ export class ChartComponent implements OnInit { ngAfterViewInit() { let totalCount: number = 0; this.service.getAll().subscribe( - folder => { + t => { // Count the number of folders and set chart totalCount++; this.donutChart.count = totalCount; // Get StateType and convert to string - let stateType; - let state: string; + const stateType = t.stateType; + const state = t.state; let color; switch (this.type) { case Type.Folder: - stateType = Folder.getStateType(folder); - state = Folder.stateTypeToString(stateType); - color = Folder.stateTypeToColor(stateType); + color = Folder.stateTypeToColor(t.stateType); break; case Type.Device: - stateType = Device.getStateType(folder); - state = Device.stateTypeToString(stateType); color = Device.stateTypeToColor(stateType); break; } diff --git a/src/app/device.ts b/src/app/device.ts index 42a889a30..4a285b069 100644 --- a/src/app/device.ts +++ b/src/app/device.ts @@ -3,7 +3,8 @@ import { colors } from './style'; interface Device { deviceID: string; name: string; - state: Device.StateType; + stateType: Device.StateType; + state: string; paused: boolean; connected: boolean; completion: number; @@ -70,7 +71,7 @@ namespace Device { export function getStateType(d: Device): StateType { // StateType Unknown is set in DeviceService - if (d.state === StateType.Unknown) { + if (d.stateType === StateType.Unknown) { return StateType.Unknown; } diff --git a/src/app/folder.ts b/src/app/folder.ts index fb8169e64..c3330f0ff 100644 --- a/src/app/folder.ts +++ b/src/app/folder.ts @@ -6,8 +6,11 @@ interface Folder { label: string; devices: Device[]; status: Folder.Status; + stateType: Folder.StateType; + state: string; paused: boolean; completion: number; + path: string; } namespace Folder { diff --git a/src/app/list-toggle/list-toggle.component.html b/src/app/list-toggle/list-toggle.component.html index f360d7f5d..51c58f0fb 100644 --- a/src/app/list-toggle/list-toggle.component.html +++ b/src/app/list-toggle/list-toggle.component.html @@ -1,4 +1,4 @@ - + Folders Devices \ No newline at end of file diff --git a/src/app/lists/device-list/device-list-datasource.ts b/src/app/lists/device-list/device-list-datasource.ts deleted file mode 100644 index 94007cacd..000000000 --- a/src/app/lists/device-list/device-list-datasource.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { DataSource } from '@angular/cdk/collections'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; - -import { map } from 'rxjs/operators'; -import { Observable, of as observableOf, merge, Subject } from 'rxjs'; -import Device from '../../device'; -import { SystemConfigService } from '../../services/system-config.service'; - -/** - * Data source for the DeviceList view. This class should - * encapsulate all logic for fetching and manipulating the displayed data - * (including sorting, pagination, and filtering). - */ -export class DeviceListDataSource extends DataSource { - data: Device[]; - dataSubject: Subject; - paginator: MatPaginator; - sort: MatSort; - - constructor(private systemConfigService: SystemConfigService) { - super(); - } - - /** - * Connect this data source to the table. The table will only update when - * the returned stream emits new items. - * @returns A stream of the items to be rendered. - */ - connect(): Observable { - // Combine everything that affects the rendered data into one update - // st - const dataMutations = [ - this.dataSubject, - observableOf(this.data), - this.paginator.page, - this.sort.sortChange - ]; - - return merge(...dataMutations).pipe(map(() => { - return this.getPagedData(this.getSortedData([...this.data])); - })); - } - - /** - * Called when the table is being destroyed. Use this function, to clean up - * any open connections or free any held resources that were set up during connect. - */ - disconnect() { } - - /** - * Paginate the data (client-side). If you're using server-side pagination, - * this would be replaced by requesting the appropriate data from the server. - */ - private getPagedData(data: Device[]) { - const startIndex = this.paginator.pageIndex * this.paginator.pageSize; - return data.splice(startIndex, this.paginator.pageSize); - } - - /** - * Sort the data (client-side). If you're using server-side sorting, - * this would be replaced by requesting the appropriate data from the server. - */ - private getSortedData(data: Device[]) { - if (!this.sort.active || this.sort.direction === '') { - return data; - } - - return data.sort((a, b) => { - const isAsc = this.sort.direction === 'asc'; - switch (this.sort.active) { - case 'name': return compare(a.name, b.name, isAsc); - case 'id': return compare(+a.deviceID, +b.deviceID, isAsc); - default: return 0; - } - }); - } -} - -function compare(a: string | number, b: string | number, isAsc: boolean) { - return (a < b ? -1 : 1) * (isAsc ? 1 : -1); -} \ No newline at end of file diff --git a/src/app/lists/device-list/device-list.component.html b/src/app/lists/device-list/device-list.component.html index 7500bd3c4..2b2fdd055 100644 --- a/src/app/lists/device-list/device-list.component.html +++ b/src/app/lists/device-list/device-list.component.html @@ -11,6 +11,12 @@ {{row.name}} + + + State + {{row.state}} + + diff --git a/src/app/lists/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts index f29dc59d5..6f601f305 100644 --- a/src/app/lists/device-list/device-list.component.ts +++ b/src/app/lists/device-list/device-list.component.ts @@ -18,7 +18,7 @@ export class DeviceListComponent implements AfterViewInit, OnInit { dataSource: MatTableDataSource; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - displayedColumns = ['id', 'name']; + displayedColumns = ['id', 'name', 'state']; constructor(private systemConfigService: SystemConfigService) { }; diff --git a/src/app/lists/folder-list/folder-list.component.html b/src/app/lists/folder-list/folder-list.component.html index d4bee42e4..292726959 100644 --- a/src/app/lists/folder-list/folder-list.component.html +++ b/src/app/lists/folder-list/folder-list.component.html @@ -9,12 +9,24 @@ {{row.id}} - + Name {{row.label}} + + + Path + {{row.path}} + + + + + State + {{row.state}} + + diff --git a/src/app/lists/folder-list/folder-list.component.ts b/src/app/lists/folder-list/folder-list.component.ts index cae3ba900..07936f81d 100644 --- a/src/app/lists/folder-list/folder-list.component.ts +++ b/src/app/lists/folder-list/folder-list.component.ts @@ -23,7 +23,7 @@ export class FolderListComponent implements AfterViewInit, OnInit { } /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - displayedColumns = ['id', 'label']; + displayedColumns = ['id', 'label', 'path', 'state']; constructor(private systemConfigService: SystemConfigService) { }; diff --git a/src/app/lists/status-list/status-list.component.html b/src/app/lists/status-list/status-list.component.html index 8783944a5..986deb682 100644 --- a/src/app/lists/status-list/status-list.component.html +++ b/src/app/lists/status-list/status-list.component.html @@ -1,7 +1,7 @@
{{title | uppercase}}
- +
diff --git a/src/app/lists/status-list/status-list.component.scss b/src/app/lists/status-list/status-list.component.scss index e69de29bb..213f72723 100644 --- a/src/app/lists/status-list/status-list.component.scss +++ b/src/app/lists/status-list/status-list.component.scss @@ -0,0 +1,7 @@ +.tui-card-toggle { + padding: 16px 16px 0 16px; +} + +.tui-card-content { + padding-top: 0; +} \ No newline at end of file diff --git a/src/app/services/device.service.ts b/src/app/services/device.service.ts index f2a37d33f..6894fa6a7 100644 --- a/src/app/services/device.service.ts +++ b/src/app/services/device.service.ts @@ -35,7 +35,7 @@ export class DeviceService { if (this.sysConns.connections[device.deviceID] === undefined) { console.log(this.sysConns.connections) console.log("connections undefined", device.deviceID); - device.state = Device.StateType.Unknown; + device.stateType = Device.StateType.Unknown; } else { // Set connected device.connected = this.sysConns.connections[device.deviceID].connected; @@ -49,6 +49,8 @@ export class DeviceService { this.dbCompletionService.getDeviceCompletion(device.deviceID).subscribe( c => { device.completion = c.completion; + device.stateType = Device.getStateType(device); + device.state = Device.stateTypeToString(device.stateType); observer.next(device); // recursively get the status of the next folder diff --git a/src/app/services/folder.service.ts b/src/app/services/folder.service.ts index 8726d83bd..0c433f757 100644 --- a/src/app/services/folder.service.ts +++ b/src/app/services/folder.service.ts @@ -26,6 +26,8 @@ export class FolderService { this.dbStatusService.getFolderStatus(folder.id).subscribe( status => { folder.status = status; + folder.stateType = Folder.getStateType(folder); + folder.state = Folder.stateTypeToString(folder.stateType); observer.next(folder); // recursively get the status of the next folder diff --git a/src/styles.scss b/src/styles.scss index 08d859424..53fde9226 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -52,11 +52,10 @@ $tech-ui-typography: mat-typography-config( // Be sure that you only ever include this mixin once! @include mat-core($tech-ui-typography); - // Define the palettes for your theme using the Material Design palettes available in palette.scss // (imported above). For each palette, you can optionally specify a default, lighter, and darker // hue. Available color palettes: https://material.io/design/color/ -$tech-ui-primary: mat-palette($mat-indigo); +$tech-ui-primary: mat-palette($mat-blue); $tech-ui-accent: mat-palette($mat-blue, A200, A100, A400); // The warn palette is optional (defaults to red). @@ -93,4 +92,8 @@ html, body { .tui-card-content { padding: 16px; -} \ No newline at end of file +} + +.tui-button-toggle .mat-button-toggle-appearance-standard .mat-button-toggle-label-content { + line-height: 34px; +} From cce8b6051513a117591d4aab7cedfacdc3723323 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 31 Mar 2020 20:36:56 -0400 Subject: [PATCH 080/120] adjust filter style and add filter to device list --- .../device-list/device-list.component.html | 6 +- .../device-list/device-list.component.scss | 5 ++ .../device-list/device-list.component.ts | 5 ++ .../folder-list/folder-list.component.html | 4 +- .../folder-list/folder-list.component.scss | 5 ++ .../folder-list/folder-list.component.ts | 10 +-- .../status-list/status-list.component.ts | 1 - src/app/style.ts | 2 +- src/styles.scss | 89 +++++++++++++------ 9 files changed, 88 insertions(+), 39 deletions(-) diff --git a/src/app/lists/device-list/device-list.component.html b/src/app/lists/device-list/device-list.component.html index 2b2fdd055..f831c6d45 100644 --- a/src/app/lists/device-list/device-list.component.html +++ b/src/app/lists/device-list/device-list.component.html @@ -1,3 +1,7 @@ + + Filter + + @@ -21,6 +25,6 @@
- \ No newline at end of file diff --git a/src/app/lists/device-list/device-list.component.scss b/src/app/lists/device-list/device-list.component.scss index 5050fb6e0..db68f4f6b 100644 --- a/src/app/lists/device-list/device-list.component.scss +++ b/src/app/lists/device-list/device-list.component.scss @@ -1,3 +1,8 @@ .full-width-table { width: 100%; } + +.mat-form-field { + font-size: 14px; + width: 100%; +} \ No newline at end of file diff --git a/src/app/lists/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts index 6f601f305..e23f74a9f 100644 --- a/src/app/lists/device-list/device-list.component.ts +++ b/src/app/lists/device-list/device-list.component.ts @@ -22,6 +22,11 @@ export class DeviceListComponent implements AfterViewInit, OnInit { constructor(private systemConfigService: SystemConfigService) { }; + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value; + this.dataSource.filter = filterValue.trim().toLowerCase(); + } + ngOnInit() { this.dataSource = new MatTableDataSource(); this.dataSource.data = []; diff --git a/src/app/lists/folder-list/folder-list.component.html b/src/app/lists/folder-list/folder-list.component.html index 292726959..aeee70087 100644 --- a/src/app/lists/folder-list/folder-list.component.html +++ b/src/app/lists/folder-list/folder-list.component.html @@ -1,6 +1,6 @@ Filter - + @@ -31,6 +31,6 @@
- \ No newline at end of file diff --git a/src/app/lists/folder-list/folder-list.component.scss b/src/app/lists/folder-list/folder-list.component.scss index fe285c560..1b527298e 100644 --- a/src/app/lists/folder-list/folder-list.component.scss +++ b/src/app/lists/folder-list/folder-list.component.scss @@ -1,3 +1,8 @@ .full-width-table { width: 100%; +} + +.mat-form-field { + font-size: 14px; + width: 100%; } \ No newline at end of file diff --git a/src/app/lists/folder-list/folder-list.component.ts b/src/app/lists/folder-list/folder-list.component.ts index 07936f81d..faca8face 100644 --- a/src/app/lists/folder-list/folder-list.component.ts +++ b/src/app/lists/folder-list/folder-list.component.ts @@ -17,16 +17,16 @@ export class FolderListComponent implements AfterViewInit, OnInit { @ViewChild(MatTable) table: MatTable; dataSource: MatTableDataSource; - applyFilter(event: Event) { - const filterValue = (event.target as HTMLInputElement).value; - this.dataSource.filter = filterValue.trim().toLowerCase(); - } - /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['id', 'label', 'path', 'state']; constructor(private systemConfigService: SystemConfigService) { }; + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value; + this.dataSource.filter = filterValue.trim().toLowerCase(); + } + ngOnInit() { this.dataSource = new MatTableDataSource(); this.dataSource.data = []; diff --git a/src/app/lists/status-list/status-list.component.ts b/src/app/lists/status-list/status-list.component.ts index 910ca4798..eb849e88e 100644 --- a/src/app/lists/status-list/status-list.component.ts +++ b/src/app/lists/status-list/status-list.component.ts @@ -13,7 +13,6 @@ export class StatusListComponent implements OnInit { listType = Type; // used in html elevation: string = cardElevation; title: string = 'Status'; - folderList: Type = Type.Folder; constructor() { } diff --git a/src/app/style.ts b/src/app/style.ts index 37f3aa670..7caaba665 100644 --- a/src/app/style.ts +++ b/src/app/style.ts @@ -8,4 +8,4 @@ export const colors: Map = new Map([ ["green", "#56C568"], ["grey", "#DDDDDD"], ["red", "#EB5757"] -]); \ No newline at end of file +]); \ No newline at end of file diff --git a/src/styles.scss b/src/styles.scss index 53fde9226..7cddd28e1 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,32 +1,6 @@ -// Chart.js styles -#chartjs-tooltip { - /* max z-index value */ - z-index: 2147483647; - opacity: 0; - position: absolute; - background: rgba(0, 0, 0, .7); - color: white; - border-radius: 3px; - -webkit-transition: opacity .3s ease; - transition: opacity .3s ease; - pointer-events: none; - -webkit-transform: translate(-50%, 0); - transform: translate(-50%, 0); -} - -.chartjs-tooltip-key { - display: inline-block; - width: 10px; - height: 10px; - margin-right: 10px; -} - - // Custom Theming for Angular Material // For more information: https://material.angular.io/guide/theming @import '~@angular/material/theming'; -// Plus imports for other components in your app. - // Custom typography $tech-ui-typography: mat-typography-config( @@ -55,8 +29,42 @@ $tech-ui-typography: mat-typography-config( // Define the palettes for your theme using the Material Design palettes available in palette.scss // (imported above). For each palette, you can optionally specify a default, lighter, and darker // hue. Available color palettes: https://material.io/design/color/ -$tech-ui-primary: mat-palette($mat-blue); -$tech-ui-accent: mat-palette($mat-blue, A200, A100, A400); +$tech-ui-red: #EB5757; +$tech-ui-blue: ( + 50: #0891D1, + 100: #0891D1, + 200: #0891D1, + 300: #0891D1, + 400: #0891D1, + 500: #0891D1, + 600: #0891D1, + 700: #0891D1, + 800: #0891D1, + 900: #0891D1, + A100: #0891D1, + A200: #0891D1, + A400: #0891D1, + A700: #0891D1, + contrast: ( + 50: $dark-primary-text, + 100: $dark-primary-text, + 200: $dark-primary-text, + 300: $dark-primary-text, + 400: $dark-primary-text, + 500: $light-primary-text, + 600: $light-primary-text, + 700: $light-primary-text, + 800: $light-primary-text, + 900: $light-primary-text, + A100: $dark-primary-text, + A200: $light-primary-text, + A400: $light-primary-text, + A700: $light-primary-text, + ) +); + +$tech-ui-primary: mat-palette($tech-ui-blue); +$tech-ui-accent: mat-palette($tech-ui-blue, A200, A100, A400); // The warn palette is optional (defaults to red). $tech-ui-warn: mat-palette($mat-red); @@ -87,7 +95,7 @@ html, body { .tui-card-title { padding: 16px 16px 0 16px; font-size: mat-font-size($tech-ui-typography, subheading-2); - color: #0891D1; + color: mat-color($tech-ui-primary); } .tui-card-content { @@ -97,3 +105,26 @@ html, body { .tui-button-toggle .mat-button-toggle-appearance-standard .mat-button-toggle-label-content { line-height: 34px; } + +// Chart.js styles +#chartjs-tooltip { + /* max z-index value */ + z-index: 2147483647; + opacity: 0; + position: absolute; + background: rgba(0, 0, 0, .7); + color: white; + border-radius: 3px; + -webkit-transition: opacity .3s ease; + transition: opacity .3s ease; + pointer-events: none; + -webkit-transform: translate(-50%, 0); + transform: translate(-50%, 0); +} + +.chartjs-tooltip-key { + display: inline-block; + width: 10px; + height: 10px; + margin-right: 10px; +} \ No newline at end of file From 3bdceb1d6b464aae00760c44e81bf84c19afd985 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 1 Apr 2020 20:43:54 -0400 Subject: [PATCH 081/120] add filter service and enable chart states to filter lists --- .../chart-item/chart-item.component.html | 2 +- .../charts/chart-item/chart-item.component.ts | 9 ++--- src/app/charts/chart/chart.component.html | 3 +- src/app/charts/chart/chart.component.ts | 25 +++++++++----- src/app/dashboard/dashboard.component.ts | 10 +++--- .../list-toggle/list-toggle.component.html | 2 +- src/app/list-toggle/list-toggle.component.ts | 17 +++------- .../device-list/device-list.component.html | 2 +- .../device-list/device-list.component.ts | 21 ++++++++++-- .../folder-list/folder-list.component.html | 2 +- .../folder-list/folder-list.component.ts | 23 +++++++++++-- .../status-list/status-list.component.ts | 33 ++++++++++++++----- src/app/services/filter.service.spec.ts | 16 +++++++++ src/app/services/filter.service.ts | 25 ++++++++++++++ src/app/type.ts | 2 +- 15 files changed, 144 insertions(+), 48 deletions(-) create mode 100644 src/app/services/filter.service.spec.ts create mode 100644 src/app/services/filter.service.ts diff --git a/src/app/charts/chart-item/chart-item.component.html b/src/app/charts/chart-item/chart-item.component.html index ecd881fa1..204b72677 100644 --- a/src/app/charts/chart-item/chart-item.component.html +++ b/src/app/charts/chart-item/chart-item.component.html @@ -1,5 +1,5 @@
-
{{state}}:  
+
{{count}}
\ No newline at end of file diff --git a/src/app/charts/chart-item/chart-item.component.ts b/src/app/charts/chart-item/chart-item.component.ts index 601ba8626..6dbeb3bdc 100644 --- a/src/app/charts/chart-item/chart-item.component.ts +++ b/src/app/charts/chart-item/chart-item.component.ts @@ -1,16 +1,13 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, Input } from '@angular/core'; @Component({ selector: 'app-chart-item', templateUrl: './chart-item.component.html', styleUrls: ['./chart-item.component.scss'] }) -export class ChartItemComponent implements OnInit { +export class ChartItemComponent { @Input() state: string; @Input() count: number; + constructor() { } - - ngOnInit(): void { - } - } diff --git a/src/app/charts/chart/chart.component.html b/src/app/charts/chart/chart.component.html index 3b741f09c..960ea079b 100644 --- a/src/app/charts/chart/chart.component.html +++ b/src/app/charts/chart/chart.component.html @@ -4,7 +4,8 @@
- +
diff --git a/src/app/charts/chart/chart.component.ts b/src/app/charts/chart/chart.component.ts index f719e5a30..793870ad3 100644 --- a/src/app/charts/chart/chart.component.ts +++ b/src/app/charts/chart/chart.component.ts @@ -5,7 +5,8 @@ import { FolderService } from 'src/app/services/folder.service'; import { DonutChartComponent } from '../donut-chart/donut-chart.component'; import { DeviceService } from 'src/app/services/device.service'; import Device from 'src/app/device'; -import { Type } from '../../type'; +import { StType } from '../../type'; +import { FilterService } from 'src/app/services/filter.service'; @@ -17,7 +18,7 @@ import { Type } from '../../type'; export class ChartComponent implements OnInit { @ViewChild(DonutChartComponent) donutChart: DonutChartComponent; - @Input() type: Type; + @Input() type: StType; title: string; chartID: string; states: { label: string, count: number, color: string }[] = []; @@ -25,16 +26,25 @@ export class ChartComponent implements OnInit { service: any; namespace: any; - constructor(private folderService: FolderService, private deviceServce: DeviceService) { } + constructor( + private folderService: FolderService, + private deviceServce: DeviceService, + private filterService: FilterService, + ) { } + + onItemSelect(state: string) { + // Send chart item state to filter + this.filterService.changeFilter({ type: this.type, text: state }); + } ngOnInit(): void { switch (this.type) { - case Type.Folder: + case StType.Folder: this.title = "Folders"; this.chartID = 'foldersChart'; this.service = this.folderService; break; - case Type.Device: + case StType.Device: this.title = "Devices"; this.chartID = 'devicesChart'; this.service = this.deviceServce; @@ -55,10 +65,10 @@ export class ChartComponent implements OnInit { const state = t.state; let color; switch (this.type) { - case Type.Folder: + case StType.Folder: color = Folder.stateTypeToColor(t.stateType); break; - case Type.Device: + case StType.Device: color = Device.stateTypeToColor(stateType); break; } @@ -73,7 +83,6 @@ export class ChartComponent implements OnInit { }); if (!found) { - console.log(color, "look!!!") this.states.push({ label: state, count: 1, color: color }); } diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts index 7a956f569..2ea56b163 100644 --- a/src/app/dashboard/dashboard.component.ts +++ b/src/app/dashboard/dashboard.component.ts @@ -1,15 +1,17 @@ import { Component, OnInit } from '@angular/core'; import { SystemConfigService } from '../services/system-config.service'; -import { Type } from '../type'; +import { StType } from '../type'; +import { FilterService } from '../services/filter.service'; @Component({ selector: 'app-dashboard', templateUrl: './dashboard.component.html', - styleUrls: ['./dashboard.component.scss'] + styleUrls: ['./dashboard.component.scss'], + providers: [FilterService] }) export class DashboardComponent { - folderChart: Type = Type.Folder; - deviceChart: Type = Type.Device; + folderChart: StType = StType.Folder; + deviceChart: StType = StType.Device; constructor(private systemConfigService: SystemConfigService) { } diff --git a/src/app/list-toggle/list-toggle.component.html b/src/app/list-toggle/list-toggle.component.html index 51c58f0fb..bbd52d54f 100644 --- a/src/app/list-toggle/list-toggle.component.html +++ b/src/app/list-toggle/list-toggle.component.html @@ -1,4 +1,4 @@ - + Folders Devices \ No newline at end of file diff --git a/src/app/list-toggle/list-toggle.component.ts b/src/app/list-toggle/list-toggle.component.ts index e1f3e6a0e..cab39e70d 100644 --- a/src/app/list-toggle/list-toggle.component.ts +++ b/src/app/list-toggle/list-toggle.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, OnInit, Output } from '@angular/core'; -import { Type } from '../type'; +import { StType } from '../type'; @@ -10,22 +10,15 @@ import { Type } from '../type'; }) export class ListToggleComponent implements OnInit { - public listType = Type; - @Output() listTypeEvent = new EventEmitter(); + public listType = StType; + public toggleValue: string = "folders"; + @Output() listTypeEvent = new EventEmitter(); constructor() { } ngOnInit(): void { } - onSelect(t: Type): void { + onSelect(t: StType): void { this.listTypeEvent.emit(t); - switch (t) { - case Type.Folder: - console.log("folder action"); - break; - case Type.Device: - console.log("Device action"); - break; - } } } \ No newline at end of file diff --git a/src/app/lists/device-list/device-list.component.html b/src/app/lists/device-list/device-list.component.html index f831c6d45..5cc013d38 100644 --- a/src/app/lists/device-list/device-list.component.html +++ b/src/app/lists/device-list/device-list.component.html @@ -1,6 +1,6 @@ Filter - + diff --git a/src/app/lists/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts index e23f74a9f..fc1c1af22 100644 --- a/src/app/lists/device-list/device-list.component.ts +++ b/src/app/lists/device-list/device-list.component.ts @@ -1,10 +1,12 @@ -import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { MatTable, MatTableDataSource } from '@angular/material/table'; import Device from '../../device'; import { SystemConfigService } from '../../services/system-config.service'; +import { FilterService } from 'src/app/services/filter.service'; +import { StType } from 'src/app/type'; @Component({ selector: 'app-device-list', @@ -16,11 +18,16 @@ export class DeviceListComponent implements AfterViewInit, OnInit { @ViewChild(MatSort) sort: MatSort; @ViewChild(MatTable) table: MatTable; dataSource: MatTableDataSource; + filterValue: string = ""; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['id', 'name', 'state']; - constructor(private systemConfigService: SystemConfigService) { }; + constructor( + private systemConfigService: SystemConfigService, + private filterService: FilterService, + private cdr: ChangeDetectorRef, + ) { }; applyFilter(event: Event) { const filterValue = (event.target as HTMLInputElement).value; @@ -42,5 +49,15 @@ export class DeviceListComponent implements AfterViewInit, OnInit { this.dataSource.sort = this.sort; this.dataSource.paginator = this.paginator; this.table.dataSource = this.dataSource; + + // Listen for filter changes from other components + this.filterService.filterChanged$.subscribe( + input => { + if (input.type === StType.Device) { + this.dataSource.filter = input.text.trim().toLowerCase(); + this.filterValue = input.text; + this.cdr.detectChanges(); + } + }); } } \ No newline at end of file diff --git a/src/app/lists/folder-list/folder-list.component.html b/src/app/lists/folder-list/folder-list.component.html index aeee70087..476276877 100644 --- a/src/app/lists/folder-list/folder-list.component.html +++ b/src/app/lists/folder-list/folder-list.component.html @@ -1,6 +1,6 @@ Filter - +
diff --git a/src/app/lists/folder-list/folder-list.component.ts b/src/app/lists/folder-list/folder-list.component.ts index faca8face..6c1185ff1 100644 --- a/src/app/lists/folder-list/folder-list.component.ts +++ b/src/app/lists/folder-list/folder-list.component.ts @@ -1,10 +1,12 @@ -import { AfterViewInit, Component, OnInit, ViewChild, Input } from '@angular/core'; +import { AfterViewInit, Component, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { MatTable, MatTableDataSource } from '@angular/material/table'; import Folder from '../../folder'; import { SystemConfigService } from '../../services/system-config.service'; +import { FilterService } from 'src/app/services/filter.service'; +import { StType } from 'src/app/type'; @Component({ selector: 'app-folder-list', @@ -16,11 +18,17 @@ export class FolderListComponent implements AfterViewInit, OnInit { @ViewChild(MatSort) sort: MatSort; @ViewChild(MatTable) table: MatTable; dataSource: MatTableDataSource; + filterValue: string = ""; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['id', 'label', 'path', 'state']; - constructor(private systemConfigService: SystemConfigService) { }; + constructor( + private systemConfigService: SystemConfigService, + private filterService: FilterService, + private cdr: ChangeDetectorRef, + ) { + }; applyFilter(event: Event) { const filterValue = (event.target as HTMLInputElement).value; @@ -42,5 +50,16 @@ export class FolderListComponent implements AfterViewInit, OnInit { this.dataSource.sort = this.sort; this.dataSource.paginator = this.paginator; this.table.dataSource = this.dataSource; + + // Listen for filter changes from other components + this.filterService.filterChanged$ + .subscribe( + input => { + if (input.type === StType.Folder) { + this.dataSource.filter = input.text.trim().toLowerCase(); + this.filterValue = input.text; + this.cdr.detectChanges(); + } + }); } } \ No newline at end of file diff --git a/src/app/lists/status-list/status-list.component.ts b/src/app/lists/status-list/status-list.component.ts index eb849e88e..04aa42cc3 100644 --- a/src/app/lists/status-list/status-list.component.ts +++ b/src/app/lists/status-list/status-list.component.ts @@ -1,6 +1,8 @@ -import { Component, OnInit } from '@angular/core'; -import { Type } from '../../type'; +import { Component, ViewChild, AfterViewInit } from '@angular/core'; +import { StType } from '../../type'; import { cardElevation } from '../../style'; +import { FilterService } from 'src/app/services/filter.service'; +import { ListToggleComponent } from 'src/app/list-toggle/list-toggle.component'; @Component({ @@ -8,18 +10,33 @@ import { cardElevation } from '../../style'; templateUrl: './status-list.component.html', styleUrls: ['./status-list.component.scss'] }) -export class StatusListComponent implements OnInit { - currentListType: Type = Type.Folder; - listType = Type; // used in html +export class StatusListComponent { + @ViewChild(ListToggleComponent) toggle: ListToggleComponent; + currentListType: StType = StType.Folder; + listType = StType; // used in html elevation: string = cardElevation; title: string = 'Status'; - constructor() { } + constructor(private filterService: FilterService) { } - ngOnInit(): void { + ngAfterViewInit() { + // Listen for filter changes from other components + this.filterService.filterChanged$.subscribe( + input => { + this.currentListType = input.type; + + switch (input.type) { + case StType.Folder: + this.toggle.toggleValue = "folders"; + break; + case StType.Device: + this.toggle.toggleValue = "devices"; + break; + } + }); } - onToggle(t: Type) { + onToggle(t: StType) { this.currentListType = t; } } diff --git a/src/app/services/filter.service.spec.ts b/src/app/services/filter.service.spec.ts new file mode 100644 index 000000000..279827c5c --- /dev/null +++ b/src/app/services/filter.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { FilterService } from './filter.service'; + +describe('FilterService', () => { + let service: FilterService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(FilterService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/filter.service.ts b/src/app/services/filter.service.ts new file mode 100644 index 000000000..2cf2a2611 --- /dev/null +++ b/src/app/services/filter.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { StType } from '../type'; +import { BehaviorSubject } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) + +export interface FilterInput { + type: StType; + text: string +} + +export class FilterService { + + constructor() { } + + private filterChangeSource = new BehaviorSubject({ type: StType.Folder, text: "" }); + + filterChanged$ = this.filterChangeSource.asObservable(); + + changeFilter(input: FilterInput) { + this.filterChangeSource.next(input); + } +} diff --git a/src/app/type.ts b/src/app/type.ts index ac23f2e66..408bfb869 100644 --- a/src/app/type.ts +++ b/src/app/type.ts @@ -1,4 +1,4 @@ -export enum Type { +export enum StType { Folder = 1, Device, } \ No newline at end of file From d76f1fe3561f1fe19223f6671adf53b032691e02 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 2 Apr 2020 10:19:51 -0400 Subject: [PATCH 082/120] Style chart item --- src/app/charts/chart-item/chart-item.component.html | 3 +-- src/app/charts/chart-item/chart-item.component.scss | 3 +++ src/styles.scss | 5 +++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/app/charts/chart-item/chart-item.component.html b/src/app/charts/chart-item/chart-item.component.html index 204b72677..35917c2fa 100644 --- a/src/app/charts/chart-item/chart-item.component.html +++ b/src/app/charts/chart-item/chart-item.component.html @@ -1,5 +1,4 @@ -
-
+
{{count}}
\ No newline at end of file diff --git a/src/app/charts/chart-item/chart-item.component.scss b/src/app/charts/chart-item/chart-item.component.scss index e69de29bb..90d5ee45c 100644 --- a/src/app/charts/chart-item/chart-item.component.scss +++ b/src/app/charts/chart-item/chart-item.component.scss @@ -0,0 +1,3 @@ +.item { + cursor: pointer; +} \ No newline at end of file diff --git a/src/styles.scss b/src/styles.scss index 7cddd28e1..a4664d9bd 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -86,6 +86,11 @@ html, body { line-height: mat-line-height($tech-ui-typography, body-1); } +a { + text-decoration: underline; + color: mat-color($tech-ui-primary); +} + .tui-card { background-color: white; border-radius: 4px; From a9b6801b2299550603a74086e4edd91a4010e6d1 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 2 Apr 2020 11:50:57 -0400 Subject: [PATCH 083/120] Store last filtered value between toggling of lists --- src/app/list-toggle/list-toggle.component.html | 2 +- src/app/list-toggle/list-toggle.component.ts | 6 ++++-- .../lists/device-list/device-list.component.ts | 15 ++++++++++++--- .../lists/folder-list/folder-list.component.ts | 14 +++++++++++--- .../lists/status-list/status-list.component.ts | 4 ++-- src/app/services/filter.service.ts | 8 ++++++++ src/styles.scss | 2 +- 7 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/app/list-toggle/list-toggle.component.html b/src/app/list-toggle/list-toggle.component.html index bbd52d54f..97e3beda3 100644 --- a/src/app/list-toggle/list-toggle.component.html +++ b/src/app/list-toggle/list-toggle.component.html @@ -1,4 +1,4 @@ - + Folders Devices \ No newline at end of file diff --git a/src/app/list-toggle/list-toggle.component.ts b/src/app/list-toggle/list-toggle.component.ts index cab39e70d..733973476 100644 --- a/src/app/list-toggle/list-toggle.component.ts +++ b/src/app/list-toggle/list-toggle.component.ts @@ -1,5 +1,6 @@ -import { Component, EventEmitter, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core'; import { StType } from '../type'; +import { MatButtonToggleGroup } from '@angular/material/button-toggle'; @@ -10,8 +11,9 @@ import { StType } from '../type'; }) export class ListToggleComponent implements OnInit { + @ViewChild(MatButtonToggleGroup) group: MatButtonToggleGroup; public listType = StType; - public toggleValue: string = "folders"; + // public toggleValue: string = "folders"; @Output() listTypeEvent = new EventEmitter(); constructor() { } diff --git a/src/app/lists/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts index fc1c1af22..26c5f600f 100644 --- a/src/app/lists/device-list/device-list.component.ts +++ b/src/app/lists/device-list/device-list.component.ts @@ -30,7 +30,9 @@ export class DeviceListComponent implements AfterViewInit, OnInit { ) { }; applyFilter(event: Event) { + // Set previous filter value const filterValue = (event.target as HTMLInputElement).value; + this.filterService.previousInputs.set(StType.Device, filterValue); this.dataSource.filter = filterValue.trim().toLowerCase(); } @@ -50,13 +52,20 @@ export class DeviceListComponent implements AfterViewInit, OnInit { this.dataSource.paginator = this.paginator; this.table.dataSource = this.dataSource; + const changeText = (text: string) => { + this.dataSource.filter = text.trim().toLowerCase(); + this.filterValue = text; + this.cdr.detectChanges(); + } + + // Set previous value + changeText(this.filterService.previousInputs.get(StType.Device)); + // Listen for filter changes from other components this.filterService.filterChanged$.subscribe( input => { if (input.type === StType.Device) { - this.dataSource.filter = input.text.trim().toLowerCase(); - this.filterValue = input.text; - this.cdr.detectChanges(); + changeText(input.text); } }); } diff --git a/src/app/lists/folder-list/folder-list.component.ts b/src/app/lists/folder-list/folder-list.component.ts index 6c1185ff1..d5c08e4dd 100644 --- a/src/app/lists/folder-list/folder-list.component.ts +++ b/src/app/lists/folder-list/folder-list.component.ts @@ -32,6 +32,7 @@ export class FolderListComponent implements AfterViewInit, OnInit { applyFilter(event: Event) { const filterValue = (event.target as HTMLInputElement).value; + this.filterService.previousInputs.set(StType.Folder, filterValue); this.dataSource.filter = filterValue.trim().toLowerCase(); } @@ -51,14 +52,21 @@ export class FolderListComponent implements AfterViewInit, OnInit { this.dataSource.paginator = this.paginator; this.table.dataSource = this.dataSource; + const changeText = (text: string) => { + this.dataSource.filter = text.trim().toLowerCase(); + this.filterValue = text; + this.cdr.detectChanges(); + } + + // Set previous value + changeText(this.filterService.previousInputs.get(StType.Folder)); + // Listen for filter changes from other components this.filterService.filterChanged$ .subscribe( input => { if (input.type === StType.Folder) { - this.dataSource.filter = input.text.trim().toLowerCase(); - this.filterValue = input.text; - this.cdr.detectChanges(); + changeText(input.text); } }); } diff --git a/src/app/lists/status-list/status-list.component.ts b/src/app/lists/status-list/status-list.component.ts index 04aa42cc3..beca46992 100644 --- a/src/app/lists/status-list/status-list.component.ts +++ b/src/app/lists/status-list/status-list.component.ts @@ -27,10 +27,10 @@ export class StatusListComponent { switch (input.type) { case StType.Folder: - this.toggle.toggleValue = "folders"; + this.toggle.group.value = "folders"; break; case StType.Device: - this.toggle.toggleValue = "devices"; + this.toggle.group.value = "devices"; break; } }); diff --git a/src/app/services/filter.service.ts b/src/app/services/filter.service.ts index 2cf2a2611..d66da853b 100644 --- a/src/app/services/filter.service.ts +++ b/src/app/services/filter.service.ts @@ -12,6 +12,13 @@ export interface FilterInput { } export class FilterService { + previousInputs = new Map( + [ + [StType.Folder, ""], + [StType.Device, ""], + ] + + ) constructor() { } @@ -20,6 +27,7 @@ export class FilterService { filterChanged$ = this.filterChangeSource.asObservable(); changeFilter(input: FilterInput) { + this.previousInputs.set(input.type, input.text) this.filterChangeSource.next(input); } } diff --git a/src/styles.scss b/src/styles.scss index a4664d9bd..bb17af248 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -88,7 +88,7 @@ html, body { a { text-decoration: underline; - color: mat-color($tech-ui-primary); + color: #000000; } .tui-card { From 915faabe258ea150250beced8433336088b2b1e0 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 2 Apr 2020 14:00:09 -0400 Subject: [PATCH 084/120] Filter lists when donut chart items are clicked --- src/app/charts/chart/chart.component.html | 5 +++-- .../charts/donut-chart/donut-chart.component.ts | 17 +++++++++++++++-- .../lists/status-list/status-list.component.ts | 9 +++++++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/app/charts/chart/chart.component.html b/src/app/charts/chart/chart.component.html index 960ea079b..b11858648 100644 --- a/src/app/charts/chart/chart.component.html +++ b/src/app/charts/chart/chart.component.html @@ -2,8 +2,9 @@
{{title | uppercase}}
- -
+ + +
diff --git a/src/app/charts/donut-chart/donut-chart.component.ts b/src/app/charts/donut-chart/donut-chart.component.ts index f652a851f..6dc3dda30 100644 --- a/src/app/charts/donut-chart/donut-chart.component.ts +++ b/src/app/charts/donut-chart/donut-chart.component.ts @@ -1,6 +1,8 @@ -import { Component, Input } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; import { Chart } from 'chart.js' import { tooltip } from '../tooltip' +import { FilterService } from 'src/app/services/filter.service'; +import { StType } from 'src/app/type'; @Component({ selector: 'app-donut-chart', @@ -10,6 +12,8 @@ import { tooltip } from '../tooltip' export class DonutChartComponent { @Input() elementID: string; @Input() title: number; + @Output() stateEvent = new EventEmitter();; + _count: number; _countClass = "count-total"; set count(n: number) { @@ -23,7 +27,7 @@ export class DonutChartComponent { private ctx: any; private chart: Chart; - constructor() { } + constructor(private filterService: FilterService) { } updateData(data: { label: string, count: number, color: string }[]): void { // Using object destructuring @@ -59,6 +63,15 @@ export class DonutChartComponent { options: { cutoutPercentage: 77, responsive: true, + onClick: (e) => { + var activePoints = this.chart.getElementsAtEvent(e); + if (activePoints.length > 0) { + const index = activePoints[0]["_index"]; + const label = this.chart.data.labels[index]; + + this.stateEvent.emit(label); + } + }, legend: { display: false }, diff --git a/src/app/lists/status-list/status-list.component.ts b/src/app/lists/status-list/status-list.component.ts index beca46992..2ab3c181d 100644 --- a/src/app/lists/status-list/status-list.component.ts +++ b/src/app/lists/status-list/status-list.component.ts @@ -1,4 +1,4 @@ -import { Component, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, ViewChild, AfterViewInit, ChangeDetectorRef } from '@angular/core'; import { StType } from '../../type'; import { cardElevation } from '../../style'; import { FilterService } from 'src/app/services/filter.service'; @@ -17,7 +17,10 @@ export class StatusListComponent { elevation: string = cardElevation; title: string = 'Status'; - constructor(private filterService: FilterService) { } + constructor( + private filterService: FilterService, + private cdr: ChangeDetectorRef, + ) { } ngAfterViewInit() { // Listen for filter changes from other components @@ -34,6 +37,8 @@ export class StatusListComponent { break; } }); + + this.cdr.detectChanges(); // manually detect changes } onToggle(t: StType) { From 990752332114c7485918bf86ab209b5f5001881d Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 2 Apr 2020 15:45:15 -0400 Subject: [PATCH 085/120] switch filter to Subject from BehaviorSubject --- .../list-toggle/list-toggle.component.html | 2 +- .../device-list/device-list.component.html | 2 +- .../device-list/device-list.component.ts | 27 ++++++++++++------- .../folder-list/folder-list.component.html | 2 +- .../folder-list/folder-list.component.ts | 14 +++++++--- src/app/services/filter.service.ts | 13 ++++----- 6 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/app/list-toggle/list-toggle.component.html b/src/app/list-toggle/list-toggle.component.html index 97e3beda3..51c58f0fb 100644 --- a/src/app/list-toggle/list-toggle.component.html +++ b/src/app/list-toggle/list-toggle.component.html @@ -1,4 +1,4 @@ - + Folders Devices \ No newline at end of file diff --git a/src/app/lists/device-list/device-list.component.html b/src/app/lists/device-list/device-list.component.html index 5cc013d38..f831c6d45 100644 --- a/src/app/lists/device-list/device-list.component.html +++ b/src/app/lists/device-list/device-list.component.html @@ -1,6 +1,6 @@ Filter - +
diff --git a/src/app/lists/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts index 26c5f600f..846e3a189 100644 --- a/src/app/lists/device-list/device-list.component.ts +++ b/src/app/lists/device-list/device-list.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core'; +import { AfterViewInit, Component, OnInit, ViewChild, ChangeDetectorRef, OnDestroy } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { MatTable, MatTableDataSource } from '@angular/material/table'; @@ -7,18 +7,19 @@ import Device from '../../device'; import { SystemConfigService } from '../../services/system-config.service'; import { FilterService } from 'src/app/services/filter.service'; import { StType } from 'src/app/type'; +import { MatInput } from '@angular/material/input'; @Component({ selector: 'app-device-list', templateUrl: './device-list.component.html', styleUrls: ['./device-list.component.scss'] }) -export class DeviceListComponent implements AfterViewInit, OnInit { +export class DeviceListComponent implements AfterViewInit, OnInit, OnDestroy { @ViewChild(MatPaginator) paginator: MatPaginator; @ViewChild(MatSort) sort: MatSort; @ViewChild(MatTable) table: MatTable; + @ViewChild(MatInput) input: MatInput; dataSource: MatTableDataSource; - filterValue: string = ""; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['id', 'name', 'state']; @@ -53,8 +54,11 @@ export class DeviceListComponent implements AfterViewInit, OnInit { this.table.dataSource = this.dataSource; const changeText = (text: string) => { + if (!text) + return; + this.dataSource.filter = text.trim().toLowerCase(); - this.filterValue = text; + this.input.value = text; this.cdr.detectChanges(); } @@ -62,11 +66,14 @@ export class DeviceListComponent implements AfterViewInit, OnInit { changeText(this.filterService.previousInputs.get(StType.Device)); // Listen for filter changes from other components - this.filterService.filterChanged$.subscribe( - input => { - if (input.type === StType.Device) { - changeText(input.text); - } - }); + this.filterService.filterChanged$ + .subscribe( + input => { + if (input.type === StType.Device) { + changeText(input.text); + } + }); } + + ngOnDestroy() { } } \ No newline at end of file diff --git a/src/app/lists/folder-list/folder-list.component.html b/src/app/lists/folder-list/folder-list.component.html index 476276877..aeee70087 100644 --- a/src/app/lists/folder-list/folder-list.component.html +++ b/src/app/lists/folder-list/folder-list.component.html @@ -1,6 +1,6 @@ Filter - +
diff --git a/src/app/lists/folder-list/folder-list.component.ts b/src/app/lists/folder-list/folder-list.component.ts index d5c08e4dd..3b344f1c4 100644 --- a/src/app/lists/folder-list/folder-list.component.ts +++ b/src/app/lists/folder-list/folder-list.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, OnInit, ViewChild, ChangeDetectorRef } from '@angular/core'; +import { AfterViewInit, Component, OnInit, ViewChild, ChangeDetectorRef, OnDestroy } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { MatTable, MatTableDataSource } from '@angular/material/table'; @@ -7,18 +7,19 @@ import Folder from '../../folder'; import { SystemConfigService } from '../../services/system-config.service'; import { FilterService } from 'src/app/services/filter.service'; import { StType } from 'src/app/type'; +import { MatInput } from '@angular/material/input'; @Component({ selector: 'app-folder-list', templateUrl: './folder-list.component.html', styleUrls: ['./folder-list.component.scss'] }) -export class FolderListComponent implements AfterViewInit, OnInit { +export class FolderListComponent implements AfterViewInit, OnInit, OnDestroy { @ViewChild(MatPaginator) paginator: MatPaginator; @ViewChild(MatSort) sort: MatSort; @ViewChild(MatTable) table: MatTable; + @ViewChild(MatInput) input: MatInput; dataSource: MatTableDataSource; - filterValue: string = ""; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['id', 'label', 'path', 'state']; @@ -53,8 +54,11 @@ export class FolderListComponent implements AfterViewInit, OnInit { this.table.dataSource = this.dataSource; const changeText = (text: string) => { + if (!text) + return; + this.dataSource.filter = text.trim().toLowerCase(); - this.filterValue = text; + this.input.value = text; this.cdr.detectChanges(); } @@ -70,4 +74,6 @@ export class FolderListComponent implements AfterViewInit, OnInit { } }); } + + ngOnDestroy() { } } \ No newline at end of file diff --git a/src/app/services/filter.service.ts b/src/app/services/filter.service.ts index d66da853b..a30fe9a42 100644 --- a/src/app/services/filter.service.ts +++ b/src/app/services/filter.service.ts @@ -1,29 +1,26 @@ import { Injectable } from '@angular/core'; import { StType } from '../type'; -import { BehaviorSubject } from 'rxjs'; - -@Injectable({ - providedIn: 'root' -}) +import { Subject } from 'rxjs'; export interface FilterInput { type: StType; text: string } +@Injectable({ + providedIn: 'root' +}) export class FilterService { previousInputs = new Map( [ [StType.Folder, ""], [StType.Device, ""], ] - ) constructor() { } - private filterChangeSource = new BehaviorSubject({ type: StType.Folder, text: "" }); - + private filterChangeSource = new Subject(); filterChanged$ = this.filterChangeSource.asObservable(); changeFilter(input: FilterInput) { From bf062db83fd5f15829eaef24433f4e591720143b Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 3 Apr 2020 10:08:56 -0400 Subject: [PATCH 086/120] create chart item state to toggle filter selection --- .../chart-item/chart-item.component.html | 2 +- .../chart-item/chart-item.component.scss | 10 +++++ .../charts/chart-item/chart-item.component.ts | 6 +++ src/app/charts/chart/chart.component.html | 4 +- src/app/charts/chart/chart.component.ts | 41 +++++++++++++++---- .../donut-chart/donut-chart.component.ts | 16 ++++---- .../device-list/device-list.component.ts | 3 -- .../folder-list/folder-list.component.ts | 3 -- 8 files changed, 61 insertions(+), 24 deletions(-) diff --git a/src/app/charts/chart-item/chart-item.component.html b/src/app/charts/chart-item/chart-item.component.html index 35917c2fa..47af68d1e 100644 --- a/src/app/charts/chart-item/chart-item.component.html +++ b/src/app/charts/chart-item/chart-item.component.html @@ -1,4 +1,4 @@ -
+
{{count}}
\ No newline at end of file diff --git a/src/app/charts/chart-item/chart-item.component.scss b/src/app/charts/chart-item/chart-item.component.scss index 90d5ee45c..307e3f995 100644 --- a/src/app/charts/chart-item/chart-item.component.scss +++ b/src/app/charts/chart-item/chart-item.component.scss @@ -1,3 +1,13 @@ .item { cursor: pointer; + padding: 3px; + border-radius: 4px; +} + +.selected { + background-color: #DDDDDD; +} +.selected a { + color: #000000; + text-decoration: none; } \ No newline at end of file diff --git a/src/app/charts/chart-item/chart-item.component.ts b/src/app/charts/chart-item/chart-item.component.ts index 6dbeb3bdc..ec5ee46d5 100644 --- a/src/app/charts/chart-item/chart-item.component.ts +++ b/src/app/charts/chart-item/chart-item.component.ts @@ -8,6 +8,12 @@ import { Component, Input } from '@angular/core'; export class ChartItemComponent { @Input() state: string; @Input() count: number; + @Input('selected') + set selected(s: boolean) { + this._selected = s; + } + + _selected: boolean = true; constructor() { } } diff --git a/src/app/charts/chart/chart.component.html b/src/app/charts/chart/chart.component.html index b11858648..021a2fec9 100644 --- a/src/app/charts/chart/chart.component.html +++ b/src/app/charts/chart/chart.component.html @@ -5,8 +5,8 @@
- +
diff --git a/src/app/charts/chart/chart.component.ts b/src/app/charts/chart/chart.component.ts index 793870ad3..14d99ce53 100644 --- a/src/app/charts/chart/chart.component.ts +++ b/src/app/charts/chart/chart.component.ts @@ -9,7 +9,12 @@ import { StType } from '../../type'; import { FilterService } from 'src/app/services/filter.service'; - +export interface ChartItemState { + label: string, + count: number, + color: string, + selected: boolean, +} @Component({ selector: 'app-chart', templateUrl: './chart.component.html', @@ -21,10 +26,11 @@ export class ChartComponent implements OnInit { @Input() type: StType; title: string; chartID: string; - states: { label: string, count: number, color: string }[] = []; + states: ChartItemState[] = []; elevation: string = cardElevation; - service: any; - namespace: any; + + private service: any; + private activeChartState: ChartItemState; constructor( private folderService: FolderService, @@ -32,9 +38,30 @@ export class ChartComponent implements OnInit { private filterService: FilterService, ) { } - onItemSelect(state: string) { + onItemSelect(s: ChartItemState) { // Send chart item state to filter - this.filterService.changeFilter({ type: this.type, text: state }); + this.filterService.changeFilter({ type: this.type, text: s.label }); + + // Deselect all other items + this.states.forEach(s => { + s.selected = false; + }); + + // Select item only + if (s !== this.activeChartState) { + s.selected = true; + this.activeChartState = s; + } else { + this.activeChartState = null; + this.filterService.changeFilter({ type: this.type, text: "" }) + console.log("change filter", this.type) + } + + /* + const index = this.states.indexOf(s); + if (index >= 0) { + } + */ } ngOnInit(): void { @@ -83,7 +110,7 @@ export class ChartComponent implements OnInit { }); if (!found) { - this.states.push({ label: state, count: 1, color: color }); + this.states.push({ label: state, count: 1, color: color, selected: false }); } this.donutChart.updateData(this.states); diff --git a/src/app/charts/donut-chart/donut-chart.component.ts b/src/app/charts/donut-chart/donut-chart.component.ts index 6dc3dda30..708635215 100644 --- a/src/app/charts/donut-chart/donut-chart.component.ts +++ b/src/app/charts/donut-chart/donut-chart.component.ts @@ -2,7 +2,7 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { Chart } from 'chart.js' import { tooltip } from '../tooltip' import { FilterService } from 'src/app/services/filter.service'; -import { StType } from 'src/app/type'; +import { ChartItemState } from '../chart/chart.component'; @Component({ selector: 'app-donut-chart', @@ -12,7 +12,7 @@ import { StType } from 'src/app/type'; export class DonutChartComponent { @Input() elementID: string; @Input() title: number; - @Output() stateEvent = new EventEmitter();; + @Output() stateEvent = new EventEmitter();; _count: number; _countClass = "count-total"; @@ -26,13 +26,15 @@ export class DonutChartComponent { private canvas: any; private ctx: any; private chart: Chart; + private states: ChartItemState[]; constructor(private filterService: FilterService) { } - updateData(data: { label: string, count: number, color: string }[]): void { + updateData(states: ChartItemState[]): void { + this.states = states; // Using object destructuring - for (let i = 0; i < data.length; i++) { - let s = data[i]; + for (let i = 0; i < states.length; i++) { + let s = states[i]; this.chart.data.labels[i] = s.label; this.chart.data.datasets[0].data[i] = s.count; this.chart.data.datasets[0].backgroundColor[i] = s.color; @@ -67,9 +69,7 @@ export class DonutChartComponent { var activePoints = this.chart.getElementsAtEvent(e); if (activePoints.length > 0) { const index = activePoints[0]["_index"]; - const label = this.chart.data.labels[index]; - - this.stateEvent.emit(label); + this.stateEvent.emit(this.states[index]); } }, legend: { diff --git a/src/app/lists/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts index 846e3a189..e5e7e4964 100644 --- a/src/app/lists/device-list/device-list.component.ts +++ b/src/app/lists/device-list/device-list.component.ts @@ -54,9 +54,6 @@ export class DeviceListComponent implements AfterViewInit, OnInit, OnDestroy { this.table.dataSource = this.dataSource; const changeText = (text: string) => { - if (!text) - return; - this.dataSource.filter = text.trim().toLowerCase(); this.input.value = text; this.cdr.detectChanges(); diff --git a/src/app/lists/folder-list/folder-list.component.ts b/src/app/lists/folder-list/folder-list.component.ts index 3b344f1c4..df4f79eb5 100644 --- a/src/app/lists/folder-list/folder-list.component.ts +++ b/src/app/lists/folder-list/folder-list.component.ts @@ -54,9 +54,6 @@ export class FolderListComponent implements AfterViewInit, OnInit, OnDestroy { this.table.dataSource = this.dataSource; const changeText = (text: string) => { - if (!text) - return; - this.dataSource.filter = text.trim().toLowerCase(); this.input.value = text; this.cdr.detectChanges(); From f509c65509a3d60568a01dada782c672f147a6ce Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 3 Apr 2020 10:25:19 -0400 Subject: [PATCH 087/120] increase chart item padding --- src/app/charts/chart-item/chart-item.component.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/charts/chart-item/chart-item.component.scss b/src/app/charts/chart-item/chart-item.component.scss index 307e3f995..2aef89c04 100644 --- a/src/app/charts/chart-item/chart-item.component.scss +++ b/src/app/charts/chart-item/chart-item.component.scss @@ -1,6 +1,6 @@ .item { cursor: pointer; - padding: 3px; + padding: 3px 7px 3px 7px; border-radius: 4px; } From f18fc40436a7adf1d82eabffb9424f5de36a03cd Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Fri, 3 Apr 2020 22:23:33 +0200 Subject: [PATCH 088/120] Harmonize license with Syncthing proper --- LICENSE | 386 +++++++++++++++++++++++++++++++++++++++++++++++++++--- README.md | 8 +- 2 files changed, 376 insertions(+), 18 deletions(-) diff --git a/LICENSE b/LICENSE index aae787f3a..d0a1fa148 100644 --- a/LICENSE +++ b/LICENSE @@ -1,19 +1,373 @@ -Copyright (C) 2020 Kastelo AB +Mozilla Public License Version 2.0 +================================== -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +1. Definitions +-------------- -- The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/README.md b/README.md index e032af24b..10add0acc 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,10 @@ 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`. -# License +## License -MIT +MPLv2 + +## Copyright + +Copyright (c) 2020 Kastelo Inc. From 8199e0a7a90d12c51b5d6bf8780b94360d477588 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 3 Apr 2020 14:48:31 -0400 Subject: [PATCH 089/120] update angular dependencies --- package-lock.json | 4458 ++++++++++++++++++++++++++++++--------------- package.json | 36 +- 2 files changed, 3027 insertions(+), 1467 deletions(-) diff --git a/package-lock.json b/package-lock.json index ecd0ee68a..18dbb9ebe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,17 @@ "requires": { "@angular-devkit/core": "9.1.0", "rxjs": "6.5.4" + }, + "dependencies": { + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } } }, "@angular-devkit/build-angular": { @@ -83,55 +94,6 @@ "worker-plugin": "4.0.2" }, "dependencies": { - "@babel/generator": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", - "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", - "dev": true, - "requires": { - "@babel/types": "^7.9.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -146,11 +108,84 @@ "path-is-absolute": "^1.0.0" } }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "semver": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -167,6 +202,12 @@ "webpack-sources": "1.4.3" }, "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, "typescript": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", @@ -184,6 +225,17 @@ "@angular-devkit/architect": "0.901.0", "@angular-devkit/core": "9.1.0", "rxjs": "6.5.4" + }, + "dependencies": { + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } } }, "@angular-devkit/core": { @@ -199,38 +251,20 @@ "source-map": "0.7.3" }, "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "tslib": "^1.9.0" } }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true - }, - "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 - }, - "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } } } }, @@ -243,27 +277,30 @@ "@angular-devkit/core": "9.1.0", "ora": "4.0.3", "rxjs": "6.5.4" + }, + "dependencies": { + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } } }, "@angular/animations": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.0.5.tgz", - "integrity": "sha512-WGs4Jxw5sr8GCpxMcwEVuZnDIkdNp9qtmuI2j13v/XAaMjvJ7jssCj9+JG5uI8joCi7PFVAWokPT1DdPwWb13Q==" + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.1.0.tgz", + "integrity": "sha512-o7X3HM+eocoryw3VrDUtG6Wci2KwtzyBFo3KBJXjQ16X6fwdkjTG+hLb7pp2CBFBEJW4tPYEy7cSBmEfMRTqag==" }, "@angular/cdk": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.1.2.tgz", - "integrity": "sha512-x5niyE0iYrbVtLYjJFw2MoS+OoSbJn6y/G2pNScviDwyjBBgqRh4YgUox2kMhdPumkvuh+eA6blZoE9qpvSo2w==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.2.0.tgz", + "integrity": "sha512-jeeznvNDpR9POuxzz8Y0zFvMynG9HCJo3ZPTqOjlOq8Lj8876+rLsHDvKEMeLdwlkdi1EweYJW1CLQzI+TwqDA==", "requires": { "parse5": "^5.0.0" - }, - "dependencies": { - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "optional": true - } } }, "@angular/cli": { @@ -300,6 +337,38 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "semver": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", @@ -315,19 +384,19 @@ } }, "@angular/common": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.0.5.tgz", - "integrity": "sha512-AwZKYK5M/3762woK+3290JnBdlBvZXqxX5vVze6wk23IiBlwIV+l79+Lyfjo/4s031kibq47taaZdC7qkkBkNA==" + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.1.0.tgz", + "integrity": "sha512-6JPLNtMhI03bGTVQJeSwc+dTjV6DtP7M/BAyzIV0InZP1D6XsOh2QahLFIaaN2sSxYA2ClKuwfX1v+rx9AbXQA==" }, "@angular/compiler": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.5.tgz", - "integrity": "sha512-TeyhRGefTOtA9N3udMrvheafoXcz/dvTTdZLcieeZQxm1SSeaQDUQ/rUH6QTOiHVNMtjOCrZ9J5rk1A4mPYuag==" + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.1.0.tgz", + "integrity": "sha512-QHw/JSeTXHiJQ2Ih0EtU7FGsYcOr+0hwZhqwSW3EEn8TtUgA3DS5lXeiDV66f+3DdvNZFPmgiZIvun3ypxn1HA==" }, "@angular/compiler-cli": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.0.5.tgz", - "integrity": "sha512-lFlasm8UBApTq4/MkxnYrRAMfpOvvg3YYBEMibuEGlaJjW/Xd1JcisUuFiooCxCIKF5phyORHmxjywGPhHqQgQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.1.0.tgz", + "integrity": "sha512-xZ8mVPmPporSTtvNA+cbFJQymLzuWfMX6HDDgztZ2eZ5WcQJYloRN4CcYMEzDhCxfV1Zw9Tfc2l14jZD8osi6g==", "dev": true, "requires": { "canonical-path": "1.0.0", @@ -341,33 +410,124 @@ "semver": "^6.3.0", "source-map": "^0.6.1", "sourcemap-codec": "^1.4.8", - "yargs": "13.1.0" + "yargs": "15.3.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, "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 }, + "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 + }, + "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, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "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 + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -375,48 +535,65 @@ "dev": true }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } }, - "yargs": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", - "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", + "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^3.0.0", + "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" + "yargs-parser": "^18.1.0" } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -426,9 +603,9 @@ } }, "@angular/core": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.5.tgz", - "integrity": "sha512-7VznrYjaAIzeq/zQ7v6tbeoOI7JJKgChKwG7s8jRoEpENu+w2pRlRdyQul88iJLsXgObR+/TfBNm/K+G4cqAFw==" + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.1.0.tgz", + "integrity": "sha512-RVlyegdIAij0P1wLY5ObIdsBAzvmHkHfElnmfiNKhaDftP6U/3zRtaKDu0bq0jvn1WCQ8zXxFQ8AWyKZwyFS+w==" }, "@angular/flex-layout": { "version": "9.0.0-beta.29", @@ -436,35 +613,35 @@ "integrity": "sha512-93sxR+kYfYMOdnlWL0Q77FZ428gg8XnBu0YZm6GsCdkw/vLggIT/G1ZAqHlCPIODt6pxmCJ5KXh4ShvniIYDsA==" }, "@angular/forms": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.0.5.tgz", - "integrity": "sha512-579PXAfT92J4mghjWKiZ3Zj3xee4h3RP70YHSlsfbi94MONvryWDrnXxvUZ0zJJCVnEJQ7x+nGEp3wwWqR12Jw==" + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.1.0.tgz", + "integrity": "sha512-5GC8HQlPChPV+168zLlm4yj4syA6N9ChSKV0tmzj1zIfMcub1UAOaB9IYaXRHQsjPFh9OuQXwmkzScyAfhEVjA==" }, "@angular/language-service": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.0.5.tgz", - "integrity": "sha512-9ykFNYZpWdoggFPK3LuTJobBZjoCEQP6kKt88ZZV7GTMIXoE7iY413KfhINoXdMwxIAbba0xlPMR/4p6jFAa4Q==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-9.1.0.tgz", + "integrity": "sha512-2f8ECoXrj40oS1rtIfi+F8T4WPzundcZDs8WMFNBuWYbk14v1S9sTgMEmZyePHGkPjt6IfYiLJKJCvVgrt1nxQ==", "dev": true }, "@angular/material": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.1.2.tgz", - "integrity": "sha512-8uwwkSnsg/YlhqxD/+0Cj+1S97Xf5WUcgxSEXmC1r0/AD+o6PGL5ImIk4n+3tdgYqm7MoJZQthlIB2J0EVLjVw==" + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-9.2.0.tgz", + "integrity": "sha512-KKzEIVh6/m56m+Ao8p4PK0SyEr0574l3VP2swj1qPag3u+FYgemmXCGTaChrKdDsez+zeTCPXImBGXzE6NQ80Q==" }, "@angular/platform-browser": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.0.5.tgz", - "integrity": "sha512-24QGcQXthYXB/wT8okJjxqss/JOk4A6O1/Fmva79k0AvwtYkl2tikcyEc5T3xZtjoi8g32AN9nbZAobtkxlqTA==" + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.1.0.tgz", + "integrity": "sha512-OsS/blUjl8ranmDaRADjFAmvnlmwbT6WNU7dVov7FhV0rqesbwaOJ5bR0LSYHYpej7Jaa6oYk0v0XWkaH9LTFg==" }, "@angular/platform-browser-dynamic": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.0.5.tgz", - "integrity": "sha512-NRfsAwbgxOvEcpqlERDAG0wap5xJa0wKwnudTCnyvf4B0D6kLkT1Idjqv22NDW5rfM2oDWaZ/qpgpDnAo6/ZBQ==" + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.1.0.tgz", + "integrity": "sha512-sMtz/poQ3TYaWZzWjrn9apKUZ/WKql2MYCWbpax7pql3GgC9OoTslc7ZEe7/d3ynfFE/CQqWBBOuWGD71Z0LMQ==" }, "@angular/router": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.0.5.tgz", - "integrity": "sha512-Sz3DQUxlzAk9aZ9eVtZRh6xF5SMg/Gb3rc5I7dL1M+mycSNoFJ4HPTXleZkKM69mMkKQ5fEtza4x26MSlF+O9w==" + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.1.0.tgz", + "integrity": "sha512-cExO1nPnoPFiUJWZ28hTHozPLFoCmqr3xqcM57We0hhKE0esdrO+gRWKRH0EJERukLbU8coPKVhA8daGUpASiQ==" }, "@babel/code-frame": { "version": "7.8.3", @@ -518,52 +695,6 @@ "source-map": "^0.5.0" }, "dependencies": { - "@babel/generator": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", - "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", - "dev": true, - "requires": { - "@babel/types": "^7.9.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", - "dev": true - }, - "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -579,12 +710,12 @@ } }, "@babel/generator": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.7.tgz", - "integrity": "sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", + "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", "dev": true, "requires": { - "@babel/types": "^7.7.4", + "@babel/types": "^7.9.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -647,52 +778,6 @@ "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-regex": "^7.8.3", "regexpu-core": "^4.7.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - } } }, "@babel/helper-define-map": { @@ -776,19 +861,6 @@ "@babel/template": "^7.8.6", "@babel/types": "^7.9.0", "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-optimise-call-expression": { @@ -886,77 +958,23 @@ "@babel/template": "^7.8.3", "@babel/traverse": "^7.9.0", "@babel/types": "^7.9.0" - }, - "dependencies": { - "@babel/generator": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", - "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", - "dev": true, - "requires": { - "@babel/types": "^7.9.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", - "dev": true - }, - "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } } }, "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.7.tgz", - "integrity": "sha512-9JWls8WilDXFGxs0phaXAZgpxTZhSk/yOYH2hTHC0X1yC7Z78IJfvR1vJ+rmJKq3I35td2XzXzN6ZLYlna+r/A==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -1505,17 +1523,6 @@ "semver": "^5.5.0" }, "dependencies": { - "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -1544,6 +1551,14 @@ "dev": true, "requires": { "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + } } }, "@babel/template": { @@ -1558,49 +1573,29 @@ } }, "@babel/traverse": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz", - "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.6", + "@babel/generator": "^7.9.0", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/generator": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.7.tgz", - "integrity": "sha512-DQwjiKJqH4C3qGiyQCAExJHoZssn49JTMJgZ8SANGgVFdkupcUhLOdkAeoC6kmHZCPfoDG5M0b6cFlSN5wW7Ew==", - "dev": true, - "requires": { - "@babel/types": "^7.8.7", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } } }, "@babel/types": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz", - "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", "dev": true, "requires": { - "esutils": "^2.0.2", + "@babel/helper-validator-identifier": "^7.9.0", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -1656,6 +1651,17 @@ "enhanced-resolve": "4.1.1", "rxjs": "6.5.4", "webpack-sources": "1.4.3" + }, + "dependencies": { + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } } }, "@npmcli/ci-detect": { @@ -1680,9 +1686,9 @@ }, "dependencies": { "mkdirp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", - "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, "which": { @@ -1744,6 +1750,15 @@ "semver-intersect": "1.4.0" }, "dependencies": { + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "semver": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", @@ -1782,9 +1797,9 @@ } }, "@types/jasmine": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.8.tgz", - "integrity": "sha512-q/L59BjgE6VJtuIM4iDEEwT7xdSWVHMqC+td9sft5RfgHpDZ4Gdn0vLV59wKZ7PjGuVLCL7aNCdoiw5u6ZKSgA==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.10.tgz", + "integrity": "sha512-3F8qpwBAiVc5+HPJeXJpbrl+XjawGmciN5LgiO7Gv1pl1RHtjoMNqZpqEksaPJW05ViKe8snYInRs6xB25Xdew==", "dev": true }, "@types/jasminewd2": { @@ -1803,9 +1818,9 @@ "dev": true }, "@types/node": { - "version": "12.12.29", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.29.tgz", - "integrity": "sha512-yo8Qz0ygADGFptISDj3pOC9wXfln/5pQaN/ysDIzOaAWXt73cNHmtEC8zSO2Y+kse/txmwIAJzkYZ5fooaS5DQ==", + "version": "12.12.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.34.tgz", + "integrity": "sha512-BneGN0J9ke24lBRn44hVHNeDlrXRYF+VRp0HbSUNnEZahXGAysHZIqnf/hER6aabdBgzM4YOV4jrR8gj4Zfi0g==", "dev": true }, "@types/q": { @@ -2039,6 +2054,15 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, + "JSONStream": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", + "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + "requires": { + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2086,13 +2110,9 @@ "dev": true }, "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-1.0.2.tgz", + "integrity": "sha1-aJDT+yFwBLYrcPiSjg+uX4lSpwY=" }, "agentkeepalive": { "version": "4.1.0", @@ -2116,12 +2136,12 @@ } }, "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" @@ -2147,16 +2167,6 @@ "kind-of": "^3.0.2", "longest": "^1.0.1", "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "alphanum-sort": { @@ -2379,6 +2389,12 @@ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", "dev": true }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -2408,9 +2424,9 @@ "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY=" }, "ast-types": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", - "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==" + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.3.tgz", + "integrity": "sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==" }, "ast-types-flow": { "version": "0.0.7", @@ -2464,6 +2480,34 @@ "num2fraction": "^1.2.2", "postcss": "^7.0.26", "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "autoprefixer-core": { @@ -2473,25 +2517,6 @@ "requires": { "caniuse-db": "^1.0.30000006", "postcss": "~2.2.5" - }, - "dependencies": { - "postcss": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-2.2.6.tgz", - "integrity": "sha1-wENE4kSeRYa5Vfvkp093CA2EVx8=", - "requires": { - "js-base64": "~2.1.5", - "source-map": "~0.1.40" - } - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "requires": { - "amdefine": ">=0.0.4" - } - } } }, "aws-sign2": { @@ -2557,6 +2582,15 @@ "emojis-list": "^3.0.0", "json5": "^1.0.1" } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } } } }, @@ -2632,6 +2666,12 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "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 } } }, @@ -2702,6 +2742,15 @@ "optional": true, "requires": { "file-uri-to-path": "1.0.0" + }, + "dependencies": { + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + } } }, "blob": { @@ -2783,6 +2832,18 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } } } }, @@ -2907,15 +2968,15 @@ } }, "browserslist": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.0.tgz", - "integrity": "sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", + "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001035", - "electron-to-chromium": "^1.3.380", - "node-releases": "^1.1.52", - "pkg-up": "^3.1.0" + "caniuse-lite": "^1.0.30001038", + "electron-to-chromium": "^1.3.390", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" } }, "browserstack": { @@ -2925,6 +2986,36 @@ "dev": true, "requires": { "https-proxy-agent": "^2.2.1" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + } } }, "buffer": { @@ -2936,6 +3027,14 @@ "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } } }, "buffer-alloc": { @@ -3014,10 +3113,9 @@ "dev": true }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" }, "cacache": { "version": "15.0.0", @@ -3044,20 +3142,71 @@ "unique-filename": "^1.1.1" }, "dependencies": { - "mkdirp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", - "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "glob": "^7.1.3" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } + }, + "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, + "requires": { + "yallist": "^3.0.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "tar": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.1.tgz", + "integrity": "sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==", + "dev": true, + "requires": { + "chownr": "^1.1.3", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, @@ -3109,10 +3258,9 @@ "dev": true }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, "caniuse-api": { "version": "3.0.0", @@ -3127,9 +3275,9 @@ } }, "caniuse-db": { - "version": "1.0.30001033", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001033.tgz", - "integrity": "sha512-2ZReq+OHqHhsIQSiv8OVNhQ6Ht9eYJpwblZydHV8nI44Od6J5YUl3J9Wxvjry/v969jCHH5fR9+C6FwJ41XbOQ==" + "version": "1.0.30001038", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001038.tgz", + "integrity": "sha512-yeQ2l99M9upOgMIRfZEdes6HuPbQiRZIMBumUwdXeEQz+faSXUZtZ8xeyEdU+TlJckH09M5NtM038sjKsRa2ow==" }, "caniuse-lite": { "version": "1.0.30001038", @@ -3228,9 +3376,9 @@ }, "dependencies": { "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -3320,31 +3468,13 @@ "dev": true }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" } }, "clone": { @@ -3362,6 +3492,14 @@ "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", "shallow-clone": "^3.0.0" + }, + "dependencies": { + "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 + } } }, "co": { @@ -3387,9 +3525,9 @@ "dev": true }, "codelyzer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.1.tgz", - "integrity": "sha512-awBZXFcJUyC5HMYXiHzjr3D24tww2l1D1OqtfA9vUhEtYr32a65A+Gblm/OvsO+HuKLYzn8EDMw1inSM3VbxWA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", + "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", "dev": true, "requires": { "app-root-path": "^2.2.1", @@ -3428,27 +3566,6 @@ "raw-body": "^1.1.2", "statuses": "^1.0.2", "write-to": "^1.0.0" - }, - "dependencies": { - "bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" - }, - "iconv-lite": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.8.tgz", - "integrity": "sha1-xgGadZXyzvynAuq2lKAQvNkpjSA=" - }, - "raw-body": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.4.tgz", - "integrity": "sha1-zMfd/Ea3KGHN1btDPIQLcLbyf1Q=", - "requires": { - "bytes": "1.0.0", - "iconv-lite": "0.4.8" - } - } } }, "collection-visit": { @@ -3477,12 +3594,19 @@ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { "color-name": "1.1.3" + }, + "dependencies": { + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { "version": "1.5.3", @@ -3558,6 +3682,27 @@ "path-is-absolute": "^1.0.0" } }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, "recast": { "version": "0.11.23", "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", @@ -3607,26 +3752,6 @@ "superagent": "~0.17.0", "tiny-lr-fork": "0.0.5", "win-fork": "~1.1.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" - } } }, "component-bind": { @@ -3663,18 +3788,6 @@ "mkdirp": "^0.3.5", "requires": "^1.0.0", "syntax-error": "^1.1.1" - }, - "dependencies": { - "graceful-fs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", - "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" - }, - "mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" - } } }, "component-consoler": { @@ -3703,31 +3816,6 @@ "semver": "^2.2.0", "unglob": "~0.1.2", "write-to": "^1.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", - "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" - }, - "mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" - } } }, "component-emitter": { @@ -3742,13 +3830,6 @@ "integrity": "sha1-W0n0msRcuIxDAyuXozb1P4fNbIw=", "requires": { "semver": "^2.2.1" - }, - "dependencies": { - "semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" - } } }, "component-inherit": { @@ -3774,13 +3855,6 @@ "generator-supported": "~0.0.1", "graceful-fs": "^2.0.1", "unglob": "~0.1.1" - }, - "dependencies": { - "graceful-fs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", - "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" - } } }, "component-outdated2": { @@ -3793,13 +3867,6 @@ "component-remotes": "^1.1.5", "generator-supported": "~0.0.1", "semver": "^2.2.1" - }, - "dependencies": { - "semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" - } } }, "component-pin": { @@ -3812,13 +3879,6 @@ "component-remotes": "^1.1.5", "generator-supported": "~0.0.1", "semver": "^2.2.1" - }, - "dependencies": { - "semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" - } } }, "component-remotes": { @@ -3834,18 +3894,6 @@ "generator-supported": "~0.0.1", "graceful-fs": "^2.0.2", "semver": "^2.2.1" - }, - "dependencies": { - "graceful-fs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", - "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" - }, - "semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" - } } }, "component-require2": { @@ -3870,18 +3918,6 @@ "graceful-fs": "^2.0.1", "semver": "^2.2.1", "unglob": "~0.1.2" - }, - "dependencies": { - "graceful-fs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", - "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" - }, - "semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" - } } }, "component-search2": { @@ -3899,15 +3935,6 @@ "stream-to-array": "^1.0.0" }, "dependencies": { - "JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", - "requires": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - } - }, "bytes": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.3.0.tgz", @@ -3926,32 +3953,6 @@ "statuses": "^1.0.2", "write-to": "^1.0.0" } - }, - "iconv-lite": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.8.tgz", - "integrity": "sha1-xgGadZXyzvynAuq2lKAQvNkpjSA=" - }, - "jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=" - }, - "raw-body": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.4.tgz", - "integrity": "sha1-zMfd/Ea3KGHN1btDPIQLcLbyf1Q=", - "requires": { - "bytes": "1.0.0", - "iconv-lite": "0.4.8" - }, - "dependencies": { - "bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" - } - } } } }, @@ -3965,13 +3966,6 @@ "component-remotes": "^1.1.5", "generator-supported": "~0.0.1", "semver": "^2.2.1" - }, - "dependencies": { - "semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" - } } }, "component-validator": { @@ -4015,6 +4009,12 @@ "vary": "~1.1.2" }, "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -4151,13 +4151,13 @@ "run-queue": "^1.0.0" }, "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "glob": "^7.1.3" + "minimist": "^1.2.5" } } } @@ -4222,6 +4222,26 @@ "pkg-dir": "^3.0.0" } }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -4242,15 +4262,48 @@ "json5": "^1.0.1" } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "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, "requires": { - "glob": "^7.1.3" + "yallist": "^3.0.2" } }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -4270,6 +4323,18 @@ "requires": { "figgy-pudding": "^3.5.1" } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, @@ -4430,6 +4495,34 @@ "requires": { "postcss": "^7.0.1", "timsort": "^0.3.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "css-parse": { @@ -4519,6 +4612,34 @@ "cssnano-preset-default": "^4.0.7", "is-resolvable": "^1.0.0", "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "cssnano-preset-default": { @@ -4557,6 +4678,34 @@ "postcss-reduce-transforms": "^4.0.2", "postcss-svgo": "^4.0.2", "postcss-unique-selectors": "^4.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "cssnano-util-get-arguments": { @@ -4578,6 +4727,34 @@ "dev": true, "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "cssnano-util-same-parent": { @@ -4696,31 +4873,6 @@ "stream-combiner": "^0.0.4", "tar": "^0.1.18", "tempfile": "^0.1.2" - }, - "dependencies": { - "mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "tar": { - "version": "0.1.20", - "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", - "integrity": "sha1-QpQLrltfIsdEg2mRJvnz8nRJyxM=", - "requires": { - "block-stream": "*", - "fstream": "~0.1.28", - "inherits": "2" - } - } } }, "deep-equal": { @@ -4825,6 +4977,12 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "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 } } }, @@ -4850,69 +5008,10 @@ "yargs": "~3.27.0" }, "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, "esprima-fb": { "version": "15001.1001.0-dev-harmony-fb", "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=" - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", - "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", - "requires": { - "camelcase": "^1.2.1", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "os-locale": "^1.4.0", - "window-size": "^0.1.2", - "y18n": "^3.2.0" - } } } }, @@ -4948,6 +5047,20 @@ "rimraf": "^2.6.3" }, "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", @@ -4969,20 +5082,26 @@ } } }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, "p-map": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } } } }, @@ -5209,9 +5328,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.390", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.390.tgz", - "integrity": "sha512-4RvbM5x+002gKI8sltkqWEk5pptn0UnzekUx8RTThAMPDSb8jjpm6SwGiSnEve7f85biyZl8DMXaipaCxDjXag==", + "version": "1.3.395", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.395.tgz", + "integrity": "sha512-kdn2cX6hZXDdz/O2Q8tZscITlsSv1a/7bOq/fQs7QAJ9iaRlnhZPccarNhxZv1tXgmgwCnKp/1lJNYLOG8Dxiw==", "dev": true }, "elliptic": { @@ -5394,6 +5513,14 @@ "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", "tapable": "^1.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + } } }, "ent": { @@ -5469,13 +5596,6 @@ "requires": { "esprima-fb": "~3001.1.0-dev-harmony-fb", "jstransform": "~3.0.0" - }, - "dependencies": { - "esprima-fb": { - "version": "3001.1.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", - "integrity": "sha1-t303q8046gt3Qmu4vCkizmtCZBE=" - } } }, "es6-promise": { @@ -5517,6 +5637,11 @@ "source-map": "~0.6.1" }, "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5535,10 +5660,10 @@ "estraverse": "^4.1.1" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "esprima-fb": { + "version": "3001.1.0-dev-harmony-fb", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", + "integrity": "sha1-t303q8046gt3Qmu4vCkizmtCZBE=" }, "esrecurse": { "version": "4.2.1", @@ -5745,6 +5870,12 @@ "ms": "2.0.0" } }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -5875,6 +6006,12 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "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 } } }, @@ -5885,15 +6022,15 @@ "dev": true }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "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 }, "fast-levenshtein": { @@ -5908,13 +6045,9 @@ "dev": true }, "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz", + "integrity": "sha1-wUxbO/FNdBf/v9mQwKdJXNnzN7w=" }, "figgy-pudding": { "version": "3.5.2", @@ -5942,11 +6075,9 @@ } }, "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-0.0.2.tgz", + "integrity": "sha1-N83RtbkFQEs/BeGyNkW+aU/3D4I=" }, "fileset": { "version": "2.0.3", @@ -5956,6 +6087,31 @@ "requires": { "glob": "^7.0.3", "minimatch": "^3.0.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "fill-range": { @@ -6038,6 +6194,15 @@ "semver": "^6.0.0" } }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -6047,6 +6212,12 @@ "p-limit": "^2.2.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6061,22 +6232,28 @@ "requires": { "find-up": "^4.0.0" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^2.0.0" } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "flush-write-stream": { @@ -6090,9 +6267,9 @@ } }, "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", + "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", "dev": true, "requires": { "debug": "^3.0.0" @@ -6182,6 +6359,14 @@ "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + } } }, "fs-minipass": { @@ -6203,6 +6388,14 @@ "iferr": "^0.1.5", "imurmurhash": "^0.1.4", "readable-stream": "1 || 2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + } } }, "fs.realpath": { @@ -6236,12 +6429,12 @@ "natives": "^1.1.3" } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { - "glob": "^7.1.3" + "minimist": "^1.2.5" } } } @@ -6255,11 +6448,6 @@ "xregexp": "2.0.0" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", @@ -6270,11 +6458,6 @@ "isarray": "0.0.1", "string_decoder": "~0.10.x" } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } }, @@ -6336,11 +6519,6 @@ "ms": "2.0.0" } }, - "file-uri-to-path": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-0.0.2.tgz", - "integrity": "sha1-N83RtbkFQEs/BeGyNkW+aU/3D4I=" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -6364,16 +6542,23 @@ } }, "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "0.3" + }, + "dependencies": { + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } } }, "glob-parent": { @@ -6417,6 +6602,29 @@ "slash": "^1.0.0" }, "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -6431,19 +6639,12 @@ "integrity": "sha1-0Awkiyn9zK6pQN+coJlev/MbUaU=", "requires": { "object-assign": "^0.3.0" - }, - "dependencies": { - "object-assign": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-0.3.1.tgz", - "integrity": "sha1-Bg4qKifXwNd+x3t48Rqkf9iACNI=" - } } }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" }, "handle-thing": { "version": "2.0.1", @@ -6616,6 +6817,23 @@ "dev": true, "requires": { "lru-cache": "^5.1.1" + }, + "dependencies": { + "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, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "hpack.js": { @@ -6655,9 +6873,9 @@ "dev": true }, "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "http-cache-semantics": { @@ -6711,24 +6929,27 @@ } }, "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-0.2.7.tgz", + "integrity": "sha1-4X/aZfCQLZUs55IeYsf/iGJlWl4=", "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "~1.0.1", + "debug": "2", + "extend": "3" }, "dependencies": { - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "debug": "4" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -6762,23 +6983,27 @@ "dev": true }, "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-0.3.6.tgz", + "integrity": "sha1-cT+jjl01P1DrFKNC/r4pAz7RYZs=", "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "agent-base": "~1.0.1", + "debug": "2", + "extend": "3" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -6824,6 +7049,17 @@ "dev": true, "requires": { "minimatch": "^3.0.4" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "image-size": { @@ -6983,12 +7219,6 @@ "color-name": "~1.1.4" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7052,10 +7282,9 @@ } }, "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ip": { "version": "1.1.5", @@ -7087,17 +7316,6 @@ "dev": true, "requires": { "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "is-arguments": { @@ -7153,17 +7371,6 @@ "dev": true, "requires": { "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "is-date-object": { @@ -7362,9 +7569,9 @@ "dev": true }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "isbinaryfile": { "version": "3.0.3", @@ -7434,6 +7641,21 @@ "istanbul-lib-coverage": "^2.0.5", "semver": "^6.0.0" } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -7465,6 +7687,14 @@ "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "istanbul-lib-report": { @@ -7514,15 +7744,6 @@ "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7551,11 +7772,34 @@ "jasmine-core": "~2.8.0" }, "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "jasmine-core": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } } } }, @@ -7626,6 +7870,14 @@ "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" + }, + "dependencies": { + "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 + } } }, "jsbn": { @@ -7692,13 +7944,21 @@ "dev": true, "requires": { "graceful-fs": "^4.1.6" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true, + "optional": true + } } }, "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=" }, "jsprim": { "version": "1.4.1", @@ -7722,11 +7982,6 @@ "source-map": "0.1.31" }, "dependencies": { - "esprima-fb": { - "version": "3001.1.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", - "integrity": "sha1-t303q8046gt3Qmu4vCkizmtCZBE=" - }, "source-map": { "version": "0.1.31", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz", @@ -7738,9 +7993,9 @@ } }, "jszip": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", - "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.3.0.tgz", + "integrity": "sha512-EJ9k766htB1ZWnsV5ZMDkKLgA+201r/ouFF8R2OigVjVdcm2rurcBrrdXaeqBJbqnUVMko512PYmlncBKE1Huw==", "dev": true, "requires": { "lie": "~3.3.0", @@ -7784,19 +8039,39 @@ "useragent": "2.3.0" }, "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, "mime": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "glob": "^7.1.3" + "brace-expansion": "^1.1.7" } }, "source-map": { @@ -7824,6 +8099,17 @@ "requires": { "istanbul-api": "^2.1.6", "minimatch": "^3.0.4" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "karma-jasmine": { @@ -7836,9 +8122,9 @@ } }, "karma-jasmine-html-reporter": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.2.tgz", - "integrity": "sha512-ILBPsXqQ3eomq+oaQsM311/jxsypw5/d0LnZXj26XkfThwq7jZ55A2CFSKJVA5VekbbOGvMyv7d3juZj0SeTxA==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.3.tgz", + "integrity": "sha512-ci0VrjuCaFj+9d1tYlTE3KIPUCp0rz874zWWU3JgCMqGIyw5ke+BXWFPOAGAqUdCJcrMwneyvp1zFXA74MiPUA==", "dev": true }, "karma-source-map-support": { @@ -7857,10 +8143,12 @@ "dev": true }, "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 + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } }, "lazy-cache": { "version": "1.0.4", @@ -7868,12 +8156,11 @@ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "^2.0.0" + "invert-kv": "^1.0.0" } }, "less": { @@ -7894,6 +8181,30 @@ "tslib": "^1.10.0" }, "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true, + "optional": true + }, + "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 + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7997,12 +8308,12 @@ } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "^3.0.0", + "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, @@ -8073,26 +8384,14 @@ } }, "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, - "requires": { - "yallist": "^3.0.2" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" }, "magic-string": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz", - "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==", + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", "dev": true, "requires": { "sourcemap-codec": "^1.4.4" @@ -8154,6 +8453,17 @@ "debug": "4" } }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -8163,6 +8473,48 @@ "agent-base": "6", "debug": "4" } + }, + "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, + "requires": { + "yallist": "^3.0.2" + } + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, @@ -8283,10 +8635,9 @@ "dev": true }, "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/methods/-/methods-0.0.1.tgz", + "integrity": "sha1-J3yQ+L7zlwlkWoNxxRw7bGSOBow=" }, "micromatch": { "version": "3.1.10", @@ -8381,6 +8732,12 @@ } } }, + "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 + }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", @@ -8404,10 +8761,9 @@ } }, "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.5.tgz", + "integrity": "sha1-nu0HMCKov14WyFZsaGe4gyv7+hM=" }, "mime-db": { "version": "1.43.0", @@ -8474,6 +8830,12 @@ "sort-keys": "^1.0.0" } }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -8500,18 +8862,18 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", "requires": { - "brace-expansion": "^1.1.7" + "lru-cache": "2", + "sigmund": "~1.0.0" } }, "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { "version": "3.1.1", @@ -8561,6 +8923,14 @@ "requires": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" + }, + "dependencies": { + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + } } }, "minipass-pipeline": { @@ -8631,19 +9001,9 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" }, "moment": { "version": "2.24.0", @@ -8664,13 +9024,13 @@ "run-queue": "^1.0.3" }, "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "glob": "^7.1.3" + "minimist": "^1.2.5" } } } @@ -8726,6 +9086,14 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" + }, + "dependencies": { + "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 + } } }, "natives": { @@ -8803,6 +9171,21 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "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, + "requires": { + "safe-buffer": "~5.2.0" + } } } }, @@ -8855,12 +9238,6 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true } } }, @@ -8958,6 +9335,15 @@ "once": "^1.3.0", "path-is-absolute": "^1.0.0" } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } } } }, @@ -8994,6 +9380,23 @@ "minipass-json-stream": "^1.0.1", "minizlib": "^2.0.0", "npm-package-arg": "^8.0.0" + }, + "dependencies": { + "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, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "npm-run-path": { @@ -9033,10 +9436,9 @@ "dev": true }, "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-0.3.1.tgz", + "integrity": "sha1-Bg4qKifXwNd+x3t48Rqkf9iACNI=" }, "object-component": { "version": "0.0.3", @@ -9063,15 +9465,6 @@ "requires": { "is-descriptor": "^0.1.0" } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } } } }, @@ -9292,12 +9685,6 @@ "color-name": "~1.1.4" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9340,14 +9727,11 @@ "dev": true }, "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "lcid": "^1.0.0" } }, "os-tmpdir": { @@ -9375,21 +9759,21 @@ "dev": true }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -9411,9 +9795,9 @@ } }, "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, "pac-proxy-agent": { @@ -9430,11 +9814,6 @@ "stream-to-array": "~1.0.0" }, "dependencies": { - "agent-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-1.0.2.tgz", - "integrity": "sha1-aJDT+yFwBLYrcPiSjg+uX4lSpwY=" - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -9505,27 +9884,49 @@ "which": "^2.0.2" }, "dependencies": { - "mkdirp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", - "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "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, "requires": { - "glob": "^7.1.3" + "yallist": "^3.0.2" } }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "semver": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", "dev": true }, + "tar": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.1.tgz", + "integrity": "sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==", + "dev": true, + "requires": { + "chownr": "^1.1.3", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9534,6 +9935,12 @@ "requires": { "isexe": "^2.0.0" } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, @@ -9579,10 +9986,10 @@ } }, "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true }, "parseqs": { "version": "0.0.5", @@ -9706,9 +10113,9 @@ "dev": true }, "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, "pify": { @@ -9739,15 +10146,60 @@ "dev": true, "requires": { "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + } } }, "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "dev": true, "requires": { - "find-up": "^3.0.0" + "find-up": "^2.1.0" } }, "portfinder": { @@ -9769,6 +10221,15 @@ "requires": { "ms": "^2.1.1" } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } } } }, @@ -9779,16 +10240,36 @@ "dev": true }, "postcss": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", - "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-2.2.6.tgz", + "integrity": "sha1-wENE4kSeRYa5Vfvkp093CA2EVx8=", + "requires": { + "js-base64": "~2.1.5", + "source-map": "~0.1.40" + } + }, + "postcss-calc": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9806,17 +10287,6 @@ } } }, - "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", - "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, "postcss-colormin": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", @@ -9830,11 +10300,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -9848,11 +10344,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -9863,6 +10385,34 @@ "dev": true, "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-discard-duplicates": { @@ -9872,6 +10422,34 @@ "dev": true, "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-discard-empty": { @@ -9881,6 +10459,34 @@ "dev": true, "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-discard-overridden": { @@ -9890,6 +10496,34 @@ "dev": true, "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-import": { @@ -9904,11 +10538,37 @@ "resolve": "^1.1.7" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -9954,6 +10614,17 @@ "json5": "^1.0.1" } }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -9964,6 +10635,21 @@ "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -9979,11 +10665,37 @@ "stylehacks": "^4.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10001,6 +10713,17 @@ "vendors": "^1.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-selector-parser": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", @@ -10011,6 +10734,21 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10024,11 +10762,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10044,11 +10808,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10066,11 +10856,37 @@ "uniqs": "^2.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10086,6 +10902,17 @@ "postcss-selector-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-selector-parser": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", @@ -10096,6 +10923,21 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10106,6 +10948,34 @@ "dev": true, "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-normalize-display-values": { @@ -10119,11 +10989,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10139,11 +11035,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10159,11 +11081,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10178,11 +11126,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10197,11 +11171,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10216,11 +11216,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10236,11 +11262,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10254,11 +11306,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10273,11 +11351,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10291,6 +11395,34 @@ "caniuse-api": "^3.0.0", "has": "^1.0.0", "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-reduce-transforms": { @@ -10305,11 +11437,37 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10336,11 +11494,37 @@ "svgo": "^1.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10353,6 +11537,34 @@ "alphanum-sort": "^1.0.0", "postcss": "^7.0.0", "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-value-parser": { @@ -10485,6 +11697,20 @@ "rimraf": "^2.2.8" } }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "globby": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", @@ -10523,6 +11749,21 @@ "path-is-inside": "^1.0.1" } }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -10535,15 +11776,6 @@ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", "dev": true }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -10614,79 +11846,10 @@ "socks-proxy-agent": "1" }, "dependencies": { - "agent-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-1.0.2.tgz", - "integrity": "sha1-aJDT+yFwBLYrcPiSjg+uX4lSpwY=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "http-proxy-agent": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-0.2.7.tgz", - "integrity": "sha1-4X/aZfCQLZUs55IeYsf/iGJlWl4=", - "requires": { - "agent-base": "~1.0.1", - "debug": "2", - "extend": "3" - } - }, - "https-proxy-agent": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-0.3.6.tgz", - "integrity": "sha1-cT+jjl01P1DrFKNC/r4pAz7RYZs=", - "requires": { - "agent-base": "~1.0.1", - "debug": "2", - "extend": "3" - } - }, "lru-cache": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.2.tgz", "integrity": "sha1-H92tk4quEmPOE4aAvhs/WRwKtBw=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "smart-buffer": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" - }, - "socks": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", - "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", - "requires": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" - } - }, - "socks-proxy-agent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-1.0.2.tgz", - "integrity": "sha1-Z+BrRH/lY3QX/eVzPL/f7J/+EX8=", - "requires": { - "agent-base": "~1.0.1", - "extend": "~1.2.1", - "socks": "~1.1.5" - }, - "dependencies": { - "extend": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", - "integrity": "sha1-oPX9bPyDpf5J72mNYOyKYk3UV2w=" - } - } } } }, @@ -10703,9 +11866,9 @@ "dev": true }, "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "public-encrypt": { @@ -10773,10 +11936,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz", + "integrity": "sha1-KUsmjksNQlD23eGbO4s0k13/FO8=" }, "query-string": { "version": "4.3.4", @@ -10786,6 +11948,14 @@ "requires": { "object-assign": "^4.1.0", "strict-uri-encode": "^1.0.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + } } }, "querystring": { @@ -10832,22 +12002,18 @@ "dev": true }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.4.tgz", + "integrity": "sha1-zMfd/Ea3KGHN1btDPIQLcLbyf1Q=", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "1.0.0", + "iconv-lite": "0.4.8" }, "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true + "iconv-lite": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.8.tgz", + "integrity": "sha1-xgGadZXyzvynAuq2lKAQvNkpjSA=" } } }, @@ -10911,6 +12077,38 @@ "json-parse-better-errors": "^1.0.1", "normalize-package-data": "^2.0.0", "npm-normalize-package-bin": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "read-package-json-fast": { @@ -10946,6 +12144,21 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "readdir-scoped-modules": { @@ -10958,6 +12171,14 @@ "dezalgo": "^1.0.0", "graceful-fs": "^4.1.2", "once": "^1.3.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + } } }, "readdirp": { @@ -11015,9 +12236,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "requires": { "regenerate": "^1.4.0" @@ -11041,19 +12262,13 @@ "version": "15001.1001.0-dev-harmony-fb", "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=" - }, - "regenerator-runtime": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz", - "integrity": "sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck=" } } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz", + "integrity": "sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck=" }, "regenerator-transform": { "version": "0.14.4", @@ -11086,17 +12301,17 @@ } }, "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", "dev": true, "requires": { "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "regjsgen": { @@ -11106,9 +12321,9 @@ "dev": true }, "regjsparser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", - "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -11165,6 +12380,20 @@ "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "require-directory": { @@ -11269,12 +12498,34 @@ } }, "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "ripemd160": { @@ -11315,9 +12566,9 @@ } }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "requires": { "tslib": "^1.9.0" } @@ -11349,22 +12600,6 @@ "minimatch": "~0.2.14", "walker": "~1.0.5", "watch": "~0.10.0" - }, - "dependencies": { - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } } }, "sass": { @@ -11408,6 +12643,12 @@ "emojis-list": "^3.0.0", "json5": "^1.0.1" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -11418,6 +12659,36 @@ "dev": true, "requires": { "https-proxy-agent": "^2.2.1" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + } } }, "sax": { @@ -11434,26 +12705,6 @@ "requires": { "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - } } }, "select-hose": { @@ -11474,15 +12725,6 @@ "xml2js": "^0.4.17" }, "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "tmp": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", @@ -11504,10 +12746,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" }, "semver-dsl": { "version": "1.0.1", @@ -11581,6 +12822,12 @@ } } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -11727,6 +12974,14 @@ "dev": true, "requires": { "kind-of": "^6.0.2" + }, + "dependencies": { + "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 + } } }, "shebang-command": { @@ -11750,9 +13005,9 @@ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "simple-fmt": { @@ -11789,10 +13044,9 @@ "dev": true }, "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=" }, "snapdragon": { "version": "0.8.2", @@ -11899,6 +13153,12 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } + }, + "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 } } }, @@ -11909,17 +13169,6 @@ "dev": true, "requires": { "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "socket.io": { @@ -12052,6 +13301,23 @@ "requires": { "faye-websocket": "^0.10.0", "uuid": "^3.0.1" + }, + "dependencies": { + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "sockjs-client": { @@ -12089,34 +13355,28 @@ } }, "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", - "dev": true, + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", + "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" } }, "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-1.0.2.tgz", + "integrity": "sha1-Z+BrRH/lY3QX/eVzPL/f7J/+EX8=", "requires": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" + "agent-base": "~1.0.1", + "extend": "~1.2.1", + "socks": "~1.1.5" }, "dependencies": { - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } + "extend": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", + "integrity": "sha1-oPX9bPyDpf5J72mNYOyKYk3UV2w=" } } }, @@ -12136,10 +13396,12 @@ "dev": true }, "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": ">=0.0.4" + } }, "source-map-loader": { "version": "0.2.4", @@ -12285,6 +13547,21 @@ "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "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, + "requires": { + "safe-buffer": "~5.2.0" + } } } }, @@ -12461,6 +13738,12 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true } } }, @@ -12540,12 +13823,9 @@ } }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, "stringmap": { "version": "0.2.2", @@ -12621,6 +13901,17 @@ "postcss-selector-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-selector-parser": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", @@ -12631,6 +13922,21 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -12659,11 +13965,55 @@ "ms": "2.0.0" } }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true } } }, @@ -12725,21 +14075,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", "integrity": "sha1-oPX9bPyDpf5J72mNYOyKYk3UV2w=" - }, - "methods": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/methods/-/methods-0.0.1.tgz", - "integrity": "sha1-J3yQ+L7zlwlkWoNxxRw7bGSOBow=" - }, - "mime": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.5.tgz", - "integrity": "sha1-nu0HMCKov14WyFZsaGe4gyv7+hM=" - }, - "qs": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz", - "integrity": "sha1-KUsmjksNQlD23eGbO4s0k13/FO8=" } } }, @@ -12771,6 +14106,17 @@ "stable": "^0.1.8", "unquote": "~1.1.1", "util.promisify": "~1.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } } }, "symbol-observable": { @@ -12794,25 +14140,13 @@ "dev": true }, "tar": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.1.tgz", - "integrity": "sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==", - "dev": true, + "version": "0.1.20", + "resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", + "integrity": "sha1-QpQLrltfIsdEg2mRJvnz8nRJyxM=", "requires": { - "chownr": "^1.1.3", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.0", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", - "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", - "dev": true - } + "block-stream": "*", + "fstream": "~0.1.28", + "inherits": "2" } }, "tempfile": { @@ -12821,13 +14155,6 @@ "integrity": "sha1-fWtxAEcznTn4RzJ6BW2t8YMQMBA=", "requires": { "uuid": "~1.4.0" - }, - "dependencies": { - "uuid": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-1.4.2.tgz", - "integrity": "sha1-RTAZ9oaWam34PNxSROfJkOzDMvw=" - } } }, "terser": { @@ -12892,15 +14219,68 @@ "unique-filename": "^1.1.1" } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "glob": "^7.1.3" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "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, + "requires": { + "yallist": "^3.0.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -12916,6 +14296,12 @@ "figgy-pudding": "^3.5.1", "minipass": "^3.1.1" } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, @@ -12976,11 +14362,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" }, - "faye-websocket": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz", - "integrity": "sha1-wUxbO/FNdBf/v9mQwKdJXNnzN7w=" - }, "qs": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", @@ -13032,17 +14413,6 @@ "dev": true, "requires": { "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } } }, "to-regex": { @@ -13138,6 +14508,38 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -13231,42 +14633,6 @@ "generator-supported": "~0.0.1", "glob": "~3.2.8", "minimatch": "~0.2.14" - }, - "dependencies": { - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "requires": { - "inherits": "2", - "minimatch": "0.3" - }, - "dependencies": { - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } } }, "unicode-canonical-property-names-ecmascript": { @@ -13286,15 +14652,15 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, "union-value": { @@ -13358,6 +14724,12 @@ "requires": { "ms": "^2.1.1" } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true } } }, @@ -13416,6 +14788,12 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true } } }, @@ -13552,10 +14930,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-1.4.2.tgz", + "integrity": "sha1-RTAZ9oaWam34PNxSROfJkOzDMvw=" }, "validate-npm-package-license": { "version": "3.0.4", @@ -14272,6 +15649,12 @@ } } }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -14290,15 +15673,6 @@ "kind-of": "^3.0.2" } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -14421,6 +15795,26 @@ "pkg-dir": "^3.0.0" } }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", @@ -14447,6 +15841,15 @@ "json5": "^1.0.1" } }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -14457,13 +15860,22 @@ "readable-stream": "^2.0.1" } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "glob": "^7.1.3" + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" } }, "schema-utils": { @@ -14508,6 +15920,18 @@ "webpack-sources": "^1.4.0", "worker-farm": "^1.7.0" } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, @@ -14539,6 +15963,15 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } } } }, @@ -14583,6 +16016,12 @@ "yargs": "12.0.5" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -14648,6 +16087,28 @@ "upath": "^1.1.1" } }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -14669,6 +16130,15 @@ "to-regex-range": "^2.1.0" } }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "fsevents": { "version": "1.2.12", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", @@ -15220,6 +16690,18 @@ } } }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, "is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", @@ -15244,15 +16726,60 @@ "kind-of": "^3.0.2" } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "invert-kv": "^2.0.0" } }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -15275,6 +16802,12 @@ "ajv-keywords": "^3.1.0" } }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -15293,6 +16826,26 @@ "is-number": "^3.0.0", "repeat-string": "^1.6.1" } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } } } }, @@ -15304,6 +16857,14 @@ "requires": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "webpack-merge": { @@ -15396,10 +16957,9 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" }, "worker-farm": { "version": "1.7.0", @@ -15529,10 +17089,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yallist": { "version": "4.0.0", @@ -15541,23 +17100,16 @@ "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", + "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "camelcase": "^1.2.1", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" } }, "yargs-parser": { @@ -15568,6 +17120,14 @@ "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } } }, "yeast": { @@ -15583,9 +17143,9 @@ "dev": true }, "zone.js": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.2.tgz", - "integrity": "sha512-UAYfiuvxLN4oyuqhJwd21Uxb4CNawrq6fPS/05Su5L4G+1TN+HVDJMUHNMobVQDFJRir2cLAODXwluaOKB7HFg==" + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==" } } } diff --git a/package.json b/package.json index 23d1f2402..ae358d42d 100644 --- a/package.json +++ b/package.json @@ -11,40 +11,40 @@ }, "private": true, "dependencies": { - "@angular/animations": "~9.0.5", - "@angular/cdk": "^9.1.2", - "@angular/common": "~9.0.5", - "@angular/compiler": "~9.0.5", - "@angular/core": "~9.0.5", + "@angular/animations": "^9.1.0", + "@angular/cdk": "^9.2.0", + "@angular/common": "^9.1.0", + "@angular/compiler": "^9.1.0", + "@angular/core": "^9.1.0", "@angular/flex-layout": "^9.0.0-beta.29", - "@angular/forms": "~9.0.5", - "@angular/material": "^9.1.2", - "@angular/platform-browser": "~9.0.5", - "@angular/platform-browser-dynamic": "~9.0.5", - "@angular/router": "~9.0.5", + "@angular/forms": "^9.1.0", + "@angular/material": "^9.2.0", + "@angular/platform-browser": "^9.1.0", + "@angular/platform-browser-dynamic": "^9.1.0", + "@angular/router": "^9.1.0", "angular-in-memory-web-api": "^0.10.0", "chart.js": "^2.9.3", "component": "^1.1.0", - "rxjs": "~6.5.4", + "rxjs": "^6.5.5", "tslib": "^1.10.0", - "zone.js": "~0.10.2" + "zone.js": "^0.10.3" }, "devDependencies": { "@angular-devkit/build-angular": "^0.901.0", "@angular/cli": "^9.1.0", - "@angular/compiler-cli": "~9.0.5", - "@angular/language-service": "~9.0.5", - "@types/jasmine": "~3.5.0", + "@angular/compiler-cli": "^9.1.0", + "@angular/language-service": "^9.1.0", + "@types/jasmine": "^3.5.10", "@types/jasminewd2": "~2.0.3", - "@types/node": "^12.11.1", - "codelyzer": "^5.1.2", + "@types/node": "^12.12.34", + "codelyzer": "^5.2.2", "jasmine-core": "~3.5.0", "jasmine-spec-reporter": "~4.2.1", "karma": "~4.3.0", "karma-chrome-launcher": "~3.1.0", "karma-coverage-istanbul-reporter": "~2.1.0", "karma-jasmine": "~2.0.1", - "karma-jasmine-html-reporter": "^1.4.2", + "karma-jasmine-html-reporter": "^1.5.3", "protractor": "~5.4.3", "ts-node": "~8.3.0", "tslint": "~5.18.0", From f205ce14c1c1baee4c75edf6d0b056b4761a86da Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 3 Apr 2020 16:08:07 -0400 Subject: [PATCH 090/120] start of progress indicator and animation --- src/app/app.module.ts | 4 ++- src/app/dashboard/dashboard.component.html | 3 ++- src/app/dashboard/dashboard.component.ts | 30 ++++++++++++++++++++-- src/app/services/progress.service.spec.ts | 16 ++++++++++++ src/app/services/progress.service.ts | 9 +++++++ 5 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 src/app/services/progress.service.spec.ts create mode 100644 src/app/services/progress.service.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 2a8d96159..68868de2b 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,6 +1,7 @@ import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { HttpClientModule, HttpClientXsrfModule } from '@angular/common/http'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { MatTableModule } from '@angular/material/table'; import { MatPaginatorModule } from '@angular/material/paginator'; @@ -8,13 +9,13 @@ import { MatSortModule } from '@angular/material/sort'; import { MatInputModule } from '@angular/material/input'; import { MatButtonToggleModule } from '@angular/material/button-toggle'; import { MatCardModule } from '@angular/material/card'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; import { FlexLayoutModule } from '@angular/flex-layout'; import { httpInterceptorProviders } from './http-interceptors'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { StatusListComponent } from './lists/status-list/status-list.component'; import { DeviceListComponent } from './lists/device-list/device-list.component'; import { DonutChartComponent } from './charts/donut-chart/donut-chart.component'; @@ -52,6 +53,7 @@ import { FolderListComponent } from './lists/folder-list/folder-list.component'; MatSortModule, MatButtonToggleModule, MatCardModule, + MatProgressBarModule, FlexLayoutModule, HttpClientModule, HttpClientXsrfModule.withOptions({ diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html index 6af4bc21d..9f5d68c2c 100644 --- a/src/app/dashboard/dashboard.component.html +++ b/src/app/dashboard/dashboard.component.html @@ -7,7 +7,8 @@ Tech UI -
+ +
diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts index 2ea56b163..2ead0006b 100644 --- a/src/app/dashboard/dashboard.component.ts +++ b/src/app/dashboard/dashboard.component.ts @@ -1,4 +1,11 @@ import { Component, OnInit } from '@angular/core'; +import { + trigger, + state, + style, + animate, + transition, +} from '@angular/animations'; import { SystemConfigService } from '../services/system-config.service'; import { StType } from '../type'; import { FilterService } from '../services/filter.service'; @@ -7,11 +14,28 @@ import { FilterService } from '../services/filter.service'; selector: 'app-dashboard', templateUrl: './dashboard.component.html', styleUrls: ['./dashboard.component.scss'], - providers: [FilterService] + providers: [FilterService], + animations: [ + trigger('loading', [ + state('start', style({ + marginTop: '100px', + })), + state('done', style({ + marginTop: '0px', + })), + transition('open => closed', [ + animate('1s') + ]), + transition('closed => open', [ + animate('0.5s') + ]), + ]), + ] }) -export class DashboardComponent { +export class DashboardComponent implements OnInit { folderChart: StType = StType.Folder; deviceChart: StType = StType.Device; + isLoading: boolean = true; constructor(private systemConfigService: SystemConfigService) { } @@ -21,5 +45,7 @@ export class DashboardComponent { err => console.error('Observer got an error: ' + err), () => console.log('Observer got a complete notification') ); + + this.isLoading = false; } } diff --git a/src/app/services/progress.service.spec.ts b/src/app/services/progress.service.spec.ts new file mode 100644 index 000000000..79d482a8f --- /dev/null +++ b/src/app/services/progress.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ProgressService } from './progress.service'; + +describe('ProgressService', () => { + let service: ProgressService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ProgressService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/progress.service.ts b/src/app/services/progress.service.ts new file mode 100644 index 000000000..23420fc16 --- /dev/null +++ b/src/app/services/progress.service.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class ProgressService { + + constructor() { } +} From 3ee9bc097f75ce04f32d9d1ab8a07297f8b5d516 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sat, 4 Apr 2020 16:09:46 -0400 Subject: [PATCH 091/120] Update tech-ui-blue style to have contrast --- src/styles.scss | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/styles.scss b/src/styles.scss index bb17af248..c7ce7e954 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -29,13 +29,12 @@ $tech-ui-typography: mat-typography-config( // Define the palettes for your theme using the Material Design palettes available in palette.scss // (imported above). For each palette, you can optionally specify a default, lighter, and darker // hue. Available color palettes: https://material.io/design/color/ -$tech-ui-red: #EB5757; $tech-ui-blue: ( - 50: #0891D1, - 100: #0891D1, - 200: #0891D1, - 300: #0891D1, - 400: #0891D1, + 50: #a5e0fc, + 100: #8fd5f7, + 200: #74c7ef, + 300: #51beed, + 400: #3eafe3, 500: #0891D1, 600: #0891D1, 700: #0891D1, From 236816cb93c726be8f455284d03d97c695d9554e Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sat, 4 Apr 2020 16:12:27 -0400 Subject: [PATCH 092/120] Add imports and providers to enable basic testing --- src/app/app.component.spec.ts | 13 ----------- src/app/charts/chart/chart.component.spec.ts | 23 ++++++++++--------- .../donut-chart/donut-chart.component.spec.ts | 16 +++++-------- src/app/dashboard/dashboard.component.html | 2 +- src/app/dashboard/dashboard.component.spec.ts | 22 +++++++----------- .../device-list/device-list.component.spec.ts | 18 +++++---------- .../folder-list/folder-list.component.spec.ts | 16 ++++++------- .../services/db-completion.service.spec.ts | 6 ++++- src/app/services/db-status.service.spec.ts | 5 ++++ src/app/services/device.service.spec.ts | 6 ++++- src/app/services/folder.service.spec.ts | 6 ++++- .../services/system-config.service.spec.ts | 6 ++++- .../system-connections.service.spec.ts | 6 ++++- .../services/system-status.service.spec.ts | 6 ++++- 14 files changed, 76 insertions(+), 75 deletions(-) diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index bc73cff60..18d12318b 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -19,17 +19,4 @@ describe('AppComponent', () => { const app = fixture.componentInstance; expect(app).toBeTruthy(); }); - - it(`should have as title 'tech-ui'`, () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual('tech-ui'); - }); - - it('should render title', () => { - const fixture = TestBed.createComponent(AppComponent); - fixture.detectChanges(); - const compiled = fixture.nativeElement; - expect(compiled.querySelector('.content span').textContent).toContain('tech-ui app is running!'); - }); }); diff --git a/src/app/charts/chart/chart.component.spec.ts b/src/app/charts/chart/chart.component.spec.ts index 4bfa61135..87533587c 100644 --- a/src/app/charts/chart/chart.component.spec.ts +++ b/src/app/charts/chart/chart.component.spec.ts @@ -1,24 +1,25 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { async, TestBed } from '@angular/core/testing'; import { ChartComponent } from './chart.component'; +import { HttpClientModule } from '@angular/common/http'; + +class MockService { + getAll() { + // unimplemented + } +}; describe('ChartComponent', () => { let component: ChartComponent; - let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ ChartComponent ] - }) - .compileComponents(); + imports: [HttpClientModule], + providers: [ChartComponent] + }).compileComponents(); + component = TestBed.inject(ChartComponent); })); - beforeEach(() => { - fixture = TestBed.createComponent(ChartComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - it('should create', () => { expect(component).toBeTruthy(); }); diff --git a/src/app/charts/donut-chart/donut-chart.component.spec.ts b/src/app/charts/donut-chart/donut-chart.component.spec.ts index 8c299a9ec..340cfd687 100644 --- a/src/app/charts/donut-chart/donut-chart.component.spec.ts +++ b/src/app/charts/donut-chart/donut-chart.component.spec.ts @@ -1,23 +1,19 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { DonutChartComponent } from './donut-chart.component'; +import { HttpClientModule } from '@angular/common/http'; describe('DonutChartComponent', () => { let component: DonutChartComponent; - let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ DonutChartComponent ] - }) - .compileComponents(); - })); + declarations: [DonutChartComponent], + providers: [DonutChartComponent] + }).compileComponents(); - beforeEach(() => { - fixture = TestBed.createComponent(DonutChartComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + component = TestBed.inject(DonutChartComponent); + })); it('should create', () => { expect(component).toBeTruthy(); diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html index 9f5d68c2c..23d03d58e 100644 --- a/src/app/dashboard/dashboard.component.html +++ b/src/app/dashboard/dashboard.component.html @@ -7,7 +7,7 @@ Tech UI
- +
diff --git a/src/app/dashboard/dashboard.component.spec.ts b/src/app/dashboard/dashboard.component.spec.ts index 980c24fd0..1ce2c37b2 100644 --- a/src/app/dashboard/dashboard.component.spec.ts +++ b/src/app/dashboard/dashboard.component.spec.ts @@ -1,13 +1,8 @@ -import { LayoutModule } from '@angular/cdk/layout'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatGridListModule } from '@angular/material/grid-list'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; import { DashboardComponent } from './dashboard.component'; +import { HttpClientModule } from '@angular/common/http'; +import { NoopAnimationsModule, BrowserAnimationsModule } from '@angular/platform-browser/animations'; describe('DashboardComponent', () => { let component: DashboardComponent; @@ -17,15 +12,14 @@ describe('DashboardComponent', () => { TestBed.configureTestingModule({ declarations: [DashboardComponent], imports: [ + HttpClientModule, NoopAnimationsModule, - LayoutModule, - MatButtonModule, - MatCardModule, - MatGridListModule, - MatIconModule, - MatMenuModule, - ] + BrowserAnimationsModule, + ], + providers: [DashboardComponent] }).compileComponents(); + + component = TestBed.inject(DashboardComponent); })); beforeEach(() => { diff --git a/src/app/lists/device-list/device-list.component.spec.ts b/src/app/lists/device-list/device-list.component.spec.ts index 6a23078a8..7b45e3278 100644 --- a/src/app/lists/device-list/device-list.component.spec.ts +++ b/src/app/lists/device-list/device-list.component.spec.ts @@ -5,6 +5,8 @@ import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; import { DeviceListComponent } from './device-list.component'; +import { HttpClientModule } from '@angular/common/http'; +import { ChangeDetectorRef } from '@angular/core'; describe('DeviceListComponent', () => { let component: DeviceListComponent; @@ -13,20 +15,12 @@ describe('DeviceListComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [DeviceListComponent], - imports: [ - NoopAnimationsModule, - MatPaginatorModule, - MatSortModule, - MatTableModule, - ] + imports: [HttpClientModule], + providers: [DeviceListComponent, ChangeDetectorRef] }).compileComponents(); - })); - beforeEach(() => { - fixture = TestBed.createComponent(DeviceListComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + component = TestBed.inject(DeviceListComponent); + })); it('should compile', () => { expect(component).toBeTruthy(); diff --git a/src/app/lists/folder-list/folder-list.component.spec.ts b/src/app/lists/folder-list/folder-list.component.spec.ts index 225398c99..9fc88dcd3 100644 --- a/src/app/lists/folder-list/folder-list.component.spec.ts +++ b/src/app/lists/folder-list/folder-list.component.spec.ts @@ -1,6 +1,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { FolderListComponent } from './folder-list.component'; +import { HttpClientModule } from '@angular/common/http'; +import { ChangeDetectorRef } from '@angular/core'; describe('FolderListComponent', () => { let component: FolderListComponent; @@ -8,16 +10,14 @@ describe('FolderListComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ FolderListComponent ] + declarations: [FolderListComponent], + imports: [HttpClientModule], + providers: [FolderListComponent, ChangeDetectorRef] }) - .compileComponents(); - })); + .compileComponents(); - beforeEach(() => { - fixture = TestBed.createComponent(FolderListComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + component = TestBed.inject(FolderListComponent); + })); it('should create', () => { expect(component).toBeTruthy(); diff --git a/src/app/services/db-completion.service.spec.ts b/src/app/services/db-completion.service.spec.ts index 90b9a8ed8..e6a07d016 100644 --- a/src/app/services/db-completion.service.spec.ts +++ b/src/app/services/db-completion.service.spec.ts @@ -1,12 +1,16 @@ import { TestBed } from '@angular/core/testing'; import { DbCompletionService } from './db-completion.service'; +import { HttpClientModule } from '@angular/common/http'; describe('DbCompletionService', () => { let service: DbCompletionService; beforeEach(() => { - TestBed.configureTestingModule({}); + TestBed.configureTestingModule({ + imports: [HttpClientModule], + providers: [DbCompletionService] + }); service = TestBed.inject(DbCompletionService); }); diff --git a/src/app/services/db-status.service.spec.ts b/src/app/services/db-status.service.spec.ts index d5d0a16c6..65c7c871c 100644 --- a/src/app/services/db-status.service.spec.ts +++ b/src/app/services/db-status.service.spec.ts @@ -1,11 +1,16 @@ import { TestBed } from '@angular/core/testing'; import { DbStatusService } from './db-status.service'; +import { HttpClientModule } from '@angular/common/http'; describe('DbStatusService', () => { let service: DbStatusService; beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientModule], + providers: [DbStatusService] + }); TestBed.configureTestingModule({}); service = TestBed.inject(DbStatusService); }); diff --git a/src/app/services/device.service.spec.ts b/src/app/services/device.service.spec.ts index d55f5fb7d..35b94a052 100644 --- a/src/app/services/device.service.spec.ts +++ b/src/app/services/device.service.spec.ts @@ -1,12 +1,16 @@ import { TestBed } from '@angular/core/testing'; import { DeviceService } from './device.service'; +import { HttpClientModule } from '@angular/common/http'; describe('DeviceService', () => { let service: DeviceService; beforeEach(() => { - TestBed.configureTestingModule({}); + TestBed.configureTestingModule({ + imports: [HttpClientModule], + providers: [DeviceService] + }); service = TestBed.inject(DeviceService); }); diff --git a/src/app/services/folder.service.spec.ts b/src/app/services/folder.service.spec.ts index 591addf71..6382d4ac8 100644 --- a/src/app/services/folder.service.spec.ts +++ b/src/app/services/folder.service.spec.ts @@ -1,12 +1,16 @@ import { TestBed } from '@angular/core/testing'; import { FolderService } from './folder.service'; +import { HttpClientModule } from '@angular/common/http'; describe('FolderService', () => { let service: FolderService; beforeEach(() => { - TestBed.configureTestingModule({}); + TestBed.configureTestingModule({ + imports: [HttpClientModule], + providers: [FolderService] + }); service = TestBed.inject(FolderService); }); diff --git a/src/app/services/system-config.service.spec.ts b/src/app/services/system-config.service.spec.ts index 7f2beb10a..011706140 100644 --- a/src/app/services/system-config.service.spec.ts +++ b/src/app/services/system-config.service.spec.ts @@ -1,12 +1,16 @@ import { TestBed } from '@angular/core/testing'; import { SystemConfigService } from './system-config.service'; +import { HttpClientModule } from '@angular/common/http'; describe('SystemConfigService', () => { let service: SystemConfigService; beforeEach(() => { - TestBed.configureTestingModule({}); + TestBed.configureTestingModule({ + imports: [HttpClientModule], + providers: [SystemConfigService] + }); service = TestBed.inject(SystemConfigService); }); diff --git a/src/app/services/system-connections.service.spec.ts b/src/app/services/system-connections.service.spec.ts index bac82fabb..c55566e12 100644 --- a/src/app/services/system-connections.service.spec.ts +++ b/src/app/services/system-connections.service.spec.ts @@ -1,12 +1,16 @@ import { TestBed } from '@angular/core/testing'; import { SystemConnectionsService } from './system-connections.service'; +import { HttpClientModule } from '@angular/common/http'; describe('SystemConnectionsService', () => { let service: SystemConnectionsService; beforeEach(() => { - TestBed.configureTestingModule({}); + TestBed.configureTestingModule({ + imports: [HttpClientModule], + providers: [SystemConnectionsService] + }); service = TestBed.inject(SystemConnectionsService); }); diff --git a/src/app/services/system-status.service.spec.ts b/src/app/services/system-status.service.spec.ts index 8b47a3a6a..a292daa68 100644 --- a/src/app/services/system-status.service.spec.ts +++ b/src/app/services/system-status.service.spec.ts @@ -1,12 +1,16 @@ import { TestBed } from '@angular/core/testing'; import { SystemStatusService } from './system-status.service'; +import { HttpClientModule } from '@angular/common/http'; describe('SystemStatusService', () => { let service: SystemStatusService; beforeEach(() => { - TestBed.configureTestingModule({}); + TestBed.configureTestingModule({ + imports: [HttpClientModule], + providers: [SystemStatusService] + }); service = TestBed.inject(SystemStatusService); }); From ee465c089027632c396b3f0d1599c1c6d7408b5b Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sat, 4 Apr 2020 16:13:12 -0400 Subject: [PATCH 093/120] update progress service with get percentValue and table tests --- src/app/services/progress.service.spec.ts | 24 +++++++++++++++++++ src/app/services/progress.service.ts | 28 ++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/app/services/progress.service.spec.ts b/src/app/services/progress.service.spec.ts index 79d482a8f..fb55baca2 100644 --- a/src/app/services/progress.service.spec.ts +++ b/src/app/services/progress.service.spec.ts @@ -1,6 +1,7 @@ import { TestBed } from '@angular/core/testing'; import { ProgressService } from './progress.service'; +import { stringToKeyValue } from '@angular/flex-layout/extended/typings/style/style-transforms'; describe('ProgressService', () => { let service: ProgressService; @@ -13,4 +14,27 @@ describe('ProgressService', () => { it('should be created', () => { expect(service).toBeTruthy(); }); + + it('#percentValue should return 0 - 100', () => { + interface iTest { + total: number, + progress: number, + expected: string + } + const tests: Map = new Map([ + ["default", { total: 0, progress: 0, expected: '0' }], + ["NaN return 0", { total: 0, progress: 100, expected: '0' }], + ["greater than 100 return 100", { total: 10, progress: 100, expected: '100' }], + ["valid", { total: 100, progress: 100, expected: '100' }], + ["valid", { total: 100, progress: 50, expected: '50' }], + ["test floor", { total: 133, progress: 41, expected: '30' }], + ]); + + service = new ProgressService(); + for (let test of tests.values()) { + service.total = test.total; + service.updateProgress(test.progress); + expect(service.percentValue).toBe(test.expected); + } + }); }); diff --git a/src/app/services/progress.service.ts b/src/app/services/progress.service.ts index 23420fc16..c24a1330a 100644 --- a/src/app/services/progress.service.ts +++ b/src/app/services/progress.service.ts @@ -4,6 +4,32 @@ import { Injectable } from '@angular/core'; providedIn: 'root' }) export class ProgressService { + private progress: number = 0; + private _total: number = 0; + set total(t: number) { + this._total = t; + } + + get percentValue(): string { + let p: number = Math.floor((this.progress / this._total) * 100); + console.log("P?!", NaN) + if (p < 0 || isNaN(p) || p === Infinity) { + p = 0; + } else if (p > 100) { + p = 100; + } + return p.toString(); + } constructor() { } -} + + updateProgress(n: number) { + if (n < 0) { + n = 0 + } else if (n > 100) { + n = 100 + } + + this.progress = n; + } +} \ No newline at end of file From 1e33cc9720b8b5aa9e586ddcbf74807c3868ba42 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sun, 5 Apr 2020 11:47:25 -0400 Subject: [PATCH 094/120] update progress service with device/folders loaded and add animation --- src/app/charts/chart/chart.component.ts | 7 --- src/app/dashboard/dashboard.component.html | 5 +- src/app/dashboard/dashboard.component.scss | 5 ++ src/app/dashboard/dashboard.component.ts | 60 ++++++++++++++++++---- src/app/services/device.service.ts | 6 ++- src/app/services/folder.service.ts | 7 ++- src/app/services/progress.service.spec.ts | 14 ++--- src/app/services/progress.service.ts | 23 +++++++-- src/app/services/system-config.service.ts | 10 +++- 9 files changed, 104 insertions(+), 33 deletions(-) diff --git a/src/app/charts/chart/chart.component.ts b/src/app/charts/chart/chart.component.ts index 14d99ce53..403a7b8d6 100644 --- a/src/app/charts/chart/chart.component.ts +++ b/src/app/charts/chart/chart.component.ts @@ -54,14 +54,7 @@ export class ChartComponent implements OnInit { } else { this.activeChartState = null; this.filterService.changeFilter({ type: this.type, text: "" }) - console.log("change filter", this.type) } - - /* - const index = this.states.indexOf(s); - if (index >= 0) { - } - */ } ngOnInit(): void { diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html index 23d03d58e..31bd7fd6f 100644 --- a/src/app/dashboard/dashboard.component.html +++ b/src/app/dashboard/dashboard.component.html @@ -7,7 +7,10 @@ Tech UI
- +
+ + +
diff --git a/src/app/dashboard/dashboard.component.scss b/src/app/dashboard/dashboard.component.scss index 84c7e85b0..d3181c868 100644 --- a/src/app/dashboard/dashboard.component.scss +++ b/src/app/dashboard/dashboard.component.scss @@ -1,6 +1,11 @@ .header { margin: 20px 3vw 20px 3vw; } + +.progress { + margin: 0 3vw 0 3vw; +} + .grid-container { margin: 10px calc(10px + 3.3vw); min-width: 600px; diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts index 2ead0006b..d44dd3c8d 100644 --- a/src/app/dashboard/dashboard.component.ts +++ b/src/app/dashboard/dashboard.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, AfterViewInit, ViewChild, AfterViewChecked } from '@angular/core'; import { trigger, state, @@ -9,6 +9,8 @@ import { import { SystemConfigService } from '../services/system-config.service'; import { StType } from '../type'; import { FilterService } from '../services/filter.service'; +import { ProgressService } from '../services/progress.service'; +import { MatProgressBar } from '@angular/material/progress-bar'; @Component({ selector: 'app-dashboard', @@ -18,26 +20,48 @@ import { FilterService } from '../services/filter.service'; animations: [ trigger('loading', [ state('start', style({ - marginTop: '100px', + marginTop: '20px', })), state('done', style({ marginTop: '0px', })), - transition('open => closed', [ - animate('1s') + transition('start => done', [ + animate('0.2s 0.2s') ]), - transition('closed => open', [ - animate('0.5s') + transition('done => start', [ + animate('0.2s 0.2s') + ]), + ]), + trigger('progressBar', [ + state('start', style({ + opacity: 100, + visibility: 'visible' + })), + state('done', style({ + opacity: 0, + visibility: 'hidden' + })), + transition('start => done', [ + animate('0.35s') + ]), + transition('done => start', [ + animate('0.35s') ]), ]), ] }) -export class DashboardComponent implements OnInit { +export class DashboardComponent implements OnInit, AfterViewInit { + @ViewChild(MatProgressBar) progressBar: MatProgressBar; folderChart: StType = StType.Folder; deviceChart: StType = StType.Device; - isLoading: boolean = true; + progressValue: number = 0; + isLoading = true; - constructor(private systemConfigService: SystemConfigService) { } + + constructor( + private systemConfigService: SystemConfigService, + private progressService: ProgressService, + ) { } ngOnInit() { this.systemConfigService.getSystemConfig().subscribe( @@ -46,6 +70,20 @@ export class DashboardComponent implements OnInit { () => console.log('Observer got a complete notification') ); - this.isLoading = false; } -} + + ngAfterViewInit() { + this.isLoading = true; + + // Listen for progress service changes + let t = setInterval(() => { + if (this.progressService.isComplete()) { + clearInterval(t); + this.progressValue = 100; + this.isLoading = false; + } + this.progressValue = this.progressService.percentValue; + }, 100); + + } +} \ No newline at end of file diff --git a/src/app/services/device.service.ts b/src/app/services/device.service.ts index 6894fa6a7..657a35f16 100644 --- a/src/app/services/device.service.ts +++ b/src/app/services/device.service.ts @@ -6,6 +6,7 @@ import { SystemConnectionsService } from './system-connections.service'; import { DbCompletionService } from './db-completion.service'; import { SystemConnections } from '../connections'; import { SystemStatusService } from './system-status.service'; +import { ProgressService } from './progress.service'; @Injectable({ providedIn: 'root' @@ -19,7 +20,8 @@ export class DeviceService { private systemConfigService: SystemConfigService, private systemConnectionsService: SystemConnectionsService, private dbCompletionService: DbCompletionService, - private systemStatusService: SystemStatusService + private systemStatusService: SystemStatusService, + private progressService: ProgressService, ) { } getDeviceStatusInOrder(observer: Subscriber, startIndex: number) { @@ -53,6 +55,8 @@ export class DeviceService { device.state = Device.stateTypeToString(device.stateType); observer.next(device); + this.progressService.addToProgress(1); + // recursively get the status of the next folder this.getDeviceStatusInOrder(observer, startIndex); }); diff --git a/src/app/services/folder.service.ts b/src/app/services/folder.service.ts index 0c433f757..c208b432e 100644 --- a/src/app/services/folder.service.ts +++ b/src/app/services/folder.service.ts @@ -3,6 +3,7 @@ import { SystemConfigService } from './system-config.service'; import { Observable, Subscriber } from 'rxjs'; import Folder from '../folder'; import { DbStatusService } from './db-status.service'; +import { ProgressService } from './progress.service'; @Injectable({ providedIn: 'root' @@ -12,7 +13,8 @@ export class FolderService { constructor( private systemConfigService: SystemConfigService, - private dbStatusService: DbStatusService + private dbStatusService: DbStatusService, + private progressService: ProgressService, ) { } getFolderStatusInOrder(observer: Subscriber, startIndex: number) { @@ -30,6 +32,9 @@ export class FolderService { folder.state = Folder.stateTypeToString(folder.stateType); observer.next(folder); + // Add one to the progress service + this.progressService.addToProgress(1); + // recursively get the status of the next folder this.getFolderStatusInOrder(observer, startIndex); } diff --git a/src/app/services/progress.service.spec.ts b/src/app/services/progress.service.spec.ts index fb55baca2..9b0f96bcc 100644 --- a/src/app/services/progress.service.spec.ts +++ b/src/app/services/progress.service.spec.ts @@ -19,15 +19,15 @@ describe('ProgressService', () => { interface iTest { total: number, progress: number, - expected: string + expected: number, } const tests: Map = new Map([ - ["default", { total: 0, progress: 0, expected: '0' }], - ["NaN return 0", { total: 0, progress: 100, expected: '0' }], - ["greater than 100 return 100", { total: 10, progress: 100, expected: '100' }], - ["valid", { total: 100, progress: 100, expected: '100' }], - ["valid", { total: 100, progress: 50, expected: '50' }], - ["test floor", { total: 133, progress: 41, expected: '30' }], + ["default", { total: 0, progress: 0, expected: 0 }], + ["NaN return 0", { total: 0, progress: 100, expected: 0 }], + ["greater than 100 return 100", { total: 10, progress: 100, expected: 100 }], + ["valid", { total: 100, progress: 100, expected: 100 }], + ["valid", { total: 100, progress: 50, expected: 50 }], + ["test floor", { total: 133, progress: 41, expected: 30 }], ]); service = new ProgressService(); diff --git a/src/app/services/progress.service.ts b/src/app/services/progress.service.ts index c24a1330a..953b56810 100644 --- a/src/app/services/progress.service.ts +++ b/src/app/services/progress.service.ts @@ -10,21 +10,28 @@ export class ProgressService { this._total = t; } - get percentValue(): string { + get percentValue(): number { let p: number = Math.floor((this.progress / this._total) * 100); - console.log("P?!", NaN) if (p < 0 || isNaN(p) || p === Infinity) { p = 0; } else if (p > 100) { p = 100; } - return p.toString(); + return p; } constructor() { } + addToProgress(n: number) { + if (n < 0 || isNaN(n) || n === Infinity) { + n = 0; + } + + this.progress += n; + } + updateProgress(n: number) { - if (n < 0) { + if (n < 0 || isNaN(n) || n === Infinity) { n = 0 } else if (n > 100) { n = 100 @@ -32,4 +39,12 @@ export class ProgressService { this.progress = n; } + + isComplete(): boolean { + if (this.progress >= this._total && this.progress > 0 && this._total > 0) { + return true; + } + + return false; + } } \ No newline at end of file diff --git a/src/app/services/system-config.service.ts b/src/app/services/system-config.service.ts index 16d845c93..45ab9fb1f 100644 --- a/src/app/services/system-config.service.ts +++ b/src/app/services/system-config.service.ts @@ -8,6 +8,7 @@ import Folder from '../folder'; import Device from '../device'; import { environment } from '../../environments/environment' import { apiURL, apiRetry } from '../api-utils' +import { ProgressService } from './progress.service'; @Injectable({ providedIn: 'root' @@ -22,7 +23,10 @@ export class SystemConfigService { private checkInterval: number = 100; - constructor(private http: HttpClient) { } + constructor( + private http: HttpClient, + private progressService: ProgressService, + ) { } getSystemConfig(): Observable { return this.http @@ -32,6 +36,10 @@ export class SystemConfigService { map(res => { this.folders = res['folders']; this.devices = res['devices']; + + // Set the total for the progress service + this.progressService.total = this.folders.length + this.devices.length; + this.foldersSubject.next(this.folders); this.devicesSubject.next(this.devices); From 5a6d79a66eca8e83e98415ab9f3bb937384c6c0b Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 6 Apr 2020 14:30:44 -0400 Subject: [PATCH 095/120] Recalculate completion for devices and update total properties --- src/app/completion.ts | 1 + src/app/device.ts | 37 +++++++++++++++++++++-- src/app/folder.ts | 17 +++++------ src/app/mocks/mock-db-completion.ts | 6 ++-- src/app/mocks/mock-db-status.ts | 3 ++ src/app/services/db-completion.service.ts | 19 +++++++++--- src/app/services/device.service.ts | 21 +++++++++---- src/app/services/folder.service.ts | 21 ++++++++----- 8 files changed, 94 insertions(+), 31 deletions(-) diff --git a/src/app/completion.ts b/src/app/completion.ts index 686ab57b5..a52f19c5c 100644 --- a/src/app/completion.ts +++ b/src/app/completion.ts @@ -3,4 +3,5 @@ export interface Completion { globalBytes: number; needBytes: number; needDeletes: number; + needItems: number; } \ No newline at end of file diff --git a/src/app/device.ts b/src/app/device.ts index 4a285b069..a7de61273 100644 --- a/src/app/device.ts +++ b/src/app/device.ts @@ -1,4 +1,6 @@ import { colors } from './style'; +import Folder from './folder'; +import { Completion } from './completion'; interface Device { deviceID: string; @@ -7,8 +9,9 @@ interface Device { state: string; paused: boolean; connected: boolean; - completion: number; + completion: Completion; used: boolean; // indicates if a folder is using the device + folders: Folder[]; } namespace Device { @@ -80,7 +83,7 @@ namespace Device { } if (d.connected) { - if (d.completion === 100) { + if (d.completion.completion === 100) { return d.used ? StateType.Insync : StateType.UnusedInsync; } else { return StateType.Syncing; @@ -89,5 +92,35 @@ namespace Device { return d.used ? StateType.Disconnected : StateType.UnusedDisconnected; } + + export function recalcCompletion(d: Device) { + if (!d || !d.completion || !d.folders) { + return + } + var total = 0, needed = 0, deletes = 0, items = 0; + d.folders.forEach(folder => { + if (!folder || !folder.completion) + return + needed += folder.completion.needBytes; + items += folder.completion.needItems; + deletes += folder.completion.needDeletes; + }); + if (total == 0) { + d.completion.completion = 100; + d.completion.needBytes = 0; + d.completion.needItems = 0; + } else { + d.completion.completion = Math.floor(100 * (1 - needed / total)); + d.completion.needBytes = needed; + d.completion.needItems = items + deletes; + } + + if (needed == 0 && deletes > 0) { + // We don't need any data, but we have deletes that we need + // to do. Drop down the completion percentage to indicate + // that we have stuff to do. + d.completion.completion = 95; + } + } } export default Device; \ No newline at end of file diff --git a/src/app/folder.ts b/src/app/folder.ts index c3330f0ff..ca10c3486 100644 --- a/src/app/folder.ts +++ b/src/app/folder.ts @@ -1,5 +1,6 @@ import Device from './device'; import { colors } from './style'; +import { Completion } from './completion'; interface Folder { id: string; @@ -9,7 +10,7 @@ interface Folder { stateType: Folder.StateType; state: string; paused: boolean; - completion: number; + completion: Completion; path: string; } @@ -144,18 +145,13 @@ namespace Folder { return StateType.Unknown; } - const needTotalItems = fs.needDeletes + fs.needDirectories + - fs.needFiles + fs.needSymlinks; - const receiveOnlyTotalItems = fs.receiveOnlyChangedDeletes + fs.receiveOnlyChangedDirectories + - fs.receiveOnlyChangedFiles + fs.receiveOnlyChangedSymlinks; - - if (needTotalItems > 0) { + if (fs.needTotalItems > 0) { return StateType.OutOfSync; } - if (f.status.pullErrors > 0) { + if (fs.pullErrors > 0) { return StateType.FailedItems; } - if (receiveOnlyTotalItems > 0) { + if (fs.receiveOnlyTotalItems > 0) { return StateType.LocalAdditions; } if (f.devices.length <= 1) { @@ -172,6 +168,7 @@ namespace Folder { globalDirectories: number; globalFiles: number; globalSymlinks: number; + globalTotalItems: number; ignorePatterns: boolean; inSyncBytes: number; inSyncFiles: number; @@ -186,12 +183,14 @@ namespace Folder { needDirectories: number; needFiles: number; needSymlinks: number; + needTotalItems: number; pullErrors: number; receiveOnlyChangedBytes: number; receiveOnlyChangedDeletes: number; receiveOnlyChangedDirectories: number; receiveOnlyChangedFiles: number; receiveOnlyChangedSymlinks: number; + receiveOnlyTotalItems: number; sequence: number; state: string; stateChanged: string; diff --git a/src/app/mocks/mock-db-completion.ts b/src/app/mocks/mock-db-completion.ts index 7ef778d61..a0fd65480 100644 --- a/src/app/mocks/mock-db-completion.ts +++ b/src/app/mocks/mock-db-completion.ts @@ -5,13 +5,15 @@ export const dbCompletion = "completion": 100, "globalBytes": 156793013575, "needBytes": 0, - "needDeletes": 0 + "needDeletes": 0, + "needItems": 0 }, { "completion": 80, "globalBytes": 3013575, "needBytes": 100, - "needDeletes": 0 + "needDeletes": 0, + "needItems": 0 } ] /* diff --git a/src/app/mocks/mock-db-status.ts b/src/app/mocks/mock-db-status.ts index 0779bbe42..03c5a51c6 100644 --- a/src/app/mocks/mock-db-status.ts +++ b/src/app/mocks/mock-db-status.ts @@ -16,6 +16,7 @@ export const dbStatus = "globalDirectories": 0, "globalFiles": 0, "globalSymlinks": 0, + "globalTotalItems": 0, "ignorePatterns": false, "inSyncBytes": 0, "inSyncFiles": 0, @@ -25,11 +26,13 @@ export const dbStatus = "localDirectories": 0, "localFiles": 0, "localSymlinks": 0, + "localTotalItems": 0, "needBytes": 0, "needDeletes": 0, "needDirectories": 0, "needFiles": 0, "needSymlinks": 0, + "needTotalItems": 0, "pullErrors": 0, "receiveOnlyChangedBytes": 0, "receiveOnlyChangedDeletes": 0, diff --git a/src/app/services/db-completion.service.ts b/src/app/services/db-completion.service.ts index 00cb4f36c..174481308 100644 --- a/src/app/services/db-completion.service.ts +++ b/src/app/services/db-completion.service.ts @@ -5,6 +5,7 @@ import { apiURL, apiRetry } from '../api-utils'; import { Completion } from '../completion'; import { retry, map } from 'rxjs/operators'; import { Observable } from 'rxjs'; +import { StType } from '../type'; @Injectable({ providedIn: 'root' @@ -14,12 +15,21 @@ export class DbCompletionService { constructor(private http: HttpClient) { } - getDeviceCompletion(id: string): Observable { + getCompletion(type: StType, id: string): Observable { let httpOptions: { params: HttpParams }; if (id) { - httpOptions = { - params: new HttpParams().set('device', id) - }; + switch (type) { + case StType.Device: + httpOptions = { + params: new HttpParams().set('device', id) + }; + break; + case StType.Folder: + httpOptions = { + params: new HttpParams().set('folder', id) + }; + break; + } } else { } return this.http @@ -38,6 +48,5 @@ export class DbCompletionService { return res; }) ); - } } \ No newline at end of file diff --git a/src/app/services/device.service.ts b/src/app/services/device.service.ts index 657a35f16..c3c6ac741 100644 --- a/src/app/services/device.service.ts +++ b/src/app/services/device.service.ts @@ -7,6 +7,7 @@ import { DbCompletionService } from './db-completion.service'; import { SystemConnections } from '../connections'; import { SystemStatusService } from './system-status.service'; import { ProgressService } from './progress.service'; +import { StType } from '../type'; @Injectable({ providedIn: 'root' @@ -48,16 +49,17 @@ export class DeviceService { } } - this.dbCompletionService.getDeviceCompletion(device.deviceID).subscribe( + this.dbCompletionService.getCompletion(StType.Device, device.deviceID).subscribe( c => { - device.completion = c.completion; + device.completion = c; + Device.recalcCompletion(device); device.stateType = Device.getStateType(device); device.state = Device.stateTypeToString(device.stateType); observer.next(device); this.progressService.addToProgress(1); - // recursively get the status of the next folder + // recursively get the status of the next device this.getDeviceStatusInOrder(observer, startIndex); }); } @@ -75,22 +77,29 @@ export class DeviceService { status => { this.devices.forEach(device => { if (device.deviceID === status.myID) { - console.log("found thisDevice!", device); + // TODO Determine if it should ignore thisDevice this.thisDevice = device; } }); - // TODO Determine if it should ignore thisDevice - // Check folder devices to see if the device is used this.systemConfigService.getFolders().subscribe( folders => { // Loop through all folder devices to see if the device is used this.devices.forEach(device => { + // Alloc array if needed + if (!device.folders) { + device.folders = []; + } + folders.forEach(folder => { folder.devices.forEach(fdevice => { if (device.deviceID === fdevice.deviceID) { + // The device is used by a folder device.used = true; + + // Add a reference to the folder to the device + device.folders.push(folder); } }); }); diff --git a/src/app/services/folder.service.ts b/src/app/services/folder.service.ts index c208b432e..c70b2c8e6 100644 --- a/src/app/services/folder.service.ts +++ b/src/app/services/folder.service.ts @@ -4,6 +4,8 @@ import { Observable, Subscriber } from 'rxjs'; import Folder from '../folder'; import { DbStatusService } from './db-status.service'; import { ProgressService } from './progress.service'; +import { DbCompletionService } from './db-completion.service'; +import { StType } from '../type'; @Injectable({ providedIn: 'root' @@ -14,6 +16,7 @@ export class FolderService { constructor( private systemConfigService: SystemConfigService, private dbStatusService: DbStatusService, + private dbCompletionService: DbCompletionService, private progressService: ProgressService, ) { } @@ -28,15 +31,19 @@ export class FolderService { this.dbStatusService.getFolderStatus(folder.id).subscribe( status => { folder.status = status; - folder.stateType = Folder.getStateType(folder); - folder.state = Folder.stateTypeToString(folder.stateType); - observer.next(folder); - // Add one to the progress service - this.progressService.addToProgress(1); + this.dbCompletionService.getCompletion(StType.Folder, folder.id).subscribe( + c => { + folder.completion = c; + folder.stateType = Folder.getStateType(folder); + folder.state = Folder.stateTypeToString(folder.stateType); + observer.next(folder); - // recursively get the status of the next folder - this.getFolderStatusInOrder(observer, startIndex); + this.progressService.addToProgress(1); + + // recursively get the status of the next folder + this.getFolderStatusInOrder(observer, startIndex); + }); } ); } From b247ef2632651f37381a091e72ab0c06b9130121 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Mon, 6 Apr 2020 14:32:27 -0400 Subject: [PATCH 096/120] start of error interceptor --- .../error.interceptor.spec.ts | 16 +++++++++ .../http-interceptors/error.interceptor.ts | 36 +++++++++++++++++++ src/app/http-interceptors/index.ts | 2 ++ 3 files changed, 54 insertions(+) create mode 100644 src/app/http-interceptors/error.interceptor.spec.ts create mode 100644 src/app/http-interceptors/error.interceptor.ts diff --git a/src/app/http-interceptors/error.interceptor.spec.ts b/src/app/http-interceptors/error.interceptor.spec.ts new file mode 100644 index 000000000..4d083ad20 --- /dev/null +++ b/src/app/http-interceptors/error.interceptor.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ErrorInterceptor } from './error.interceptor'; + +describe('ErrorInterceptor', () => { + beforeEach(() => TestBed.configureTestingModule({ + providers: [ + ErrorInterceptor + ] + })); + + it('should be created', () => { + const interceptor: ErrorInterceptor = TestBed.inject(ErrorInterceptor); + expect(interceptor).toBeTruthy(); + }); +}); diff --git a/src/app/http-interceptors/error.interceptor.ts b/src/app/http-interceptors/error.interceptor.ts new file mode 100644 index 000000000..31288b613 --- /dev/null +++ b/src/app/http-interceptors/error.interceptor.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@angular/core'; +import { + HttpRequest, + HttpHandler, + HttpEvent, + HttpInterceptor, + HttpErrorResponse +} from '@angular/common/http'; +import { Observable, throwError } from 'rxjs'; +import { apiRetry } from '../api-utils'; +import { retry, catchError } from 'rxjs/operators'; + +@Injectable() +export class ErrorInterceptor implements HttpInterceptor { + + constructor() { } + + intercept(request: HttpRequest, next: HttpHandler): Observable> { + return next.handle(request) + .pipe( + retry(apiRetry), + catchError((error: HttpErrorResponse) => { + let errorMsg: string; + if (error.error instanceof ErrorEvent) { + // Client side + errorMsg = `Error: ${error.error.message}`; + } else { + // Server side + errorMsg = `Error Status: ${error.status}\nMessage: ${error.message}`; + } + console.log(errorMsg); + return throwError(errorMsg); + }) + ) + } +} diff --git a/src/app/http-interceptors/index.ts b/src/app/http-interceptors/index.ts index 53635a917..f478c61e6 100644 --- a/src/app/http-interceptors/index.ts +++ b/src/app/http-interceptors/index.ts @@ -3,10 +3,12 @@ import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { CSRFInterceptor } from './csrf.interceptor'; import { CachingInterceptor } from './caching.interceptor'; +import { ErrorInterceptor } from './error.interceptor'; /** Http interceptor providers in outside-in order */ export const httpInterceptorProviders = [ { provide: HTTP_INTERCEPTORS, useClass: CachingInterceptor, multi: true }, + { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true }, // CSRFInterceptor needs to be last { provide: HTTP_INTERCEPTORS, useClass: CSRFInterceptor, multi: true }, ]; \ No newline at end of file From 632b6f8fbda216e12aa9299acdb7d2e51c52516a Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 7 Apr 2020 18:54:21 -0400 Subject: [PATCH 097/120] start of dialog component --- src/app/app.module.ts | 2 ++ src/app/dialog/dialog.component.html | 4 ++++ src/app/dialog/dialog.component.scss | 0 src/app/dialog/dialog.component.spec.ts | 25 +++++++++++++++++++++++++ src/app/dialog/dialog.component.ts | 21 +++++++++++++++++++++ 5 files changed, 52 insertions(+) create mode 100644 src/app/dialog/dialog.component.html create mode 100644 src/app/dialog/dialog.component.scss create mode 100644 src/app/dialog/dialog.component.spec.ts create mode 100644 src/app/dialog/dialog.component.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 68868de2b..2f8e1adf4 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -30,6 +30,7 @@ import { environment } from '../environments/environment'; import { ChartItemComponent } from './charts/chart-item/chart-item.component'; import { ChartComponent } from './charts/chart/chart.component'; import { FolderListComponent } from './lists/folder-list/folder-list.component'; +import { DialogComponent } from './dialog/dialog.component'; @NgModule({ declarations: [ @@ -42,6 +43,7 @@ import { FolderListComponent } from './lists/folder-list/folder-list.component'; ChartComponent, ChartItemComponent, FolderListComponent, + DialogComponent, ], imports: [ BrowserModule, diff --git a/src/app/dialog/dialog.component.html b/src/app/dialog/dialog.component.html new file mode 100644 index 000000000..d883ebfb6 --- /dev/null +++ b/src/app/dialog/dialog.component.html @@ -0,0 +1,4 @@ +

Error

+
+ {{data.message}} +
\ No newline at end of file diff --git a/src/app/dialog/dialog.component.scss b/src/app/dialog/dialog.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/dialog/dialog.component.spec.ts b/src/app/dialog/dialog.component.spec.ts new file mode 100644 index 000000000..a6bce8db3 --- /dev/null +++ b/src/app/dialog/dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DialogComponent } from './dialog.component'; + +describe('DialogComponent', () => { + let component: DialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DialogComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/dialog/dialog.component.ts b/src/app/dialog/dialog.component.ts new file mode 100644 index 000000000..0e7635f6d --- /dev/null +++ b/src/app/dialog/dialog.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MessageService } from '../services/message.service'; + +export interface DialogData { + message: 'example message'; +} + +@Component({ + selector: 'app-dialog', + templateUrl: './dialog.component.html', + styleUrls: ['./dialog.component.scss'] +}) +export class DialogComponent implements OnInit { + + constructor(public messageService: MessageService) { } + + ngOnInit(): void { + } + +} From ac603e92287a929145c4b6b7d35e3d8a337bf4dd Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 7 Apr 2020 18:54:34 -0400 Subject: [PATCH 098/120] start of message service --- src/app/services/message.service.spec.ts | 16 ++++++++++++++++ src/app/services/message.service.ts | 14 ++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/app/services/message.service.spec.ts create mode 100644 src/app/services/message.service.ts diff --git a/src/app/services/message.service.spec.ts b/src/app/services/message.service.spec.ts new file mode 100644 index 000000000..1db761b5e --- /dev/null +++ b/src/app/services/message.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { MessageService } from './message.service'; + +describe('MessageService', () => { + let service: MessageService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(MessageService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/message.service.ts b/src/app/services/message.service.ts new file mode 100644 index 000000000..e10baf7ac --- /dev/null +++ b/src/app/services/message.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; + +@Injectable() +export class MessageService { + messages: string[] = []; + + add(message: string) { + this.messages.push(message); + } + + clear() { + this.messages = []; + } +} \ No newline at end of file From e67b91977db491199b86ca60106fdd12deb2ff3e Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 7 Apr 2020 18:54:53 -0400 Subject: [PATCH 099/120] remove console logs --- src/app/services/device.service.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/app/services/device.service.ts b/src/app/services/device.service.ts index c3c6ac741..376c07270 100644 --- a/src/app/services/device.service.ts +++ b/src/app/services/device.service.ts @@ -36,8 +36,6 @@ export class DeviceService { // Check if device in the connections if (this.sysConns.connections[device.deviceID] === undefined) { - console.log(this.sysConns.connections) - console.log("connections undefined", device.deviceID); device.stateType = Device.StateType.Unknown; } else { // Set connected From 33d47063e87151e0aae4c2765c50ffd3c869c49b Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 7 Apr 2020 18:56:51 -0400 Subject: [PATCH 100/120] remove unused data binding --- src/app/dialog/dialog.component.html | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/dialog/dialog.component.html b/src/app/dialog/dialog.component.html index d883ebfb6..7bc436517 100644 --- a/src/app/dialog/dialog.component.html +++ b/src/app/dialog/dialog.component.html @@ -1,4 +1,3 @@

Error

- {{data.message}}
\ No newline at end of file From 7b61f800c312c8b08605ca16ab4f707dc2b9f555 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 7 Apr 2020 20:08:41 -0400 Subject: [PATCH 101/120] add missing semicolon --- src/app/services/folder.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/services/folder.service.ts b/src/app/services/folder.service.ts index c70b2c8e6..aec61ff81 100644 --- a/src/app/services/folder.service.ts +++ b/src/app/services/folder.service.ts @@ -67,6 +67,6 @@ export class FolderService { () => { console.log("get all complete!") } ); }); - return folderObservable + return folderObservable; } } \ No newline at end of file From 9918cb4ffc0a05eefe0950750da7c1adec6afd2f Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 7 Apr 2020 20:10:47 -0400 Subject: [PATCH 102/120] Add MatDialog and use messageService to display errors --- src/app/app.module.ts | 2 ++ src/app/dashboard/dashboard.component.ts | 21 +++++++++++++++++++ src/app/dialog/dialog.component.html | 3 +++ src/app/dialog/dialog.component.ts | 4 +--- .../http-interceptors/error.interceptor.ts | 5 ++++- src/app/services/message.service.ts | 8 ++++++- 6 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 2f8e1adf4..dae6e769b 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -10,6 +10,7 @@ import { MatInputModule } from '@angular/material/input'; import { MatButtonToggleModule } from '@angular/material/button-toggle'; import { MatCardModule } from '@angular/material/card'; import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatDialogModule } from '@angular/material/dialog'; import { FlexLayoutModule } from '@angular/flex-layout'; import { httpInterceptorProviders } from './http-interceptors'; @@ -56,6 +57,7 @@ import { DialogComponent } from './dialog/dialog.component'; MatButtonToggleModule, MatCardModule, MatProgressBarModule, + MatDialogModule, FlexLayoutModule, HttpClientModule, HttpClientXsrfModule.withOptions({ diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts index d44dd3c8d..86f8b48f5 100644 --- a/src/app/dashboard/dashboard.component.ts +++ b/src/app/dashboard/dashboard.component.ts @@ -11,6 +11,9 @@ import { StType } from '../type'; import { FilterService } from '../services/filter.service'; import { ProgressService } from '../services/progress.service'; import { MatProgressBar } from '@angular/material/progress-bar'; +import { MessageService } from '../services/message.service'; +import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { DialogComponent } from '../dialog/dialog.component'; @Component({ selector: 'app-dashboard', @@ -56,11 +59,14 @@ export class DashboardComponent implements OnInit, AfterViewInit { deviceChart: StType = StType.Device; progressValue: number = 0; isLoading = true; + private dialogRef: MatDialogRef; constructor( private systemConfigService: SystemConfigService, private progressService: ProgressService, + private messageService: MessageService, + public dialog: MatDialog ) { } ngOnInit() { @@ -85,5 +91,20 @@ export class DashboardComponent implements OnInit, AfterViewInit { this.progressValue = this.progressService.percentValue; }, 100); + // Listen for messages from other services/components + this.messageService.messageAdded$ + .subscribe( + _ => { + // Open dialog + if (!this.dialogRef) + this.dialogRef = this.dialog.open(DialogComponent); + + this.dialogRef.afterClosed().subscribe( + _ => { + this.dialogRef = null; + this.messageService.clear(); + } + ); + }); } } \ No newline at end of file diff --git a/src/app/dialog/dialog.component.html b/src/app/dialog/dialog.component.html index 7bc436517..a7ba9830d 100644 --- a/src/app/dialog/dialog.component.html +++ b/src/app/dialog/dialog.component.html @@ -1,3 +1,6 @@

Error

+
    +
  • {{message}}
  • +
\ No newline at end of file diff --git a/src/app/dialog/dialog.component.ts b/src/app/dialog/dialog.component.ts index 0e7635f6d..de6be2fcd 100644 --- a/src/app/dialog/dialog.component.ts +++ b/src/app/dialog/dialog.component.ts @@ -15,7 +15,5 @@ export class DialogComponent implements OnInit { constructor(public messageService: MessageService) { } - ngOnInit(): void { - } - + ngOnInit(): void { } } diff --git a/src/app/http-interceptors/error.interceptor.ts b/src/app/http-interceptors/error.interceptor.ts index 31288b613..d5dfb21ad 100644 --- a/src/app/http-interceptors/error.interceptor.ts +++ b/src/app/http-interceptors/error.interceptor.ts @@ -9,11 +9,12 @@ import { import { Observable, throwError } from 'rxjs'; import { apiRetry } from '../api-utils'; import { retry, catchError } from 'rxjs/operators'; +import { MessageService } from '../services/message.service'; @Injectable() export class ErrorInterceptor implements HttpInterceptor { - constructor() { } + constructor(private messageService: MessageService) { } intercept(request: HttpRequest, next: HttpHandler): Observable> { return next.handle(request) @@ -29,6 +30,8 @@ export class ErrorInterceptor implements HttpInterceptor { errorMsg = `Error Status: ${error.status}\nMessage: ${error.message}`; } console.log(errorMsg); + + this.messageService.add(errorMsg); return throwError(errorMsg); }) ) diff --git a/src/app/services/message.service.ts b/src/app/services/message.service.ts index e10baf7ac..39dc5d954 100644 --- a/src/app/services/message.service.ts +++ b/src/app/services/message.service.ts @@ -1,11 +1,17 @@ import { Injectable } from '@angular/core'; +import { Subject } from 'rxjs'; -@Injectable() +@Injectable({ + providedIn: 'root' +}) export class MessageService { messages: string[] = []; + private messageAddedSource = new Subject(); + messageAdded$ = this.messageAddedSource.asObservable(); add(message: string) { this.messages.push(message); + this.messageAddedSource.next(message); } clear() { From 89c53c508bff9aaa5b0d19a3b100845eee30393a Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 8 Apr 2020 10:07:13 -0400 Subject: [PATCH 103/120] consolidate retry logic in error interceptor remove retry operator from services --- src/app/services/db-completion.service.ts | 5 ++--- src/app/services/db-status.service.ts | 8 +++----- src/app/services/system-config.service.ts | 5 ++--- src/app/services/system-connections.service.ts | 5 ++--- src/app/services/system-status.service.ts | 5 ++--- 5 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/app/services/db-completion.service.ts b/src/app/services/db-completion.service.ts index 174481308..d7d5ce668 100644 --- a/src/app/services/db-completion.service.ts +++ b/src/app/services/db-completion.service.ts @@ -1,9 +1,9 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import { environment } from 'src/environments/environment'; -import { apiURL, apiRetry } from '../api-utils'; +import { apiURL } from '../api-utils'; import { Completion } from '../completion'; -import { retry, map } from 'rxjs/operators'; +import { map } from 'rxjs/operators'; import { Observable } from 'rxjs'; import { StType } from '../type'; @@ -35,7 +35,6 @@ export class DbCompletionService { return this.http .get(this.dbStatusUrl, httpOptions) .pipe( - retry(apiRetry), map(res => { // Remove from array in developement // in-memory-web-api returns arrays diff --git a/src/app/services/db-status.service.ts b/src/app/services/db-status.service.ts index dd2ff2665..6c51581c7 100644 --- a/src/app/services/db-status.service.ts +++ b/src/app/services/db-status.service.ts @@ -1,12 +1,11 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { CookieService } from './cookie.service'; -import { Observable, of } from 'rxjs'; -import { map, retry, catchError } from 'rxjs/operators'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; import { environment } from '../../environments/environment' -import { apiURL, apiRetry } from '../api-utils' +import { apiURL } from '../api-utils' import Folder from '../folder' @Injectable({ @@ -28,7 +27,6 @@ export class DbStatusService { return this.http .get(this.dbStatusUrl, httpOptions) .pipe( - retry(apiRetry), map(res => { // Remove from array in developement // in-memory-web-api returns arrays diff --git a/src/app/services/system-config.service.ts b/src/app/services/system-config.service.ts index 45ab9fb1f..db715e43d 100644 --- a/src/app/services/system-config.service.ts +++ b/src/app/services/system-config.service.ts @@ -2,12 +2,12 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Observable, Subject } from 'rxjs'; -import { map, retry } from 'rxjs/operators'; +import { map } from 'rxjs/operators'; import Folder from '../folder'; import Device from '../device'; import { environment } from '../../environments/environment' -import { apiURL, apiRetry } from '../api-utils' +import { apiURL } from '../api-utils' import { ProgressService } from './progress.service'; @Injectable({ @@ -32,7 +32,6 @@ export class SystemConfigService { return this.http .get(this.systemConfigUrl) .pipe( - retry(apiRetry), map(res => { this.folders = res['folders']; this.devices = res['devices']; diff --git a/src/app/services/system-connections.service.ts b/src/app/services/system-connections.service.ts index 09a66c8a4..d196da228 100644 --- a/src/app/services/system-connections.service.ts +++ b/src/app/services/system-connections.service.ts @@ -1,8 +1,8 @@ import { Injectable } from '@angular/core'; import { environment } from 'src/environments/environment'; -import { apiURL, apiRetry } from '../api-utils'; +import { apiURL } from '../api-utils'; import { HttpClient } from '@angular/common/http'; -import { retry, map } from 'rxjs/operators'; +import { map } from 'rxjs/operators'; import { Observable } from 'rxjs'; import { SystemConnections } from '../connections'; @@ -18,7 +18,6 @@ export class SystemConnectionsService { return this.http .get(this.systemConfigUrl) .pipe( - retry(apiRetry), map(res => { return res; }) diff --git a/src/app/services/system-status.service.ts b/src/app/services/system-status.service.ts index b5e88f1a5..ca9a18bbe 100644 --- a/src/app/services/system-status.service.ts +++ b/src/app/services/system-status.service.ts @@ -1,9 +1,9 @@ import { Injectable } from '@angular/core'; import { environment } from 'src/environments/environment'; -import { apiURL, apiRetry } from '../api-utils'; +import { apiURL } from '../api-utils'; import { Observable } from 'rxjs'; import { HttpClient } from '@angular/common/http'; -import { retry, map } from 'rxjs/operators'; +import { map } from 'rxjs/operators'; import { SystemStatus } from '../system-status'; @Injectable({ @@ -19,7 +19,6 @@ export class SystemStatusService { return this.http .get(this.systemStatusUrl) .pipe( - retry(apiRetry), map(res => { return res; }) From 6e1828ff639f3b485a9d770116eadf2efe3dcf8b Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Wed, 8 Apr 2020 16:27:54 -0400 Subject: [PATCH 104/120] support dark mode and add custom card component --- src/app/app.module.ts | 6 ++ src/app/card/card.component.scss | 36 ++++++++++ src/app/card/card.component.spec.ts | 25 +++++++ src/app/card/card.component.ts | 35 ++++++++++ .../chart-item/chart-item.component.scss | 36 +++++++--- src/app/charts/chart/chart.component.html | 10 +-- src/app/charts/chart/chart.component.ts | 2 - src/app/dialog/dialog.component.html | 8 +-- src/app/dialog/dialog.component.ts | 11 ++- .../status-list/status-list.component.html | 10 +-- src/styles.scss | 69 ++++++++++--------- 11 files changed, 185 insertions(+), 63 deletions(-) create mode 100644 src/app/card/card.component.scss create mode 100644 src/app/card/card.component.spec.ts create mode 100644 src/app/card/card.component.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index dae6e769b..ad31f8505 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -11,6 +11,7 @@ import { MatButtonToggleModule } from '@angular/material/button-toggle'; import { MatCardModule } from '@angular/material/card'; import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatDialogModule } from '@angular/material/dialog'; +import { MatListModule } from '@angular/material/list' import { FlexLayoutModule } from '@angular/flex-layout'; import { httpInterceptorProviders } from './http-interceptors'; @@ -32,6 +33,7 @@ import { ChartItemComponent } from './charts/chart-item/chart-item.component'; import { ChartComponent } from './charts/chart/chart.component'; import { FolderListComponent } from './lists/folder-list/folder-list.component'; import { DialogComponent } from './dialog/dialog.component'; +import { CardComponent, CardTitleComponent, CardContentComponent } from './card/card.component'; @NgModule({ declarations: [ @@ -45,6 +47,9 @@ import { DialogComponent } from './dialog/dialog.component'; ChartItemComponent, FolderListComponent, DialogComponent, + CardComponent, + CardTitleComponent, + CardContentComponent, ], imports: [ BrowserModule, @@ -58,6 +63,7 @@ import { DialogComponent } from './dialog/dialog.component'; MatCardModule, MatProgressBarModule, MatDialogModule, + MatListModule, FlexLayoutModule, HttpClientModule, HttpClientXsrfModule.withOptions({ diff --git a/src/app/card/card.component.scss b/src/app/card/card.component.scss new file mode 100644 index 000000000..b682b30a0 --- /dev/null +++ b/src/app/card/card.component.scss @@ -0,0 +1,36 @@ +// Import theming functions +@import '~@angular/material/theming'; + +@mixin tui-card-theme($theme) { + // Extract the palettes you need from the theme definition. + $primary: map-get($theme, primary); + $accent: map-get($theme, accent); + $background: map-get($theme, background); + $foreground: map-get($theme, foreground); + + .tui-card { + background-color: white; + border-radius: 4px; + height: 100%; + } + + .tui-card-title { + padding: 16px 16px 0 16px; + font-size: mat-font-size($tech-ui-typography, subheading-2); + color: mat-color($primary); + } + + .tui-card-content { + padding: 16px; + } + + .tui-button-toggle .mat-button-toggle-appearance-standard .mat-button-toggle-label-content { + line-height: 34px; + } + + @media (prefers-color-scheme: dark) { + .tui-card { + background-color: map_get($mat-grey, 800); + } + } +} \ No newline at end of file diff --git a/src/app/card/card.component.spec.ts b/src/app/card/card.component.spec.ts new file mode 100644 index 000000000..e141708ac --- /dev/null +++ b/src/app/card/card.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CardComponent } from './card.component'; + +describe('CardComponent', () => { + let component: CardComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CardComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/card/card.component.ts b/src/app/card/card.component.ts new file mode 100644 index 000000000..10a01b109 --- /dev/null +++ b/src/app/card/card.component.ts @@ -0,0 +1,35 @@ +import { Component, OnInit } from '@angular/core'; +import { cardElevation } from '../style'; + +@Component({ + selector: 'app-card', + template: '
', + styleUrls: ['./card.component.scss'] +}) +export class CardComponent implements OnInit { + elevation: string = cardElevation; + + constructor() { } + + ngOnInit(): void { + } + +} + +@Component({ + selector: 'app-card-title', + template: '
', + styleUrls: ['./card.component.scss'] +}) +export class CardTitleComponent { + constructor() { } +} + +@Component({ + selector: 'app-card-content', + template: '
', + styleUrls: ['./card.component.scss'] +}) +export class CardContentComponent { + constructor() { } +} diff --git a/src/app/charts/chart-item/chart-item.component.scss b/src/app/charts/chart-item/chart-item.component.scss index 2aef89c04..4444b2f38 100644 --- a/src/app/charts/chart-item/chart-item.component.scss +++ b/src/app/charts/chart-item/chart-item.component.scss @@ -1,13 +1,27 @@ -.item { - cursor: pointer; - padding: 3px 7px 3px 7px; - border-radius: 4px; -} +@mixin chart-item-theme($theme) { + .item { + cursor: pointer; + padding: 3px 7px 3px 7px; + border-radius: 4px; + } -.selected { - background-color: #DDDDDD; -} -.selected a { - color: #000000; - text-decoration: none; + .selected { + background-color: #DDDDDD; + color: #303030; + } + .selected a { + color: #000000; + text-decoration: none; + } + + @media (prefers-color-scheme: dark) { + .selected { + background-color: map_get($mat-grey, 900); + color: white; + } + + .selected a { + color: white; + } + } } \ No newline at end of file diff --git a/src/app/charts/chart/chart.component.html b/src/app/charts/chart/chart.component.html index 021a2fec9..eefd0d62b 100644 --- a/src/app/charts/chart/chart.component.html +++ b/src/app/charts/chart/chart.component.html @@ -1,6 +1,6 @@ -
-
{{title | uppercase}}
-
+ + {{title | uppercase}} +
@@ -10,5 +10,5 @@
-
-
\ No newline at end of file + + \ No newline at end of file diff --git a/src/app/charts/chart/chart.component.ts b/src/app/charts/chart/chart.component.ts index 403a7b8d6..3e0c72e5d 100644 --- a/src/app/charts/chart/chart.component.ts +++ b/src/app/charts/chart/chart.component.ts @@ -1,6 +1,5 @@ import { Component, OnInit, ViewChild, Input } from '@angular/core'; import Folder from '../../folder' -import { cardElevation } from '../../style' import { FolderService } from 'src/app/services/folder.service'; import { DonutChartComponent } from '../donut-chart/donut-chart.component'; import { DeviceService } from 'src/app/services/device.service'; @@ -27,7 +26,6 @@ export class ChartComponent implements OnInit { title: string; chartID: string; states: ChartItemState[] = []; - elevation: string = cardElevation; private service: any; private activeChartState: ChartItemState; diff --git a/src/app/dialog/dialog.component.html b/src/app/dialog/dialog.component.html index a7ba9830d..8f0406052 100644 --- a/src/app/dialog/dialog.component.html +++ b/src/app/dialog/dialog.component.html @@ -1,6 +1,6 @@ -

Error

-
    -
  • {{message}}
  • -
+ + {{message}} + +
\ No newline at end of file diff --git a/src/app/dialog/dialog.component.ts b/src/app/dialog/dialog.component.ts index de6be2fcd..40a554339 100644 --- a/src/app/dialog/dialog.component.ts +++ b/src/app/dialog/dialog.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit, Inject } from '@angular/core'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MessageService } from '../services/message.service'; export interface DialogData { @@ -13,7 +13,14 @@ export interface DialogData { }) export class DialogComponent implements OnInit { - constructor(public messageService: MessageService) { } + constructor( + public dialogRef: MatDialogRef, + public messageService: MessageService + ) { } ngOnInit(): void { } + + onNoClick(): void { + this.dialogRef.close(); + } } diff --git a/src/app/lists/status-list/status-list.component.html b/src/app/lists/status-list/status-list.component.html index 986deb682..e98effdd1 100644 --- a/src/app/lists/status-list/status-list.component.html +++ b/src/app/lists/status-list/status-list.component.html @@ -1,10 +1,10 @@ -
+
-
{{title | uppercase}}
+ {{title | uppercase}}
-
+ -
-
\ No newline at end of file + + \ No newline at end of file diff --git a/src/styles.scss b/src/styles.scss index c7ce7e954..9e5344ac9 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,10 +1,13 @@ // Custom Theming for Angular Material // For more information: https://material.angular.io/guide/theming @import '~@angular/material/theming'; +@import './app/card/card.component.scss'; +@import './app/charts/chart-item/chart-item.component.scss'; + // Custom typography $tech-ui-typography: mat-typography-config( - $font-family: '"Courier New", Courier, monospace', + $font-family: '"Lucida Console", Monaco, monospace', $display-4: mat-typography-level(112px, 112px, 300), $display-3: mat-typography-level(56px, 56px, 400), $display-2: mat-typography-level(45px, 48px, 400), @@ -70,45 +73,43 @@ $tech-ui-warn: mat-palette($mat-red); // Create the theme object (a Sass map containing all of the palettes). $tech-ui-theme: mat-light-theme($tech-ui-primary, $tech-ui-accent, $tech-ui-warn); - +$tech-ui-dark-theme: mat-dark-theme($tech-ui-primary, $tech-ui-accent, $tech-ui-warn); + // Include theme styles for core and each component used in your app. // Alternatively, you can import and @include the theme mixins for each component // that you are using. -@include angular-material-theme($tech-ui-theme); + @include angular-material-theme($tech-ui-theme); + @include tui-card-theme($tech-ui-theme); + @include chart-item-theme($tech-ui-theme); -/* You can add global styles to this file, and also import other style files */ -html, body { - height: 100%; - background-color: #eeeeee; - font-size: mat-font-size($tech-ui-typography, body-1); - font-family: mat-font-family($tech-ui-typography); - line-height: mat-line-height($tech-ui-typography, body-1); -} + + html, body { + height: 100%; + background-color: #eeeeee; + font-size: mat-font-size($tech-ui-typography, body-1); + font-family: mat-font-family($tech-ui-typography); + line-height: mat-line-height($tech-ui-typography, body-1); + color: #303030; + } -a { - text-decoration: underline; - color: #000000; -} + a { + text-decoration: underline; + color: #303030; + } +@media (prefers-color-scheme: dark) { + @include angular-material-theme($tech-ui-dark-theme); + @include tui-card-theme($tech-ui-dark-theme); + @include chart-item-theme($tech-ui-dark-theme); + + html, body { + background-color: #303030; + color: white; + } -.tui-card { - background-color: white; - border-radius: 4px; - height: 100%; -} - -.tui-card-title { - padding: 16px 16px 0 16px; - font-size: mat-font-size($tech-ui-typography, subheading-2); - color: mat-color($tech-ui-primary); -} - -.tui-card-content { - padding: 16px; -} - -.tui-button-toggle .mat-button-toggle-appearance-standard .mat-button-toggle-label-content { - line-height: 34px; -} + a { + color: white; + } +} // Chart.js styles #chartjs-tooltip { From 95f7a26bcecf77fbc48b8bfa4f353b3dce14e175 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 9 Apr 2020 09:53:07 -0400 Subject: [PATCH 105/120] style dialog component and close button --- src/app/app.module.ts | 2 ++ src/app/dialog/dialog.component.html | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index ad31f8505..84094dfd2 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -12,6 +12,7 @@ import { MatCardModule } from '@angular/material/card'; import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatDialogModule } from '@angular/material/dialog'; import { MatListModule } from '@angular/material/list' +import { MatButtonModule } from '@angular/material/button'; import { FlexLayoutModule } from '@angular/flex-layout'; import { httpInterceptorProviders } from './http-interceptors'; @@ -64,6 +65,7 @@ import { CardComponent, CardTitleComponent, CardContentComponent } from './card/ MatProgressBarModule, MatDialogModule, MatListModule, + MatButtonModule, FlexLayoutModule, HttpClientModule, HttpClientXsrfModule.withOptions({ diff --git a/src/app/dialog/dialog.component.html b/src/app/dialog/dialog.component.html index 8f0406052..f926daa41 100644 --- a/src/app/dialog/dialog.component.html +++ b/src/app/dialog/dialog.component.html @@ -1,6 +1,6 @@ -
- +
+ {{message}} - +
\ No newline at end of file From 5f1aba9a37e5c6d0ee6701c1fd312922c64ef4b4 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 9 Apr 2020 11:53:41 -0400 Subject: [PATCH 106/120] adjusting styles --- src/app/card/card.component.scss | 1 + src/app/dashboard/dashboard.component.scss | 3 +- .../status-list/status-list.component.html | 2 +- .../status-list/status-list.component.scss | 6 +--- src/styles.scss | 35 +++++++++++-------- 5 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/app/card/card.component.scss b/src/app/card/card.component.scss index b682b30a0..3e0fae75b 100644 --- a/src/app/card/card.component.scss +++ b/src/app/card/card.component.scss @@ -17,6 +17,7 @@ .tui-card-title { padding: 16px 16px 0 16px; font-size: mat-font-size($tech-ui-typography, subheading-2); + font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; color: mat-color($primary); } diff --git a/src/app/dashboard/dashboard.component.scss b/src/app/dashboard/dashboard.component.scss index d3181c868..ddeec0bd2 100644 --- a/src/app/dashboard/dashboard.component.scss +++ b/src/app/dashboard/dashboard.component.scss @@ -1,5 +1,6 @@ .header { - margin: 20px 3vw 20px 3vw; + margin: 15px 3vw 12px 3vw; + font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; } .progress { diff --git a/src/app/lists/status-list/status-list.component.html b/src/app/lists/status-list/status-list.component.html index e98effdd1..bf2b5999d 100644 --- a/src/app/lists/status-list/status-list.component.html +++ b/src/app/lists/status-list/status-list.component.html @@ -1,4 +1,4 @@ - +
{{title | uppercase}} diff --git a/src/app/lists/status-list/status-list.component.scss b/src/app/lists/status-list/status-list.component.scss index 213f72723..e258cb9be 100644 --- a/src/app/lists/status-list/status-list.component.scss +++ b/src/app/lists/status-list/status-list.component.scss @@ -1,7 +1,3 @@ -.tui-card-toggle { +.status-list .tui-card-toggle { padding: 16px 16px 0 16px; -} - -.tui-card-content { - padding-top: 0; } \ No newline at end of file diff --git a/src/styles.scss b/src/styles.scss index 9e5344ac9..757f02480 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -78,24 +78,25 @@ $tech-ui-dark-theme: mat-dark-theme($tech-ui-primary, $tech-ui-accent, $tech-ui- // Include theme styles for core and each component used in your app. // Alternatively, you can import and @include the theme mixins for each component // that you are using. - @include angular-material-theme($tech-ui-theme); - @include tui-card-theme($tech-ui-theme); - @include chart-item-theme($tech-ui-theme); +@include angular-material-theme($tech-ui-theme); +@include tui-card-theme($tech-ui-theme); +@include chart-item-theme($tech-ui-theme); - html, body { - height: 100%; - background-color: #eeeeee; - font-size: mat-font-size($tech-ui-typography, body-1); - font-family: mat-font-family($tech-ui-typography); - line-height: mat-line-height($tech-ui-typography, body-1); - color: #303030; - } +html, body { + height: 100%; + background-color: #eeeeee; + font-size: mat-font-size($tech-ui-typography, body-1); + font-family: mat-font-family($tech-ui-typography); + line-height: mat-line-height($tech-ui-typography, body-1); + color: #303030; +} + +a { + text-decoration: underline; + color: #303030; +} - a { - text-decoration: underline; - color: #303030; - } @media (prefers-color-scheme: dark) { @include angular-material-theme($tech-ui-dark-theme); @include tui-card-theme($tech-ui-dark-theme); @@ -111,6 +112,10 @@ $tech-ui-dark-theme: mat-dark-theme($tech-ui-primary, $tech-ui-accent, $tech-ui- } } +.status-list .tui-card .tui-card-content { + padding-top: 0; +} + // Chart.js styles #chartjs-tooltip { /* max z-index value */ From 3fbc51cd38dc079f5cfed842a4f20ba37bb153b4 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 14 Apr 2020 16:29:52 +0200 Subject: [PATCH 107/120] Skip animations on donut charts --- src/app/charts/donut-chart/donut-chart.component.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/charts/donut-chart/donut-chart.component.ts b/src/app/charts/donut-chart/donut-chart.component.ts index 708635215..1600af6fe 100644 --- a/src/app/charts/donut-chart/donut-chart.component.ts +++ b/src/app/charts/donut-chart/donut-chart.component.ts @@ -79,7 +79,8 @@ export class DonutChartComponent { // Disable the on-canvas tooltip enabled: false, custom: tooltip(), - } + }, + animation: false } }); } From f53475a204003cc6a7d8ceaa33732b2a5d4ea0ab Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 9 Apr 2020 13:02:34 -0400 Subject: [PATCH 108/120] use replay subject in place of timer --- src/app/services/system-config.service.ts | 41 ++++------------------- 1 file changed, 6 insertions(+), 35 deletions(-) diff --git a/src/app/services/system-config.service.ts b/src/app/services/system-config.service.ts index db715e43d..e359ca75a 100644 --- a/src/app/services/system-config.service.ts +++ b/src/app/services/system-config.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { HttpClient } from '@angular/common/http'; -import { Observable, Subject } from 'rxjs'; +import { Observable, ReplaySubject } from 'rxjs'; import { map } from 'rxjs/operators'; import Folder from '../folder'; @@ -16,13 +16,11 @@ import { ProgressService } from './progress.service'; export class SystemConfigService { private folders: Folder[]; private devices: Device[]; - private foldersSubject: Subject = new Subject(); - private devicesSubject: Subject = new Subject(); + private foldersSubject: ReplaySubject = new ReplaySubject(1); + private devicesSubject: ReplaySubject = new ReplaySubject(1); private systemConfigUrl = environment.production ? apiURL + 'rest/system/config' : 'api/config'; - private checkInterval: number = 100; - constructor( private http: HttpClient, private progressService: ProgressService, @@ -48,37 +46,10 @@ export class SystemConfigService { } getFolders(): Observable { - const folderObservable: Observable = new Observable((observer) => { - if (this.folders) { - observer.next(this.folders); - observer.complete(); - } else { - // create timer to keep checking for folders - let t = setInterval(() => { - if (this.folders) { - clearInterval(t); - observer.next(this.folders) - observer.complete(); - } - }, this.checkInterval); - } - }); - return folderObservable; + return this.foldersSubject.asObservable(); } getDevices(): Observable { - const deviceObserverable: Observable = new Observable((observer) => { - if (this.devices) { - observer.next(this.devices); - } else { - let t = setInterval(() => { - if (this.devices) { - clearInterval(t); - observer.next(this.devices); - } - }, this.checkInterval); - } - }); - return deviceObserverable; + return this.devicesSubject.asObservable(); } } \ No newline at end of file From 24a637e9e674c23a2fa520f90d24bc9fdb42b734 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Thu, 9 Apr 2020 13:44:08 -0400 Subject: [PATCH 109/120] Change device/folder getAll to getEach --- src/app/charts/chart/chart.component.spec.ts | 2 +- src/app/charts/chart/chart.component.ts | 2 +- src/app/services/device.service.ts | 9 ++++++--- src/app/services/folder.service.ts | 11 ++++++----- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/app/charts/chart/chart.component.spec.ts b/src/app/charts/chart/chart.component.spec.ts index 87533587c..41d2df417 100644 --- a/src/app/charts/chart/chart.component.spec.ts +++ b/src/app/charts/chart/chart.component.spec.ts @@ -4,7 +4,7 @@ import { ChartComponent } from './chart.component'; import { HttpClientModule } from '@angular/common/http'; class MockService { - getAll() { + getEach() { // unimplemented } }; diff --git a/src/app/charts/chart/chart.component.ts b/src/app/charts/chart/chart.component.ts index 3e0c72e5d..a4ce30012 100644 --- a/src/app/charts/chart/chart.component.ts +++ b/src/app/charts/chart/chart.component.ts @@ -72,7 +72,7 @@ export class ChartComponent implements OnInit { ngAfterViewInit() { let totalCount: number = 0; - this.service.getAll().subscribe( + this.service.getEach().subscribe( t => { // Count the number of folders and set chart totalCount++; diff --git a/src/app/services/device.service.ts b/src/app/services/device.service.ts index 376c07270..0570502b7 100644 --- a/src/app/services/device.service.ts +++ b/src/app/services/device.service.ts @@ -62,7 +62,10 @@ export class DeviceService { }); } - getAll(): Observable { + /** + * getEach() returns each device + */ + getEach(): Observable { const deviceObservable: Observable = new Observable((observer) => { // TODO return devices if cached @@ -116,8 +119,8 @@ export class DeviceService { } ) }, - err => { console.log("getAll error!", err) }, - () => { console.log("get all complete!") } + err => { console.log("getEach error!", err) }, + () => { console.log("getEach complete!") } ); }); return deviceObservable diff --git a/src/app/services/folder.service.ts b/src/app/services/folder.service.ts index aec61ff81..a41b46436 100644 --- a/src/app/services/folder.service.ts +++ b/src/app/services/folder.service.ts @@ -49,10 +49,11 @@ export class FolderService { } /** - * getAll() finds all folders and uses db status service to - * set all their statuses + * getEach() returns each folder and uses db status service to + * set all their statuses and db completion service to find + * completion */ - getAll(): Observable { + getEach(): Observable { // TODO return this.folders if cached const folderObservable: Observable = new Observable((observer) => { @@ -63,8 +64,8 @@ export class FolderService { // Synchronously get the status of each folder this.getFolderStatusInOrder(observer, 0); }, - err => { console.log("getAll error!", err) }, - () => { console.log("get all complete!") } + err => { console.log("getEach error!", err) }, + () => { console.log("getEach complete!") } ); }); return folderObservable; From ae776ff8df5f381727701c07ae3d1b6e4779c71b Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 10 Apr 2020 22:06:27 -0400 Subject: [PATCH 110/120] Rework device and folder service to have public obseravble to accomaccommodatemodate many subscribers without re-requesting data from the API --- src/app/charts/chart/chart.component.ts | 13 +- src/app/dashboard/dashboard.component.ts | 13 +- .../device-list/device-list.component.ts | 21 +++- .../folder-list/folder-list.component.ts | 18 ++- src/app/services/device.service.ts | 118 +++++++++--------- src/app/services/folder.service.ts | 43 ++++--- 6 files changed, 129 insertions(+), 97 deletions(-) diff --git a/src/app/charts/chart/chart.component.ts b/src/app/charts/chart/chart.component.ts index a4ce30012..d18189054 100644 --- a/src/app/charts/chart/chart.component.ts +++ b/src/app/charts/chart/chart.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ViewChild, Input } from '@angular/core'; +import { Component, OnInit, ViewChild, Input, Type } from '@angular/core'; import Folder from '../../folder' import { FolderService } from 'src/app/services/folder.service'; import { DonutChartComponent } from '../donut-chart/donut-chart.component'; @@ -6,6 +6,7 @@ import { DeviceService } from 'src/app/services/device.service'; import Device from 'src/app/device'; import { StType } from '../../type'; import { FilterService } from 'src/app/services/filter.service'; +import { Observable } from 'rxjs'; export interface ChartItemState { @@ -27,12 +28,12 @@ export class ChartComponent implements OnInit { chartID: string; states: ChartItemState[] = []; - private service: any; + private observer: Observable; private activeChartState: ChartItemState; constructor( private folderService: FolderService, - private deviceServce: DeviceService, + private deviceService: DeviceService, private filterService: FilterService, ) { } @@ -60,19 +61,19 @@ export class ChartComponent implements OnInit { case StType.Folder: this.title = "Folders"; this.chartID = 'foldersChart'; - this.service = this.folderService; + this.observer = this.folderService.folderAdded$; break; case StType.Device: this.title = "Devices"; this.chartID = 'devicesChart'; - this.service = this.deviceServce; + this.observer = this.deviceService.deviceAdded$; break; } } ngAfterViewInit() { let totalCount: number = 0; - this.service.getEach().subscribe( + this.observer.subscribe( t => { // Count the number of folders and set chart totalCount++; diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts index 86f8b48f5..41d1fed61 100644 --- a/src/app/dashboard/dashboard.component.ts +++ b/src/app/dashboard/dashboard.component.ts @@ -14,6 +14,8 @@ import { MatProgressBar } from '@angular/material/progress-bar'; import { MessageService } from '../services/message.service'; import { MatDialog, MatDialogRef } from '@angular/material/dialog'; import { DialogComponent } from '../dialog/dialog.component'; +import { FolderService } from '../services/folder.service'; +import { DeviceService } from '../services/device.service'; @Component({ selector: 'app-dashboard', @@ -64,16 +66,21 @@ export class DashboardComponent implements OnInit, AfterViewInit { constructor( private systemConfigService: SystemConfigService, + private folderService: FolderService, + private deviceService: DeviceService, private progressService: ProgressService, private messageService: MessageService, public dialog: MatDialog ) { } ngOnInit() { + // Request data from Rest API this.systemConfigService.getSystemConfig().subscribe( - x => console.log('Observer got a next value: ' + x), - err => console.error('Observer got an error: ' + err), - () => console.log('Observer got a complete notification') + _ => { + // Request devices and folders for charts and lists + this.folderService.requestFolders(); + this.deviceService.requestDevices(); + } ); } diff --git a/src/app/lists/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts index e5e7e4964..52361cc0e 100644 --- a/src/app/lists/device-list/device-list.component.ts +++ b/src/app/lists/device-list/device-list.component.ts @@ -8,6 +8,7 @@ import { SystemConfigService } from '../../services/system-config.service'; import { FilterService } from 'src/app/services/filter.service'; import { StType } from 'src/app/type'; import { MatInput } from '@angular/material/input'; +import { DeviceService } from 'src/app/services/device.service'; @Component({ selector: 'app-device-list', @@ -22,10 +23,10 @@ export class DeviceListComponent implements AfterViewInit, OnInit, OnDestroy { dataSource: MatTableDataSource; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - displayedColumns = ['id', 'name', 'state']; + displayedColumns = ['id', 'name', 'state', 'folders']; constructor( - private systemConfigService: SystemConfigService, + private deviceService: DeviceService, private filterService: FilterService, private cdr: ChangeDetectorRef, ) { }; @@ -41,9 +42,19 @@ export class DeviceListComponent implements AfterViewInit, OnInit, OnDestroy { this.dataSource = new MatTableDataSource(); this.dataSource.data = []; - this.systemConfigService.getDevices().subscribe( - data => { - this.dataSource.data = data; + // Replace all data when requests are finished + this.deviceService.devicesUpdated$.subscribe( + devices => { + this.dataSource.data = devices; + } + ); + + // Add device as they come in + let devices: Device[] = []; + this.deviceService.deviceAdded$.subscribe( + device => { + devices.push(device); + this.dataSource.data = devices; } ); } diff --git a/src/app/lists/folder-list/folder-list.component.ts b/src/app/lists/folder-list/folder-list.component.ts index df4f79eb5..bf24be2d5 100644 --- a/src/app/lists/folder-list/folder-list.component.ts +++ b/src/app/lists/folder-list/folder-list.component.ts @@ -25,7 +25,7 @@ export class FolderListComponent implements AfterViewInit, OnInit, OnDestroy { displayedColumns = ['id', 'label', 'path', 'state']; constructor( - private systemConfigService: SystemConfigService, + private folderService: FolderService, private filterService: FilterService, private cdr: ChangeDetectorRef, ) { @@ -41,11 +41,21 @@ export class FolderListComponent implements AfterViewInit, OnInit, OnDestroy { this.dataSource = new MatTableDataSource(); this.dataSource.data = []; - this.systemConfigService.getFolders().subscribe( - data => { - this.dataSource.data = data; + // Replace all data when requests are finished + this.folderService.foldersUpdated$.subscribe( + folders => { + this.dataSource.data = folders; } ); + + // Add device as they come in + let folders: Folder[] = []; + this.folderService.folderAdded$.subscribe( + folder => { + folders.push(folder); + this.dataSource.data = folders; + } + );; } ngAfterViewInit() { diff --git a/src/app/services/device.service.ts b/src/app/services/device.service.ts index 0570502b7..f7170b00d 100644 --- a/src/app/services/device.service.ts +++ b/src/app/services/device.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import Device from '../device'; -import { Observable, Subscriber } from 'rxjs'; +import { Observable, Subscriber, ReplaySubject, Subject } from 'rxjs'; import { SystemConfigService } from './system-config.service'; import { SystemConnectionsService } from './system-connections.service'; import { DbCompletionService } from './db-completion.service'; @@ -15,7 +15,12 @@ import { StType } from '../type'; export class DeviceService { private devices: Device[]; private sysConns: SystemConnections; - thisDevice: Device; + private devicesSubject: ReplaySubject = new ReplaySubject(1); + devicesUpdated$ = this.devicesSubject.asObservable(); + private thisDevice: Device; + + private deviceAddedSource = new Subject(); + deviceAdded$ = this.deviceAddedSource.asObservable(); constructor( private systemConfigService: SystemConfigService, @@ -25,10 +30,12 @@ export class DeviceService { private progressService: ProgressService, ) { } - getDeviceStatusInOrder(observer: Subscriber, startIndex: number) { + getDeviceStatusInOrder(startIndex: number) { // Return if there aren't any device at the index if (startIndex >= (this.devices.length)) { - observer.complete(); + this.devicesSubject.next(this.devices); + // this.devicesSubject.complete(); + // this.deviceAddedSource.complete(); return; } const device: Device = this.devices[startIndex]; @@ -53,76 +60,73 @@ export class DeviceService { Device.recalcCompletion(device); device.stateType = Device.getStateType(device); device.state = Device.stateTypeToString(device.stateType); - observer.next(device); + this.deviceAddedSource.next(device); this.progressService.addToProgress(1); // recursively get the status of the next device - this.getDeviceStatusInOrder(observer, startIndex); + this.getDeviceStatusInOrder(startIndex); }); } /** * getEach() returns each device */ - getEach(): Observable { - const deviceObservable: Observable = new Observable((observer) => { - // TODO return devices if cached + requestDevices() { + this.systemConfigService.getDevices().subscribe( + devices => { + this.devices = devices; - this.systemConfigService.getDevices().subscribe( - devices => { - this.devices = devices; + // First check to see which device is local 'thisDevice' + this.systemStatusService.getSystemStatus().subscribe( + status => { + this.devices.forEach(device => { + if (device.deviceID === status.myID) { + // TODO Determine if it should ignore thisDevice + this.thisDevice = device; + } + }); - // First check to see which device is local 'thisDevice' - this.systemStatusService.getSystemStatus().subscribe( - status => { - this.devices.forEach(device => { - if (device.deviceID === status.myID) { - // TODO Determine if it should ignore thisDevice - this.thisDevice = device; - } - }); + // Check folder devices to see if the device is used + this.systemConfigService.getFolders().subscribe( + folders => { + // Loop through all folder devices to see if the device is used + this.devices.forEach(device => { + // Alloc array if needed + if (!device.folders) { + device.folders = []; + device.folderNames = []; + } - // Check folder devices to see if the device is used - this.systemConfigService.getFolders().subscribe( - folders => { - // Loop through all folder devices to see if the device is used - this.devices.forEach(device => { - // Alloc array if needed - if (!device.folders) { - device.folders = []; - } + folders.forEach(folder => { + folder.devices.forEach(fdevice => { + if (device.deviceID === fdevice.deviceID) { + // The device is used by a folder + device.used = true; - folders.forEach(folder => { - folder.devices.forEach(fdevice => { - if (device.deviceID === fdevice.deviceID) { - // The device is used by a folder - device.used = true; + // Add a reference to the folder to the device + device.folders.push(folder); - // Add a reference to the folder to the device - device.folders.push(folder); - } - }); + // Add string folder name + device.folderNames.push(folder.label); + } }); }); - - // See if the connection is connected or undefined - this.systemConnectionsService.getSystemConnections().subscribe( - c => { - this.sysConns = c; - - // Synchronously get the status of each device - this.getDeviceStatusInOrder(observer, 0); - } - ); }); - } - ) - }, - err => { console.log("getEach error!", err) }, - () => { console.log("getEach complete!") } - ); - }); - return deviceObservable + + // See if the connection is connected or undefined + this.systemConnectionsService.getSystemConnections().subscribe( + c => { + this.sysConns = c; + + // Synchronously get the status of each device + this.getDeviceStatusInOrder(0); + } + ); + }); + } + ) + } + ); } } diff --git a/src/app/services/folder.service.ts b/src/app/services/folder.service.ts index a41b46436..1bb9cc73b 100644 --- a/src/app/services/folder.service.ts +++ b/src/app/services/folder.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { SystemConfigService } from './system-config.service'; -import { Observable, Subscriber } from 'rxjs'; +import { Observable, Subscriber, Subject, ReplaySubject } from 'rxjs'; import Folder from '../folder'; import { DbStatusService } from './db-status.service'; import { ProgressService } from './progress.service'; @@ -12,6 +12,10 @@ import { StType } from '../type'; }) export class FolderService { private folders: Folder[]; + private foldersSubject: ReplaySubject = new ReplaySubject(1); + foldersUpdated$ = this.foldersSubject.asObservable(); + private folderAddedSource = new Subject(); + folderAdded$ = this.folderAddedSource.asObservable(); constructor( private systemConfigService: SystemConfigService, @@ -20,10 +24,11 @@ export class FolderService { private progressService: ProgressService, ) { } - getFolderStatusInOrder(observer: Subscriber, startIndex: number) { + getFolderStatusInOrder(startIndex: number) { // Return if there aren't any folders at the index if (startIndex >= (this.folders.length)) { - observer.complete(); + this.foldersSubject.next(this.folders); + // this.folderAddedSource.complete(); return; } const folder: Folder = this.folders[startIndex]; @@ -37,37 +42,31 @@ export class FolderService { folder.completion = c; folder.stateType = Folder.getStateType(folder); folder.state = Folder.stateTypeToString(folder.stateType); - observer.next(folder); + this.folderAddedSource.next(folder); this.progressService.addToProgress(1); // recursively get the status of the next folder - this.getFolderStatusInOrder(observer, startIndex); + this.getFolderStatusInOrder(startIndex); }); } ); } /** - * getEach() returns each folder and uses db status service to + * requestFolders() requests each folder and uses db status service to * set all their statuses and db completion service to find - * completion + * completion in order. Updating folderAdded$ and foldersUpdate$ + * observers */ - getEach(): Observable { - // TODO return this.folders if cached + requestFolders() { + this.systemConfigService.getFolders().subscribe( + folders => { + this.folders = folders; - const folderObservable: Observable = new Observable((observer) => { - this.systemConfigService.getFolders().subscribe( - folders => { - this.folders = folders; - - // Synchronously get the status of each folder - this.getFolderStatusInOrder(observer, 0); - }, - err => { console.log("getEach error!", err) }, - () => { console.log("getEach complete!") } - ); - }); - return folderObservable; + // Synchronously get the status of each folder + this.getFolderStatusInOrder(0); + } + ); } } \ No newline at end of file From 3b7c760ffd73a7313a7f0ccc981cc9fe1f93235d Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 10 Apr 2020 22:08:08 -0400 Subject: [PATCH 111/120] start of expandable rows for folder list --- .../folder-list/folder-list.component.html | 42 +++++++++---------- .../folder-list/folder-list.component.scss | 38 +++++++++++++++++ .../folder-list/folder-list.component.ts | 12 +++++- 3 files changed, 68 insertions(+), 24 deletions(-) diff --git a/src/app/lists/folder-list/folder-list.component.html b/src/app/lists/folder-list/folder-list.component.html index aeee70087..f715da319 100644 --- a/src/app/lists/folder-list/folder-list.component.html +++ b/src/app/lists/folder-list/folder-list.component.html @@ -2,33 +2,29 @@ Filter -
- - - - +
Id{{row.id}}
+ + + - - - - - - - - - - - - - - - - - + + + - + + +
{{column}} {{folder[column]}} Name{{row.label}}Path{{row.path}}State{{row.state}} +
+
+ Shared with: + {{device.name}} +
+
+
collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')), + ]), + ], }) export class FolderListComponent implements AfterViewInit, OnInit, OnDestroy { @ViewChild(MatPaginator) paginator: MatPaginator; @@ -23,6 +32,7 @@ export class FolderListComponent implements AfterViewInit, OnInit, OnDestroy { /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns = ['id', 'label', 'path', 'state']; + expandedFolder: Folder | null; constructor( private folderService: FolderService, From fbef856a97e6c1a26346acc408619db7804bf80d Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Fri, 10 Apr 2020 22:10:12 -0400 Subject: [PATCH 112/120] Remove unused columns --- src/app/lists/device-list/device-list.component.ts | 2 +- src/app/services/device.service.ts | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/app/lists/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts index 52361cc0e..5b53da4c9 100644 --- a/src/app/lists/device-list/device-list.component.ts +++ b/src/app/lists/device-list/device-list.component.ts @@ -23,7 +23,7 @@ export class DeviceListComponent implements AfterViewInit, OnInit, OnDestroy { dataSource: MatTableDataSource; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - displayedColumns = ['id', 'name', 'state', 'folders']; + displayedColumns = ['id', 'name', 'state']; constructor( private deviceService: DeviceService, diff --git a/src/app/services/device.service.ts b/src/app/services/device.service.ts index f7170b00d..a1c0d995f 100644 --- a/src/app/services/device.service.ts +++ b/src/app/services/device.service.ts @@ -95,7 +95,6 @@ export class DeviceService { // Alloc array if needed if (!device.folders) { device.folders = []; - device.folderNames = []; } folders.forEach(folder => { @@ -106,9 +105,6 @@ export class DeviceService { // Add a reference to the folder to the device device.folders.push(folder); - - // Add string folder name - device.folderNames.push(folder.label); } }); }); From 48efea99e58ac6193463e698075f592acc67c986 Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sat, 11 Apr 2020 22:49:45 -0400 Subject: [PATCH 113/120] add trim pipe --- src/app/app.module.ts | 2 ++ src/app/trim.pipe.spec.ts | 8 ++++++++ src/app/trim.pipe.ts | 12 ++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 src/app/trim.pipe.spec.ts create mode 100644 src/app/trim.pipe.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 84094dfd2..148b3ac2f 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -35,6 +35,7 @@ import { ChartComponent } from './charts/chart/chart.component'; import { FolderListComponent } from './lists/folder-list/folder-list.component'; import { DialogComponent } from './dialog/dialog.component'; import { CardComponent, CardTitleComponent, CardContentComponent } from './card/card.component'; +import { TrimPipe } from './trim.pipe'; @NgModule({ declarations: [ @@ -51,6 +52,7 @@ import { CardComponent, CardTitleComponent, CardContentComponent } from './card/ CardComponent, CardTitleComponent, CardContentComponent, + TrimPipe, ], imports: [ BrowserModule, diff --git a/src/app/trim.pipe.spec.ts b/src/app/trim.pipe.spec.ts new file mode 100644 index 000000000..200699000 --- /dev/null +++ b/src/app/trim.pipe.spec.ts @@ -0,0 +1,8 @@ +import { TrimPipe } from './trim.pipe'; + +describe('TrimPipe', () => { + it('create an instance', () => { + const pipe = new TrimPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/src/app/trim.pipe.ts b/src/app/trim.pipe.ts new file mode 100644 index 000000000..d922492cf --- /dev/null +++ b/src/app/trim.pipe.ts @@ -0,0 +1,12 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'trim' +}) +export class TrimPipe implements PipeTransform { + + transform(value: string, ...args: string[]): string { + return value.trim(); + } + +} From 7a9f317ee1c69022dd05625ab88e1e8fc1dcba2e Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sat, 11 Apr 2020 22:50:42 -0400 Subject: [PATCH 114/120] enable expandable rows for devices list --- .../device-list/device-list.component.html | 35 ++++++++------- .../device-list/device-list.component.scss | 44 +++++++++++++++++-- .../device-list/device-list.component.ts | 13 +++++- .../folder-list/folder-list.component.scss | 10 ++--- .../folder-list/folder-list.component.ts | 8 +++- 5 files changed, 80 insertions(+), 30 deletions(-) diff --git a/src/app/lists/device-list/device-list.component.html b/src/app/lists/device-list/device-list.component.html index f831c6d45..822767592 100644 --- a/src/app/lists/device-list/device-list.component.html +++ b/src/app/lists/device-list/device-list.component.html @@ -2,27 +2,28 @@ Filter - - - - - +
Id{{row.deviceID}}
+ + + - - - - - - - - - - - + + - + + +
{{column}} {{device[column]}} Name{{row.name}}State{{row.state}} +
+
+ Folders: + {{folder.label | trim}} +
+
+
collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')), + ]), + ], }) export class DeviceListComponent implements AfterViewInit, OnInit, OnDestroy { @ViewChild(MatPaginator) paginator: MatPaginator; @@ -23,7 +31,8 @@ export class DeviceListComponent implements AfterViewInit, OnInit, OnDestroy { dataSource: MatTableDataSource; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - displayedColumns = ['id', 'name', 'state']; + displayedColumns = ['deviceID', 'name', 'state']; + expandedDevice: Device | null; constructor( private deviceService: DeviceService, diff --git a/src/app/lists/folder-list/folder-list.component.scss b/src/app/lists/folder-list/folder-list.component.scss index 658caf4a9..5521fe398 100644 --- a/src/app/lists/folder-list/folder-list.component.scss +++ b/src/app/lists/folder-list/folder-list.component.scss @@ -11,13 +11,15 @@ tr.detail-row { height: 0; } -tr.folder-row:not(.example-expanded-row):hover { +tr.folder-row:not(.expanded-row):hover { background: whitesmoke; } +/* tr.folder-row:not(.folder-row):active { background: #efefef; } +*/ .folder-row td { border-bottom-width: 0; @@ -32,15 +34,11 @@ tr.folder-row:not(.folder-row):active { padding-bottom: 16px; } -.device-name:not(:first-child) { - margin-left: -.3em; -} - // Hide empty name .device-name:empty { display: none; } -.device-name:not(:first-child):before { +.device-name:not(:last-child):after { content: ", "; } \ No newline at end of file diff --git a/src/app/lists/folder-list/folder-list.component.ts b/src/app/lists/folder-list/folder-list.component.ts index 0edab207f..a88f08c5a 100644 --- a/src/app/lists/folder-list/folder-list.component.ts +++ b/src/app/lists/folder-list/folder-list.component.ts @@ -31,7 +31,13 @@ export class FolderListComponent implements AfterViewInit, OnInit, OnDestroy { dataSource: MatTableDataSource; /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ - displayedColumns = ['id', 'label', 'path', 'state']; + displayedColumns = [ + "id", + "label", + "path", + "state" + ]; + expandedFolder: Folder | null; constructor( From 8b4a1f52d00bd03d96d7b12409e79f6d8481c17f Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Sun, 12 Apr 2020 21:56:01 -0400 Subject: [PATCH 115/120] update folder devices array for the "shared with" section in the folder list #CTR-2 --- src/app/services/folder.service.ts | 54 ++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/src/app/services/folder.service.ts b/src/app/services/folder.service.ts index 1bb9cc73b..d31683edd 100644 --- a/src/app/services/folder.service.ts +++ b/src/app/services/folder.service.ts @@ -6,6 +6,7 @@ import { DbStatusService } from './db-status.service'; import { ProgressService } from './progress.service'; import { DbCompletionService } from './db-completion.service'; import { StType } from '../type'; +import { DeviceService } from './device.service'; @Injectable({ providedIn: 'root' @@ -19,6 +20,7 @@ export class FolderService { constructor( private systemConfigService: SystemConfigService, + private deviceService: DeviceService, private dbStatusService: DbStatusService, private dbCompletionService: DbCompletionService, private progressService: ProgressService, @@ -33,24 +35,48 @@ export class FolderService { } const folder: Folder = this.folders[startIndex]; startIndex = startIndex + 1; - this.dbStatusService.getFolderStatus(folder.id).subscribe( - status => { - folder.status = status; - this.dbCompletionService.getCompletion(StType.Folder, folder.id).subscribe( - c => { - folder.completion = c; - folder.stateType = Folder.getStateType(folder); - folder.state = Folder.stateTypeToString(folder.stateType); + // Folder devices array only has deviceID + // and we want all the device info + this.systemConfigService.getDevices().subscribe( + devices => { + devices.forEach(device => { + // Update any device this folder + // has reference to + folder.devices.forEach((folderDevice, index) => { + if (folderDevice.deviceID === device.deviceID) { + console.log("find device match?", device.name) + folder.devices[index] = device; - this.folderAddedSource.next(folder); - this.progressService.addToProgress(1); - - // recursively get the status of the next folder - this.getFolderStatusInOrder(startIndex); + console.log("update?", folder.devices); + } }); + }); + + // Gather the folder information from the status and + // completion services + this.dbStatusService.getFolderStatus(folder.id).subscribe( + status => { + folder.status = status; + + this.dbCompletionService.getCompletion(StType.Folder, folder.id).subscribe( + c => { + folder.completion = c; + folder.stateType = Folder.getStateType(folder); + folder.state = Folder.stateTypeToString(folder.stateType); + + this.folderAddedSource.next(folder); + this.progressService.addToProgress(1); + + // Now that we have all the folder information + // recursively get the status of the next folder + this.getFolderStatusInOrder(startIndex); + }); + } + ); } - ); + ) + } /** From 9dd319f4dac8bbfb95807b54ab0fdc93e8ce039e Mon Sep 17 00:00:00 2001 From: Jesse Lucas Date: Tue, 14 Apr 2020 20:44:24 -0400 Subject: [PATCH 116/120] status-list: update styling, adding selected and hover states --- .../chart-item/chart-item.component.scss | 2 +- .../device-list/device-list.component.html | 8 +-- .../device-list/device-list.component.scss | 44 ------------ .../device-list/device-list.component.ts | 2 +- .../folder-list/folder-list.component.html | 10 +-- .../folder-list/folder-list.component.scss | 44 ------------ .../folder-list/folder-list.component.ts | 2 +- .../status-list/status-list.component.scss | 67 +++++++++++++++++++ src/styles.scss | 2 +- 9 files changed, 80 insertions(+), 101 deletions(-) delete mode 100644 src/app/lists/device-list/device-list.component.scss delete mode 100644 src/app/lists/folder-list/folder-list.component.scss diff --git a/src/app/charts/chart-item/chart-item.component.scss b/src/app/charts/chart-item/chart-item.component.scss index 4444b2f38..4a7d9a572 100644 --- a/src/app/charts/chart-item/chart-item.component.scss +++ b/src/app/charts/chart-item/chart-item.component.scss @@ -10,7 +10,7 @@ color: #303030; } .selected a { - color: #000000; + color: #303030; text-decoration: none; } diff --git a/src/app/lists/device-list/device-list.component.html b/src/app/lists/device-list/device-list.component.html index 822767592..a27202588 100644 --- a/src/app/lists/device-list/device-list.component.html +++ b/src/app/lists/device-list/device-list.component.html @@ -9,17 +9,17 @@ -
-
+
+
Folders: - {{folder.label | trim}} + {{folder.label | trim}}
- diff --git a/src/app/lists/device-list/device-list.component.scss b/src/app/lists/device-list/device-list.component.scss deleted file mode 100644 index 63b82ff7f..000000000 --- a/src/app/lists/device-list/device-list.component.scss +++ /dev/null @@ -1,44 +0,0 @@ -.full-width-table { - width: 100%; -} - -.mat-form-field { - font-size: 14px; - width: 100%; -} - -tr.detail-row { - height: 0; -} - -tr.device-row:not(.expanded-row):hover { - background: whitesmoke; -} - -/* -tr.device-row:not(.device-row):active { - background: #efefef; -} -*/ - -.device-row td { - border-bottom-width: 0; -} - -.device-detail { - overflow: hidden; - display: flex; -} - -.device-folders { - padding-bottom: 16px; -} - -// Hide empty name -.folder-name:empty { - display: none; -} - -.folder-name:not(:last-child):after { - content: ", "; -} \ No newline at end of file diff --git a/src/app/lists/device-list/device-list.component.ts b/src/app/lists/device-list/device-list.component.ts index 3cf3c8bc0..3333b01a9 100644 --- a/src/app/lists/device-list/device-list.component.ts +++ b/src/app/lists/device-list/device-list.component.ts @@ -14,7 +14,7 @@ import { trigger, state, style, transition, animate } from '@angular/animations' @Component({ selector: 'app-device-list', templateUrl: './device-list.component.html', - styleUrls: ['./device-list.component.scss'], + styleUrls: ['../status-list/status-list.component.scss'], animations: [ trigger('detailExpand', [ state('collapsed', style({ height: '0px', minHeight: '0' })), diff --git a/src/app/lists/folder-list/folder-list.component.html b/src/app/lists/folder-list/folder-list.component.html index f715da319..90b16c28f 100644 --- a/src/app/lists/folder-list/folder-list.component.html +++ b/src/app/lists/folder-list/folder-list.component.html @@ -10,18 +10,18 @@ -
-
+
+
Shared with: - {{device.name}} + {{device.name}}
- diff --git a/src/app/lists/folder-list/folder-list.component.scss b/src/app/lists/folder-list/folder-list.component.scss deleted file mode 100644 index 5521fe398..000000000 --- a/src/app/lists/folder-list/folder-list.component.scss +++ /dev/null @@ -1,44 +0,0 @@ -.full-width-table { - width: 100%; -} - -.mat-form-field { - font-size: 14px; - width: 100%; -} - -tr.detail-row { - height: 0; -} - -tr.folder-row:not(.expanded-row):hover { - background: whitesmoke; -} - -/* -tr.folder-row:not(.folder-row):active { - background: #efefef; -} -*/ - -.folder-row td { - border-bottom-width: 0; -} - -.folder-detail { - overflow: hidden; - display: flex; -} - -.folder-devices { - padding-bottom: 16px; -} - -// Hide empty name -.device-name:empty { - display: none; -} - -.device-name:not(:last-child):after { - content: ", "; -} \ No newline at end of file diff --git a/src/app/lists/folder-list/folder-list.component.ts b/src/app/lists/folder-list/folder-list.component.ts index a88f08c5a..357108281 100644 --- a/src/app/lists/folder-list/folder-list.component.ts +++ b/src/app/lists/folder-list/folder-list.component.ts @@ -14,7 +14,7 @@ import { trigger, state, style, transition, animate } from '@angular/animations' @Component({ selector: 'app-folder-list', templateUrl: './folder-list.component.html', - styleUrls: ['./folder-list.component.scss'], + styleUrls: ['../status-list/status-list.component.scss'], animations: [ trigger('detailExpand', [ state('collapsed', style({ height: '0px', minHeight: '0' })), diff --git a/src/app/lists/status-list/status-list.component.scss b/src/app/lists/status-list/status-list.component.scss index e258cb9be..61d04678d 100644 --- a/src/app/lists/status-list/status-list.component.scss +++ b/src/app/lists/status-list/status-list.component.scss @@ -1,3 +1,70 @@ .status-list .tui-card-toggle { padding: 16px 16px 0 16px; +} + +.full-width-table { + width: 100%; +} + +.mat-form-field { + font-size: 14px; + width: 100%; +} + +tr.detail-row { + height: 0; +} + +tr.table-row:not(.expanded-row):hover { + background: whitesmoke; + color: #303030; +} + +tr.table-row:not(.expanded-row):active { + background: #DDDDDD; + color: #303030; +} + +.expanded-row { + background: #DDDDDD; + color: #303030; +} + +.table-row td { + border-bottom-width: 0; +} + +.table-detail { + overflow: hidden; + display: flex; +} + +.detail-items { + padding: 16px; +} + +// Hide empty name +.item-name:empty { + display: none; +} + +.item-name:not(:last-child):after { + content: ", "; +} + +@media (prefers-color-scheme: dark) { + tr.table-row:not(.expanded-row):hover { + background: #212121; + color: white; + } + + tr.table-row:not(.expanded-row):active { + background: #212121; + color: white; + } + + .expanded-row { + background: #212121; + color: white; + } } \ No newline at end of file diff --git a/src/styles.scss b/src/styles.scss index 757f02480..15bed241b 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -3,6 +3,7 @@ @import '~@angular/material/theming'; @import './app/card/card.component.scss'; @import './app/charts/chart-item/chart-item.component.scss'; +@import './app/lists/status-list/status-list.component.scss'; // Custom typography @@ -81,7 +82,6 @@ $tech-ui-dark-theme: mat-dark-theme($tech-ui-primary, $tech-ui-accent, $tech-ui- @include angular-material-theme($tech-ui-theme); @include tui-card-theme($tech-ui-theme); @include chart-item-theme($tech-ui-theme); - html, body { height: 100%; From aea66ff25ae407c05d1af0faf976def7fdec64af Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Fri, 17 Apr 2020 09:11:01 +0200 Subject: [PATCH 117/120] v1.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ae358d42d..1d3428b94 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tech-ui", - "version": "0.0.0", + "version": "1.0.0", "scripts": { "ng": "ng", "start": "ng serve", From 777a30e870d374f33bad2f45133618db3a20a26d Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Fri, 17 Apr 2020 09:33:37 +0200 Subject: [PATCH 118/120] Add usage notes and screenshot --- README.md | 18 ++++++++++++++++++ screenshot.png | Bin 0 -> 752159 bytes 2 files changed, 18 insertions(+) create mode 100644 screenshot.png diff --git a/README.md b/README.md index 10add0acc..19b1398ce 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,23 @@ # Syncthing Tech UI +## Usage + +This is a very bare bones read-only GUI for viewing the status of large +setups. Download a [release +zip](https://github.com/kastelo/syncthing-tech-ui/releases) and unpack it +into the GUI override directory (assuming default Linux setup): + +``` +$ cd ~/.config/syncthing +$ mkdir -p gui/default +$ cd gui/default +$ unzip ~/tech-ui-v1.0.0.zip +``` + +Then load the GUI via http://localhost:8384/tech-ui/ or similar. You should see something like this: + +![Screenshot](screenshot.png) + ## Development server Run `npm run serve` for a dev server. Navigate to `http://localhost:4200/`. The diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..955ccd4c73f33ecf910e86275c4fe062b071d8fe GIT binary patch literal 752159 zcmeAS@N?(olHy`uVBq!ia0y~y;Lc)TU{By+V_;wqwu!T5VBor)>FgZf>Flf!P?VpR znUl)E;L$mCI(x|ENU`Jhzb|cX5$h;%dcT)-f{+up>jb_{D8sF# z6ya79;&Sk!pn!DJK{E}FvbhS27OYD;*f#4gllP37w!5ppJ=?SA{?486_f_BjzPI=v zV}r~&vCdBkr3{~1T_5e(pb+JiCB^%lWdS4OPYcFsGk2w=BgfnrkElK0f2%#3A?S>` zjL6P^f4~3FniVszg_&VWUx8Zqp_A@Am?h6!DisPctYGfApA$FH^hr#1p$NaD}C*3|x5V5u3-pQnRXer0<;vYGB zhtvhOoj&g5rmT7PTgyl3uj znLoki3(NB+sAb4*sQj^y8_mt|v}gZZ!+5Y_ojR zal@01Nr3l8gLCj~6^5>g&)p)u2HY;(N1Af#1bZ9rn9233KC!rUIc9F`T*iPqcRQ~? zlr8<^=XB+C@IFy(#t+#OPCq@qyk=rEgG^hS4 z2n>*!!jO-2wI{JbPRB9nhG;l6|mk zgX$ZW%ZY37c zNsE#KGFRwKk=QB`+PKQ?>f%`eZ&ⅅ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 bnc5%$AQX8Yf8!^%`_xI(M2(&vS$-c6j^DcgG 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

  • =m{rd1uYxyr9Qn_ThvZFA4KI+ple^}natCZlPR z+qLq}yp}s_SNz}m{au3fm$y#K#7_RKuQ@nx?(zD{g`56y=D*E7o^yY(tL3bss4Yor zV=d}-osC2zwhat_6BT6XQuk{9GY})`li@B!4+E`U3zr7*;ggi zqkPWA$KewMxvkTGZYpx?XuZGc*Ab2R`IqJTbQkS;Bihef|Hx(6w_MlSn$K}ZnWxEr zo$9~KrB~7)J0VTP7l3?eZQ0%bQBo8 z>z-VS(|1b0`mjf1{THTAQK2na54!vRM1)R`dBbXx{`9){kv4($6YKVVnG@Rl>s0hx zcbmNvr`!JBbiFpDzv9!&HM`~{p5Xi5dF%Rdmt6NG?bG@5S8cD3tK530)$Yg=50y7& zWv%{~ zwr(yyXSsaY{3)NGpWiN>zsFFv{9a|c^^*zCDPFJb|9#}I{`2wp<+|l_%QiXl+ip1| z*G_I9Gnc;+G758j<-MCC^)se$rScVRmdJZ_bCc4G#8(fMwG`7^j1Otarhl_}QTbrS zDmS^swq_qAk6sR~{qp2d&;E0-ylWpXwypc=T>CWCH(XUd?B=IAr`&CmUI<>4jQ>*U z`{vT~(p9gYnHYE#Hk?`(@iO)C8Q0=~6U}~xR=Zd6 z?E56tuJ5Eb<1E`)3=AWzX$H(U3WTc?bgqE_2<&|?$Y`hc0E6O`?GKPjIqA9X0dImE5M=EMF!pHAoA*-_|wOMA{^ayzygd=&y_t>6v(omw9@WmZ#0 z#{pAO#Ymg5i7PfPd@SfLW~E#`_v6Ef4^BtU2`xI9>3TlIxiH`IakIYNr|`OuIUk*m z%uQWC>r-Iuxi?d#-3JRa&8+xske6r?~c71Qu{eAMA35DoOw=}r>-@L z_4$|nwPi2g&TrvaeSe{?&4!?`wXylKx0ZE>Nd5WpV2bOvulx7JtP5EE&y}5TlkD%3 z9Ff~XM_J2#wu?VszviWv|8CxQIr(qzpFH_VHs{}_t!9}AwPx>0SZcpI=cLxZ3{wxE z%XtTqg3H&7FZ#CZp7EpTJ_eV^+UxghN;|MBbal?nO>HZG{EKcd{TuM_%X0gz|Nj0q z&%7_xrjV7-Ic2dMxqY(E6@L@mlV;hU{@ZB4`y!`G|a ze=c0E|0?U~vB}pT_vmW}$sU)S7+-j+W4_h~!G)rV3d)#|I8Q@`@d-96q{Jn36mt+n}-k9V7%u6}!M`Li4I<5q1yyzO=J;;Qm( zZ|}B;8daavvi|*Sd3ViH>5%L8$=mmRduMo8^wOiP_d2i3?@le6{O`G}#Q{FK;A$(g z>;HHAKi-#m=#a}TwUe(iXMHnLpLsrZ*RlHtqh8tv&*S9=R@z5bJX?(>Q>ahq;gZCmYK@#W2xZGWDpHjCHu z%7p#aH@G1De&yu-vm5{Qy~qr1d0+OiYpZ6ydA<5yoAldX(yN0v<^8?EDXey*^7-89 zQZKKpoZKsKU-#Plst>#4l{~gN2ITf0a?Ds>y?S+~UCt=*w`l#046b$&DM9~z?H*i= z0*l0}pd z&zjjR*58k}1;p>$C2aNR%MY`k8s=43r}Jz3+_-26E^CUupYDEZF8oR|Dt3=+{ZyYl z*SeF9zdgA-XTi$wtZ#dNFTXKAeoc8jzgO_4zr_tbZ~yDJrHV`cpLu0!xX#42fy*Sg z#8(Cd{tt}ZuQ7R(s4Dkyv8(?NtYa4P-0eU8&v)TJ`xgi7x0$%*|EEp&l~?bNy{}hx z^Y^_;CBHsioIP*TPQO22+p@3KUw^T#?3vu(C-)wGT^V`$?W5i4*S@@el5%(B@}58!sJU&=Ax;a;u&xZMB9_qtf=eNWFE&8ttF z_&4#G5grL*1>eK3TIjV#1S4wNt0pys`diY}9e9?@-vZ z`!<&M6|%+WGj{Jc`Y-j9dy@X*`00G#UJIA6eDUdi{@jeq;?_T}$Ik4D?emQj*!Vi; zw0dlf-Ana-dwx#Yt+=k&xcBmbx0CWqYdcOH5iiwv;F9-0-mo|N*CM_!lPm8pt~}Rw zyELI{)ydQSe(`Tq-roFnq(?PwUE$yRbN4M5cFWv0!TVk1Nx6AymvSHfvi|-$C*G!D z!ky?nc9z9EV~hNA7nS|qmdi7#_`cq+$5(1@wFL7ypRE0}x%;g+|Jl`&cP4S(ng8!^ zNd5JxOR^@_zTDur?YsfoWAUOxTi4&Xl@+#rcAib?7U3P&Z=3dCxqbJ%{aD*1zFi0RoI1F@V2kj4|NFc98w>R&Tv}hBPy%`4g{^8aQtTg2^G{5P5H>rRWzS2$;1rj?rV zp6^@pciz+$OQ4`biR)!SdUiON46{#xF>H|BH~|J!S){cf)I z|9R(1+sS9)b{6Z??!KDwaIe*kpX~f59?zctDmUN!YIpLZU#0SLp|ab2=a{nxR$p5a z$rf4p>dH#9k{1ED3y;fQp7l@f-T~d8PsJWB_nA3K?i@2a-xkMawxw6=wKpm`2Mcd~ zes*?xzs;u(-MBqB+z}=DsheXJl-#;*$rBNvGx5)l? zBJ~Pc&S!)JrJ2N^sGs`~r?_frL|dm>2e14@5!alcJ?GZgD78F{e|=E>{Q6%nLg$C> zT(Nl0noFCN79D=s!)O1}ay9?AAA$0+b%&a)1Xy?Ke-&L{^+QX4^_QQoUOj2HoxZ1T zUH->?R*Bur#_p!)pMKf&Rp|4dH(v$Lu~vS$^rgsx+vZvf%e)4axI)X5kzYmE+gW7$ z>+O~Kq%p7Nho*VmtLW;h&)57i*f^zKbhgBzF7@?Q2mES}ZY)xpU$jZ7E8X9wDq_ZA zF`bA4=9Wzp*0vw`E;lE)-#T%JfX0Q~uKqKexA)B2+xBHczRb?rod>VlrT(~)Jgvt1+ix>eU;ozIx#a)%M>V@k56R5llCU#GJ&35p~s$Gd#08pY`&qo`u7U|8Fjxq)}39Nd2L(DQ!DG= z(@q|%UOkO@4#S^#zn)yLXS%V;&wFNHI&tUf@`C@bj!b;&dDFtg^~%4SAC=$C_7j-* zBzS$ame0?9mpotHwSKjJ!m)|^=b~qRa=La;;^xBm<1PX3uI^lTY?@M5{qGkG{bJ_N zUzWLj%lD|1f+TbHz~7(SdA7LEIq+9qeb08cRVRO4-RNWfzw5u!p+iq~>)mUjr|+rW zQ2YO%Wxmv+vfA3cwQsZIH`o7t9e-8emLt3D6gBVicXz(%>j`|{`@Z)4GT+(PG~&AK z|NlIHYuVOWD|jvcMBo24&3Bf`%0u~IUR*5ucvSrMiHXYEUvxocGWeTdB1+nwD_a)V{-J@tM;W&S64i`ar*jp&l8O+>c)p69LV z-?L6z^-Dizd0Qx)c6+t<^$I>$lXdkE6BoZ(aB=VHhx@Cu`u_e|nCW}%{ev|h<7KT^ zy}5shck%?qTX`OB-!k&qdtRlzm$-V>?Z=ge*G?_1pPO4hf6tb{h~;IaWoJE=rG2MO zd;H(B@O#&OYsbA_d~%o1p0h4+Xx*l{=v&`k>sz0TYkyT~KVAI$+t%;z?`%#J5#DES zU$;v)`e^)YY5fPkdX?LMeEIrl{T5xK|7= zua~i#k*gf}>ix6L|EmiZKe^ajOKfW(3^`zG#@b^*i_$~T154p|i|NSWm z{C9Lq^!B{WMO*Xs9pha>e`IA@pzwC5Wzfjy{!f2To z{q^E%yTUgswi3XW#*S>mw3MM+r`@UX}_zJj;;Q7)PCQDWii)PFPSh-n0H;& z(&CqRfX)-mS|NcQKljUbN3~wAlJAavzHQm7_3M=voO}D^TcQ8iZ!2#UM}_>Kvz>oC|C>t=F8@w@bHB0v zzAtEAhpg zm#5#n{@+A9eCqdji<}92b0ZFa`LOAr`TgDbeYOTG4J$W?`2@SXwTaLEX8r5P>-?Wj zUS>r;zJL1p@$(zPUq$=>TX*hg<@<%PZ%)6Ln&K1PwIX(P|Fjn`Cf60;l!0jT*_yto zYVFDApedri_qo^3zOZ-Ut$dS3X8+$6;sdzQ@xh zZB>hLepdH=_x)JLi^}~rN#ZdDj*-`Qm*@X}lWw04s`N`=UOGBWH#$vN-EYhDdDZ9q zY`f8LnVRL?FtGmlWOD9<1C3?h@0Q=T{eCC7ukp;@=kuzko!7m| z61ba!Vz-9n*O!;di@q7{*L6A2#1r9ju&w0yOi?=>ew(n8H>sa{_#ZaD0ukw^)*4UOsP^03!_^V*&rRL0{Nd4_)Xc7L@pE(T zUi!8Co#_p~+shM!J~#)9-Bc~#|Ky`;&Y#ceuPW;PYxl_|?)92HGdNlI&&MZco|c`o zHI9A}`|{e^j}^~ny!-Y}cGv9__k8_tmE~=oYn)fKnDc0gb^(GZ_V!EHn4G2-w8yfQZ94y>q~Koc-v5UV z?YSiK{JxFReYJCufueyj`(Fm{c%7g*eM$WEZP$)3cX(cOcJb%8+m?$zT{Y{spWnOs z(+z%^RzFUEU7hu9<$=d#Z&R1Qz3YB_%RVueT(z~vsk7r7ZUp#m_4qxx*6DwG{`_hC z7Ivj=X5L?LKws+1>s#mM&3*m;#KyRd%RXA4a(dJ2b|vl9*X#TLeJwe9xBULyx*vz- zpIzTN=Y>t$8HwLV_3Hw+t&iJ#>zv*1H!d&SZf?(y-~H*7_S*RUb*b~8nOO!(?{DU} zy8*fpFzWX=-un7^<@YMh5)ZXZY5TkJxZLfSQ*PV#)Gup%e&oH|xpfU2{+;x%Gn(0F z@rYyhheO=jcl7rEDUvqNi<$h5>p9u0ZgPY-VwOgWNr%&;^-c;; zAKq~|wd#xD#mJOkk1orfJvBGBB&oA$3QC<`%~AN{^s>4Y>*YShyy}&BQ;<|V$$Vc& zmBRX@kYk4xQ0<#l?{8mW-`Ha#_tNFT zwA2!er{1<_`ycrHRtR$|yW!gExyQGBG_IF450x)}aWU3<+tz%!t^lnztw(`Q4fBxCqWwm@=tMq!Ba8APK z?)GQ5f25oHyvo%(`%iiIt(m{S`5w6*Rky!(&AqzsR}Q%?lk0n}?=O>>`&G$XPXBCt z=JWf8dnf+4K3=liz#6BP+eu-l}W|@9UHC zx~*$Ul-?hoTd*%>>A$LpOC#>z+CMqA;Dp2Lrzsy|=FQrAM}5)xZK|uUsXBeTXXjWG zU;j5-Vdw3-4Y0#t^eXiY}HSF$1g@57f?_UoM%P^X|^0^C#w(-^-M>64^h2u~F*NmL*$VUd>st_q^Tj z8{7B)&Hewh`H^+Vxzl>P&*bfXyRGEU33t0Bo3#@avbM9W{lH7s0<{OdoeclCewVYY zn)7P=>?h}g>W}P<4ZU?(U-Ws%5d)5pb22{rl!6Q0BAy=SQtfQFHT$Ia;>Kci`|77D zt@YmeFRo7hw9;-*s7Gjoux6|)1yxF$I2a-RJ5=B6lXcv{i~=u4}VqIjai4q zb)!tm-bO|7+>GLw^Va2Us-30ze+8lDN#;*a^;-x2-f>r|V`t}zzth9J%DnUCv&xjx zrk~rz{i`%DFwf)qYlY0uk~@s1evr=$70_PtaFP&HdF-LG~9sRWO6te8iYB$#Y?AJG$ClIqs-+b4b7Z0!HD|g=Fsos}* zh-vrBcb@PH(uDW&NS|yvoB+7?XPVscdpv=|GhHX@|VX_Tl4cu zgT8O|d$(>HH@|GkZ{B>LY59FC?jBe7tAA|koRjdK?b6mybr1WE-&oFH5#zn@_q~Og zM%!}gD_@5G{>Z$w^R8{J(zpJ(H}0-o{I4n~WaGY|{g?h2Z&e@#zl8^WK zYBsO98!bWI{B5hc)E*ehcf$5(~DN`&A(5V-x)ez;_CO@$Pc0QPY$=o*zB}7 zD+-WL(|8{B@6^(%GIRe(2FJ(OuU)SgE!bH9|8Pq5nJstToK3UI{QdoJ`)&5JT!k$C zh<&&6eqPV1F1eL7J7)i#D6_yYF0<`f2y_XE$yfpTYE|et)jZ-^<@+la{};-4XNV;7RVclXk~xoqM^;&oo_V zhxy9i@jv$oW=0iTW+H5Sn-(@bh%gy-t7ME^q_s!Qcj|_Inwb>ul%(3plGLDBg^lj5t^uD|t zxbEBD-_LF^PtNks`gg*vw$`cibmyO^OMG+Uycdf#`Ra$@F?|se z)yv}RxBdTdc+0H&|D`)u>`gk#W&P{L;@M3Lm&ql4yI1{wZccb?=~TxJZf!i0N!R0U z@2a2j%;l~1yB&wE%AeU61#0g9^Hl%suGj0lPbp-DCkZbncO}C##Q>$O`LFH;|7~2s zdw&YMou-SD$C(dNmW%Z_atJRDw93f15wUTz_<1q;mk}p5<8!Vy`5La$Kc{2n8K-@| zb8f{e)k9=mV7Vy62p za(XpBIa$1Md7w-6&kGxBwsJ8XIQ94fH_!cL7D-c__c1JrS@Y>*?$NjdC*4=awY)j9 zQGLH1+s{+#>l^#jzbl4WeLXEXQLg^mF7@Acrpw%spSa#mMWxcvY9&!1&4_paZu^hBr+r@qzovvpq&UR?SA z*{`gXxeq^W{bsJNa{u||sWbI>lGaWc_&{+<2xizn=!AD1qs+kT_&+xcVnB^2B9uHUu$+js1K>NLIF*}qzw%!LB0zrDHn z?IC~tj$g0N&fEX7H~+@J-|y$w?E5_T{f)Wh_hx>xe!pk)-zVz!nP%H=?NIHwb>9B} zp4vyk^F5aS6o0q--LBO)SKb#^^V#tEoVET>`N}5~%MP-Nhis|+`E>g29fgl4z3Wi! z+rX{AX9G1>T=`E&w^XA@gvHc%cH2HS@z5ov-(FZe)~}MTY6-2%Ii)%K(}L@E z@l$92dUQlm;rocZ*HB(*Ehe>X=UtWA66noSORlq-6gQE%~Z%l|J*__kCI(|FR}pEwB9J-xI9d zVll^$JOPbmi@%?lw%(!ctNE^dedQ0=pPv5L{p*(Xd(wY@>ds$vSpJ^*&384|I%ih( z`kjl5@0t1ShFRy6yO%w$@3q?gz4P+XS?Bgm-)FJ=?q4gb$m-yyavfLeD^;(4&+~fu zgQu2j+yDM=Tzork8#o7@fA@c?^0v*)ZeO*w7hV?L{AN18?`Mgk3Jz}J^_`zxWdF#k z?YFEe*_8WE{_E*$Hx6H(cGEd{`psawwL50n#IBCJz02&|<;QLj^YwncUi2aA*^_vV z?W$0Ytw4vda+ zz9MIyxG?s6MeSLa^!;ns?=4@>>u>x2(_G`6M{`7bi}pD9+smL6ZTc$k;=S{~rPw)Tpe9M>8uU|56u>O>CGIM#;H0SP8 z=YO2$^Ye=%-q+>Lt9^gZbKWWY%OeO=9ek=?b6{9mjS>bU*n^?QrIKV}GqUOQV~Q~ES2Iq9SP-$t9;b822S{42Zh z?XL9BKOgdoFD-eOb@=1%uSUz1mG{@B>;uh{bBQmT`~TOHiPskDHkeM+b-eO#hVWL! zb>ZIC?_VAZb`M`|{!+%}E!z(>@xb3P|JCk?KAxSkBIM0I9+%v_UmN>t&&1XJd|L8S zzwTpq*^h_q;tX3JJg@zJH+_0ck>{tBDAUQy{+jbg3q>Snfan@}8R~|LJ^Z zefz~ntQ zZYtl}EYyFZzv61TzmD0{W6OSZ9p`uK*XK9;*_ku*`7u5D`^zNWostz*uP)8M5qf$1 zTJhLjUnlYkGIge@Fm)YM{jo6pYMeN$#M6(tLO)L|n-f)dsaw$D#V3oa?(GF>=MTrp zi<-WO|NC(r1;AtpO1pnO{K0^Yb<>2ld$HDjqbZ{J*w+U+V9-+v8jF1-5EG=x`=)(rrCA z3us5!$29ey%z@I42|S5>MiMc>EOxpnGnxc~KLlQMULmL$*^*pyA+ed)gD;Fl{^iu} z(5jyY>O*V)gvwh_`kc5iQ2G4Ac_H&9UTOGkUHx^=$CE#gU)rejs(se3?sq371NE;Q zR137f`ZYEG>#C-;d}o-h*sPYid^BR~@pV;~HVPd+`Xl30g@b@+r2N#?lO}LmJ1AQk zJPC<=`#I*v^RjbQnQOWx_7%rW3(@+^ORn!oIX#)PHi)}8q>MAw`)#+wOXt^ zG_S8!O@z;NQe`!DEwUqqn{a!AYJwM(j{2rI?&8Yd8 z_7?ngtCnyY&@5{!ouQRexi~ys~q3f3=gMsusLS z&!3;>T(xDp@%Ojce|NoF-}=m0r>N-rOmpA7OD~t$R!RGB4S0V)e{Ry}X`ikKE&X$% z^VVIfD>rYN`|JHrRqOxEFPHJV|IMo8#iiZ?TW2f#Z!d`|UVLnJfJyl4XP4chZ}SRd ztp{&NDtQ`GGKbHSLZU(u$ zjsNpV+^p=)jVr=C3gnDZJQm9-7SFH!cJo+$;^N}x=Rh@kbibUf)}JOyiqcpGhWw+I z3Ibb~|5E-m=|uK~B@ecDrN4T!P36YXld1fP{42MG9~X~v^?Tc?UaxmWXCgyzZPr3% z`>Lzob7!iYiz}Yxq@uIq2|YncdD0 ziHp84Mrp(-w8bm3pF%jK4O zwVm_pkC#M0-oGYL7c@!tefPIp*>7L1UauEldcXF&@8yl{{POcoT=h9u_h#eqHwW3} zw|qWtf4}TTV*94`|36>$v;SKXy{jZM^83B-`>vn3xH;Ybb9{@}#_#v4^JiVNEqZcd z)BR~mS(k6GTs|+WTU_67>+X`5NzdmL_r2YCT+XcGL&9w9@^!W!j|i7t4Go|A{@~mh zM`CpyudH)ZIY-u%Ge^#E4ucch^Y8By*t-13VVB&F#tCjmU0XF&HVI^(n;QExog>kP zb>W7C(`7!juh*(ump}PIe?oHq`cE6&*URklZIYXtHEHtRPn+E%K03b;ufDhaOIN7= zoUQ6@RUK8y{&5rUd{AY(ms@9Fa^!{Jv=?7j$iG^#EI(Rb#$4?wFpEw=9?b`5W zS4+c1tqmXDuTRI-eV_k`0a_?cuVZZlKV|Hyo%Mmx^dffncUrVV%m#y zekFOqJ$v+cw=Uy+ucYg@?%1>WZ@>NBb<@26=E17+%z116-q>>V+vELy+g^5uFOdmp z>hN7_b}xNpNY;X|zw)yG!)|9LY)^T9JXiSH4gYuZpIrR+Q_NSjsO;zA?{@l@H7nj; z*`F%B|8!@qv(>UpXTP(oPG8FGYJcedwYu5I+_g14{qIGi{kOAzzij^eMpON!xhiCZ z^5ug5JNegE`+fR%_sW-c!|TQ$D`IpXTJLjcmLgA|2kgaz431+_00I1>pZjfru4qG+OTm^YiUuf4pA5&BXl* z8@ItkpV%Fz+P<%vGvRNVYF6_})$eDvsHb21XI5R3lPxZ5r%`+VkpJr~uB+ef|DT_B zHuL?DJ%XLLe0Kl4dA=^~@v+{|`}wo#uOE88>9pSFyJfe1k8iR2`DF69t?O&gK0Cku zFE>xozpLx(Qlpz!`2MYaxAVB(-Y-GXduP>$=ft(~N~eX#RW2=kd+Wnv^yGJzNVy1b?iVkY?e0Qu{;`Z~DiqRPn-_vBEzi?u0yb z)Gsovbp0$G7@7Vwbk4aOpX;VLmwgHl-aqHLw)MZt{#X81SHt7hp6a%@`s8^Y9ebuE^zn(Zv@y}kUd*Z^Av++D;S10vaeCt|nSN&>Zc@%%8mqMUrr zEAhEs_L)j7aTe2!Dmi>>>lTSkrh-52{LnPZedwjG@LT(nx!t02_1{0+%QvgF37cnq zy;gsA+iJNPLH~Y8oB8$SZ9d1@F>m{i`pom`PlKW+o%QTmb-ulc^HPOUL~&W_{dKZ$ zCbRc#U_SmOZ`=0hc?qk&U751b^lSUqcRAtngFIXIyyz2uGk>z!vR^CJ|4&TN`hM@& zI_u1yt@)Y}_ok}MU#1%ytj%&=Ztkl&Jo~RrTa)$gy{}sF|3A*kYjz(uQH?Kq^y$b= zZLKp8?j2RH)L(n*|ITv0E#*B~K6B1AZ)XXdT?Ol2?I}50cl@91+YN7b-RApi^{eDt zX{SNWe{Juaeg7{x=-m-DvRU$W@x5D@cZK>I{GV@sepCDMm;1L&bdQ>~Z13d;ziSr@ z>vqYnG)xxwp4% z752Bec+TQ+&#b)<*cyL7o1O0`=q^{eB(~rn>(UnyWaR(>4wh}9ptEJvvYcNeH)&ka z^;m51VU>JG;foIs1z%dJpV>Iwci%d#;?#>Lte(#tib=a=885!Dx;Gey|C`l`61U)jr#!Le(1*>4N$=GtOq!2Q6(_lB-ak5@F@Htv z+qPvLlMJ40b$uYte}3!k`SDXuoR}~{^6Q^YX7^hkt4-`(XRe#JHZD88cW%PxX=}cn zys_>=^syK7TY|TG%X`m?pDR6c4h$;sZn zxmx@Bjg!B5HZr??*V?@Rubqo~wpxN3s;PcT_V4*GO9`%@{d%qC?E~-LzIA^uKkdZzo$z8LA5RNk30s@pow)ba&uw29HGwuW2kaMj&$Pt z6Djyfb9q*AnC;UE{pX%6uy?7x8t!*)?qA7=lO5Kto+sy(aAKP4gZaVJZ!G<8%y^yi z#6MOC=d@RE&HHX%{3dsA@yWDnYohbxCI2t-pA$F1j;B_xvmy46hVT5eO=gweU$U2_ zhr3jCelaz>qHkwn=U!WsW9$Et+gI|$%hG#hi`wUwpU{xLvN%!ejq&DbH&W~8rs$uI zo>mhT^#54@yNS!nULV?SZ+g70;(dz!w61F_>My(*^Pbn;F5U6Z2`vnT&`FWdT=|DHi&y|>`jm!fadbUpKC<^Sct}SC}TcUgnFpPI`^tH=&mw z0{L=2C7vx_A^uYF(Y? zM#Z~7Jy`zhmqEwDbuz1(WrIxqb^JOaez9v_yS3siZ9dt3RX5k%(q>OTx^dBRyZw6u z=CVs$9sOm-X*pws?U~M7<}87`8B(+V#q2HHJGbs}w_nZE(x2JBId83AUs>22Tl0i( z+x-*sOmF{w-Tn33R_k~l!_FpN%iRf8zoVXf+IhKC4?j)DoUwhv_RsHsO|M|Nao611Tbq^{s=bl&mbIv1q z=FW<(wa3)Uw@=}*JF#*9qh{Xw_h-*t!Mo`HoK08s_U8L_8>&2G-u-3M^XKbUSoT_X z+)@w`B5$BuL4adVoxq8XTa)*`7X5d?+%@5=<7r|0aH}sIE_;vs`8-vkCel^v%Dqrg zvo}v%9<0mq*ZUYd)%mOIj$r>Ir`kiSvby+Zzdw1nd4*cxlhE2XtIliHKMl0~@os3s=Kpu((RsPu4vO|JSq#Vf_GcAM zySH7_Y`=KfSCzf59{9_?3~m4Qidp)fz{-`%PUic5tl0PERqX0ltNDITxxfAC?*-wt zFQ+DrM{kgg*`Uo^_&Xcud_672<(tG9pUL99)RjwpSd&$q3{ zwO=W(^v#X0?r!#<^Y5#tGH=l5wiIvStuLSdtkizXrJn5{d7?gZ(Nm*K_oZ3BJhZho zkuLc>nfuKzbup9IlcnqbEfl=Ay`^4YD|gDg(o0|a|CwD++j~lXyQyyO>svQoR)634 z{p}rN-&xOZuMyjK7_>t!?6@V_g$W1Cwm_C!+j6sQtG}fz`X*BUsq>a)AYY&6pRkUs zH;G)E9x=Zc+56_jjmL+X4LxnblLU?mx!WwNn$vmO)$(Kd`d>dD=+DzFbFs8oUAHb= z{>VzZvX;%CUhw@`&G&WVYPRfi_TQ2%**{j=eOhoiHv4LM@#~hB*;-j$-4~a{NmO24 z<1n$m;Xr)#AJ#sHiG896=l$Niew}}g?uHMc`9JSn)zq)7=umBsoAhPPPuo8;SoVI} zD0I3j!FfgZhEvPprcA%{W+lI5^w*`w-Fp7aTw!}hJ*&UB^H$#xGX;LX$fW82O4FoT z_TF=kSJyJVys>-k{-0)MTgugUKl^f5d)ME~#h>5KF5f%jjjG?~+ui4v^!mSui~sei z@}uW$wY=g_X9Tv-Tr`)d`@CK5>=pB4Y(1k+PXFUo8N2iLg?DB57AohK#M`ZRQac-; zXaDE4N_Ez;)xOv4AHQ{etNiat(Z{#?H<;I7*}cj|>-(RpU;S?_USFHB-LCS6+S}=C zqSE<&W3&9v#k_m+R@AIs^1n@HR8>h_y>u%WTJ^NUN%NZNE=+n*UFI)h7{sMVJ2E zZY%e_|8c{-KZ_5)>8_uXD6nUBYrM>khgU9Ac5u=Gvn~he=b2x@=gpbaPy4|fDA1T3 zHG$1r#KGQ~p*fxFr=;f;=lGA!ohu@~yxE!*tW&u(JyfQ}FlmGLaZB|{6PfwezWQzE zSt>W>Rcq+aEsxGOdn`Bo9v&C=Yk~Qz%k3rme4T36C9ikidGxg^gS1jKXiK)GgS6m0 zrxT9OS!(vH1H)n&cGpCHEvlW(BEZ-c`uE}V{W12-YSwV$<;1|E-KO{`zwZm;C*!Kl#3u2yIDwe>-=<$+1 z`_G)b$l-ey z5@(|}9eeiU%d?yNKFNNn`&FKs-n_T{-rUdoo1!Ld{Sf)$udQYB&gXG+@45cZdz+Kd z&u4a}^JsI;d6O4eGoLT{=<0hXyJ9^b+shrAGav80{;PW9;>m}qL+>&c{jySD9qw&? ze*MdPo6g4Ux%FdN*2%Kk*=oNg*R8w1cUsBo8`pM~U9cC*stkFhaP4#XnN_B**UaB9 zzOO&#+K#`A&3(6}{`2O(dZ>0rlpOi>C=1hie(*HR*F5!~oA+EXZ878snK0>yZL2|x z+@$Gm*4%h{TylSu;p&+65pRAtu6eX@T2a>g=cUD;j3`Me;f0I*SvaGzDTage&eQz(dl6>*`Q>rayMjQV(hHYMW;`$ zdsZq~ld9~tcLB3ai)~ZybVt9RE0+~Lao8E%b(MR`wpT0dtddxjKEA2+ymDM$J!iFC zUB{=D`-%jQFRrVSpU;*W<}jB z8DIBK7GCCS`#W6je5+lr_x9~}`J0D#l{}a#Zj^sg%R2o{@V0`ZufBZzP-rq?Z#Ta& z@1?TUC(gffxKyIX{WG!r^T*EW*wy=Lg5~Dl@SPWw@oIAa+dar#LIWDb7& z?0CB6$(^xEZ0jQ)*YDYLfxoYQ^;^R=?l=3-R&Mv%!fDsId*?6qzE^4gD=$3g+Hw7M z;#U7oyWh`F9#eUr)#&kOwXnOH(xtH9M=b?1xEMXIpFbO$xtr(7`rp$|+UoDg3jdd! z=lh)5t!(Rms~w-FyJT6l8BtOXa)RUgTiPY3cQCzg*r*XZiM(MxO|CXgGOLe)r3z zNm6B1U;lCa{olEI?fQe^YFYKqCIpJg{(HNWwd~`6yXXH{5`r8u@4L;PD(&r)vn<-U z(b~6FO^rWunVn>6*xIHwZ%u19$L`nrCg0w>Etaj^d)=Ritz~n!em;4;G%x<;<(mKh zJ~f%F{dwT+uPL=R?)*BU^ZVr9$+h8G9j||ETjaj|-}mY^YsRVPe|*(0x7~lE?$?7o zv&3)YSBUTaaKX_ucOegpSqsDD&HH~}zxnOOm#1Zytb$zMm+Uq%@Dayba!ad*wf!kM2v7IZh_=I9+=zSf~;2?Xpkgxt=E5?nhJk zW$%Ov&b9P@ep_YE(cP(`wLPo)`RrY4CyLj**hIbZINv3pz27Fx?CSZSdv1Jijkp@T zuDN)1U1)szQGxY!Qe*Qh-ZCjM!ToQlo z$m)Gbkx#p0zn(lAS!ZRORJuiY>w0d`;63lj_44zw>u2mx*lQ41q~!4Xw!cfN{bJ{R zAOFd|Z7|&1?fmk&Z~wV1tKZFkwEWQOj_)_G`S{xlwlS4=|Q}n8CK_w^>nd#^ch4 z15y7!|M~m-*$sO&ecf{FUH1p%vMS@}`-NWFbI2XmV`_9rh;~_!wdmWXp#DeO4tck(KGl`cn$GoKtWiK?|B?^# zM;v%`I=YU|tabFwd2nu**2@*@rxdL|7ETSXw0OMy*PF@>!p#N8^wrgpPJg|k+@4e# zAFiq>XI*)7^}1i}w|AeC&zis-$a^)=CjDlIy4&BCcF%joOgCKQ+~ly=M9Oss%USRB z&sLs{b9mLn(9E%+rr*AfNpAMJD~|;;ZU}r@$(GKz>{nN~ZO6q^t^I#GRn6xtV@@DOxp*Cq1_laBVEZ9j16 zY4)4@$M+^>Uvp@DRyxgY*_&RcUGMJi-5XnaD(~9v?zq~EhxO%VWL>v4*=wY+ac}HX z;Vp^T>%UKxsnJ`>bo-0s!lK^!!W(zb{H3|+Nq9}!yzBqNQ*zq6Cc-fNV-DclT^Y?Di^LxR^ z$r9DfF#jt5yZMtlu5W$xL$y)S_SWr$`dz>3uC30_d37k%tX%W|j@7z8hyGu?=$z9t zd9O1CvHaj`vx8Y+^`!E>cjPtdloY#7RO+<$gs>Dz9|@Ank(%}9_7Y`2+kcOaZBp-Z zH~c?;Z+Y+5FIN1Y_esX3d2~H_cwt&fmx$-dGS$<4kB@B2vGCL{V_KdOwfh{uchT%C zdlz_2G;s~w!uV^ky^zRWrrfA483J1zk9xm0VSE)g$-+-cz4x+8-`pdUWN&wA1Z^t) z98)o0G5yBZn%_3<+1t`iSf*PDouB!9>-EU&z1O$S%MUjDR`>Jd9_OvUf@UY$y}o?g zORnff(}{aAKW_f+;hhT z3xB>Ten|g+FkjFA&zJtJ=A8^UIg_e!Qzabu;fw_PVp`XOHFcu<4zyerLP$ z&rJItZ@GO>URSDr_uPK}pX>k62j@rqpI`Og_O$%Zx%UfnHSdSn6)*laTlP)-pKEiU z9zS-we=^6L=?A(W^S-TrqyOjEt(v{}Z>;|Lf8qPTzn-%1>-;}?qKg8PV21;Xl0YK| zG0gVP17FWD z*)INg=9C2DHqOGQ1-yYqsUY=uf@vG|%8&|uf&UG(t-{1P@;`{oN z%`^Y~)35(-KJEX%bi2*p7v8h^<(*ug^XEK=T&G#@&1AcMo<312=3mo3t9|XgX|ey` z_v8EDFMJyR>qB*1_@0xm^#6aFKHdIf{oh-!O1J*n-aGlf`TqYGpU!>%K>qw;)$6xb z{O$cdKjPmJe!C5K%1&QBA-Ar&{MLHA#`O4oJN`Vk|9teRxc&M44CMt6g@0UpZ?W~y ziS2J?Y&<8D5^aJV2d?)V`1ttv^tp5A_V+T|*dF8F&Hk|Wn%Rn*>8E=ZEdM^m*7)zT zUmM&rJ{G^dSMlY`noAD8dbb&8#wIK4JIyh@v0071>d)P3z4N{O*~Qku_xD_rS+)1q zt!HzdEtWH!BUsq4|7)jO+1KK^Z+~s>ol)D#`dxI((>IEN)rx#ar5=7-^O2cvvsv=h z?Bw&V=^9TQ(|dj|yw#i^_vnM`30Gm0LsIhRo%LL7vl*qE&&|5gp=$s2>&H3QWR~r< zx~9&aT_f>E_Eme<*0VdmE@b=Kky=~S;{W~d|ERz5&DOB> z{&Uz*-Ci#kwJ!6?zZ>QDJN{(vf4nf%{Qpns{bgxC&)2;QKD}9g@2*PbZO2Sca>#yu zcG&#hGF!3PV($X`x930J{X2d8R%!Ns-?d-u-&R($zU^cBTCUZsP@5SG$%k$#@Ex!Mm_w>1wKkd2p zSv_BU>Y`FX=AX^K#s6L0d|G&aK~-hqp4967pH9?n*SG%{`(6M3uXonpq-WI=oe{yY z|G`Xg!*91-sjdG%O6d1HaxdU@J!7VFS-0b?TGqE;3pcOqtqWz_yWz%H$~ni}{HTyCUTn-a_xmEYB;Oj5A_?RB-KJkV zH`-NSn|JZ^hVWXVkj>l8Ca-Os~W1{{zU$$oL zcH8s+j%;*iQO)?A`26a=dCfI1&Mcm1Yq{<9Lgx#{AGYgl75Q`KY2=#H-|KoUN}m;O z+n0Wz-#p7cX7RTLAIzrN|J}ZC$Db$a=X#E1-kM%{;PJ)YzE{`Xlug%OG4Z&ZbN2Y- zWcj*+pV!x4So8PkbA6rqPwVZr{@EJ;^X%E>8N4@AoHv?fES6q%{g`^n6enxD4brmm z^Rid&|M?^L(eB^?EmateeM5S{=LaR`Rl(o$9xMoC2gAZ zndAS={5{n_nfL$w_f%H>$8nR+1JTY8ZhjV@zTZM>+y7U~=f&Iom-)Z{+|}0e5A&-( zoO}BHpYV5``yUU?-TnV&QR#mjaO4nKq6&5#xIOzo-r{fW$29G&k9j9w*x(cW;LdXI z*8)wvfA1_mb+66&QG~I;H;(GhHwA2uZ(PR4Z2j-Ztv5NB=cI48Gv3It@mjR#sk2(sv~2<@m?*C-(flD_8Y&UgzJh-FE(`TbHT5 z@u8V(&foj9M(~yLtGO42vz@nnox3&oHb4Ky8_$gwFShHw#Xr}&{N2ZHamPt}Vmbd* z+yA`sDLekopKhJ?z5NGntvMU~)bkzJ`#WwQ5AXka_q6=qM)%Nov;SZ8>nnfG|Mx6? zdb;2KE#jx@IfS=YI-6(P8Enby|GMjLO-shTdlC0`{Hrp1Gu>PFzn`$4#{S-RPkHrihj$A39uIb2-17IS__2zQR}J^?+Vkhs(x+GE zZtp8RUG#s3q@y zlU}-}_VOS88?ny!+PC9LhxvcYg-|Z#FN}xi0hNxYD(a z`zmK_yvULICt{uD+VgTZ`xM3Pjuf*U`LpI?viq9FbN8Btx8Jo7zjXGSdF*~s*;u(l zG4C|bv9`RAYdH5q`f+RP!=pEoXS3esIrHmTLVj(j9mDIF$!m$55| zYlJcuJrlh#`+ID^Y5py_*o()@)4$#S{9@(P`~MGq*I)i_SJC75^Z)-muV0_nv)ujg zw_hh82scg0iy=s+DI@*c`*_9iZ?mu8x2*jA>G1xycTcG z>x{RNvS*uK$4P&SbT3vgV|&~7xkujWRnG0USDW@FeEXsNOxfJ(^+e{t<7@g$!`n}? z@BVxIM@8J99>w=HcCT-0uhHMwm42ap@AKre{xe^%=IZ?Zll`f-E%uooADg)Qo&2)d z`#-yWc--`A4^Nd<@bh)mMK9CizA?GC8$`>`-ghJIV*f9W>T5PWpKe90y=!&mne6Gk zzg`G@s_?75nmqgZwZL@WZ|ia|sZIZGs{b=$zRcr?Qd`+uofYhVzkELJ|C8nRyQ?qV zEswh#YCG@Uv%lBtTFm(W%q^cE@o(8t=Nj?dSV_Ir+j0 z-~Sr6>p6Pczueih{QcLdh8r&XukM{`7n1fnr?>ok&Y6gH|BmGF*F5`k%^|-wtvHZf z{>ZO$FHZD7Sf3Eyf6jQrHan|7DUPzg@}B>Dyz#Cz`@UzX-)cVh?5|rhb?3fawP#iK z#(n&7;A`S z;Qz-?xML_L_X^-=5K5^SXM=PnNe&?_H_? zZ~Z>T?!&v?)9(Lzu=jMi?XKdh<`wm+M^BsT$L!egXX5et!k<_5_hn4H+W2e#`)GgN z|F6F9dHt!O3^~+^ZR79JY<3*9HCZn|bqgw$<&ns<*kS zd2f~O+!b!OH{QF>r1J6#4;|YLWwL!wrH-%ZlXz_;-F|no!DRN0X2w;|Ebsk`&3Vz8 zytX3mb@KLg`<@xM?CNeSde7tc z?s&HU@3qIL@2cm=?t3S@U7!EWoQV57YIS%1JGOpa+`Q_aSD%*Ge*PPO(cquCeQDay z^>x2iJ~co0?%(tO83ysv=iDcMd;jymxlj3j&t=S5jjjV6n4(`s&yR$6)>feZUbw8AzDQ&lmNp^pJuP!3n z>UI12zgx`$&!4?;WHxvFw=+*1^X+P%NlO3YD%_kf|MmHwmXn_=xZVG0_xaZ52h|FS z2fub%TId{NyvjMx+Ur?={~Ta!kZ(>)DK<)WerEHcb*-HJC!;m}{jWF194%gT zTwd1lq^Y?_|JzjF+ds6feb>2i|Jp`%_08$UYvZf2#FigWl)4$u=hUR{V9z zzY_OTW|sZ`*XQdifBv}t^U^Pq{;DTTQi_%w9dT;6X zao&PW_5H76bC!va9P$E>vRv-f;-wPD`cvr*6R#?{T+wofxs4drCI+?Fw~rs_kGaM2_~-LqhjaOVl+`|xyrMph-FLAG z{}HuU8)I@`2)vndls!xL(+0O0S2us3^W;n7`JX2o4(tC-= z4==9xTLBu8P@J;=-^%pq|359a-yS2AeN3A~-AAU+-@l>e)Ajk$|Na@D*Qe z`k$?}SNEHotLah8owf6LWyXbn3-1^G-*;|8F=_ox0dU(l-t)n===@mF@%8<@r-PIC z7_`}L7caa1W%{k+toxd_+e@S$Wjh;Hw?x{f-4c~tvvDH7<8dk5pOLdC&-@qtY4LZT zXPfP6H?KMA+Vg1E&0jY<(iJ|>jd|>^+w$w%i=^XecIUHd-(GS0@;PtwJ?k^3=7H>g zvOh7m)w|v>GmyDbSy9R)+$VnQo%82K&l1=as;(VTdZxf9y@=PoOYTM`)0_v zG421hbozArpV#YZO+5DR`6=+GPHNqkhf$@EUtV6aw~i++d`)%^L;SG`Yvey*>#JbuT9nuj+(pHBDRzo({hjpm-&h4~wo z-D5q)&KFr4zOw$k>~@{{AM1hO(!2ftg5H`K-o&vzt7CBLlSYG>?p=1zI` zWHYnZ(Z_e4JED2d{k|o?-L=HD2mShwcHUTRetwVoxnkkv{Mlb$-ATT^eZrHfR`1Hl zv=;WW2Xl17(rt5&{RqhLbK5gPJcX^V?ukpgyy2R&skP@*YKu3zuW7WmJn>$7?b*in zZ`RB2T>F0Z#$L%~p&!21-1uNV|M^itY0DMoXK%h4fAW6JxhD^#=cIbHw#dVTWG{q~hrcOKoi$KJrtB;TIA{^P}+Tg);(KM21masBDD)N9U$Vox4j ze%9V|;(EY3zuoeB_Zoc9mCAYlxxT~q!?X9trti-W`+vCq-rhg6_dmXS`ug7H{vsi8 z;)RDGQRAKmq8$^q2hKLnvNvYyz4c|b(F^sZt`pSKens6}yqr~FVQ+wJcFs1jP20|k z$tU%wF5h=!8|!StYunSsW*c3fRh*%Fn|%#-TthgB>ie;)2d!9m z?btcvtK{j^*P1RLzsbIEuEn({-w!WXZ&%D)(sQ#tqIBML+eLEq*X~XJ`o^2@UH^;M z>|N$r_7?D(_Lu$t_si$S{yV<^YwJ_)=RfjQ9uyk?EPT*xIBS{tt+V$Nqh_xOf4hP2 z@hiJ;Ch7TAoBQ7$74VNM+B2{FSizUsH!P3OD>6U)+HiHMW#Q?MPx$#*~RnD`qow_oz3N|PU_se&(wDH*UpRQZRUCJ{rb^Ve&3pvPi1f1 zK9I*_)%JDo^k0cluJUG|tCDRG#7~M@Ut!6Ada1;#v;DGrd(R&@$ew7H7y9Pk%)fy% z!{xKN&i$S+`}*&57kW3^nY|KvYpJ&V<~1U>AAg|58kZ#CFpLiU1yd)`?Ad$j?LTN?zMX%_`2Hc+m(g$lI&hT zPTsF)yl=C8;hV3C{(RrAO_#4*bNBW3x%oR}d_4Yyb+pgt=MZ2_`Yv=Pj=?tjyHkqW zh4VYl=JV}xNtb_hb3yOfU(cjh?d6xUJmbsv{l|mz^Qz8pRp%aw=(g#w`rBj9CZB!o z>z?LHi``$Z3U+5$8(w>FU;XXPas5~&8%r;iy5v2fzt!vhojx7^>&eWInlkdrQmZF^ z6@Gf0>vG1%d%4%*Volzj+fpGf|N8oen<)|hFReT4-gE4&_u*&lHMzfzEn<4V^51v6 zs`H#)tc|w~DS!4)E$YQZ@Tfu znclO%jy-N)aC~~BuYHk1ao(F>3CeA|&+$ILwQ=I%it|Px?85rB8(#QMnPAa#$Z_u$ zt3MZvcYj+HbIK-pXP4crGcS84^Se2`cxLg1!>YwLn=RWu{1R=s-hH-$o%r^V^|I{%;B+wA>w zG~R0Soch-C?EYo1F1r4`^<&8z-di191@s{4d^?B9z$y=p2 zNuNK*@$CBl#Dkyy%HN3mcQfC1Yt4h$@-^H3fjayhBo+<@$>6$e@#0g#$ro1iUP$oC z*F1Z*ghlDgJ^^K$cd{*RC~HoBgY%Uk^TapVeR=P$qVt{*Q`c*t;F+fE^k z|Jl(QvB}%#S*0cIkdU8cDaT=^`Fo+%s?ZayvKLP9w9R=|YWw_9{kF~O_m*WQU)eZ6 zd*gPy{3~uY_StV=J*$v3C=Sozsj0R89|pFaQR)y}8l^C}bns(eU%kb8a4->O>mZ@)UF*528Z8ZD>OR=1+9@94Tj zUMcBxrEfKD&okcrJGOp*^3T}&CGS7^*MB}&^h)o4pm8Bt%{TK&2i9)Cx9d*vd0TK7 zzkB!A7b{&~7%$y_)h^hYpXm$LEPIz<7nl8cF}hyo z`>Z38*~hQXOFZA7yKVCEm@DaP1E$;lTeHzv`Ndhw_2G|Gwx{2yC{jE!=>?7?jk9L}}2RwUMont5Rr}n~`8z)SU@0wTqX!U~f z8T~SKCsw>~XSYxJ_I=^R$rd^D{H3jOo}|BxJYJ-K%;IxFUQz~ld-22GTkmbFzrA@p zU2me^&Pa}$mp{X&?f-qH`1JYywzu^^c8X6c*6-~<`fhn!=T>=}nHNs%y%lzP1An{k zi67RpHr>2iclzVg+j4u7fA+E8-&phfaJl|_+oSurCy|NlCvt@GuY z&9g4MdtF|!cZCUqk-)Q^;olD3xU6+TA@8!8g_!e+h4z0}eS4nd{K0+0#$(rQ)?A#O ztP}3oe{R;3l-#;&9L9AV&yU*8kKVg+UhCfMq!sNIX4jsy@;2!kez|+@yR&bczS8oA;Ob$-*2vwzoYeQZDf;^&o{_f^h4o87PbQ{?;+9`@JgvtJ7vACIcP_HeWQ z#|yu?b~SCT+_8mSxWPE_M`1$Zg4wLr|2hoP7+$Pxjr~#VD?Rt?SD$m&j`z(tU%B|M ziSy+0I*A)=miAg)I~F|O^lLX793nVeXo~f2HsB7oyj0Y<$^$HZHQ{ z*X!!7d%t$hf4nBYU*D|NbnnJ1?jKw)?B2G{>ifB3yX5CL_r<(R@q4po?fIJmZ(m)E zyngd{^6l*r3HKX=8N?qM$OQ?QNL33;Pu}?Oc=U?5de3;CNu0jgXV3p|n_ zum1XR^SOw1me1@WUI{&}T+ujJ;&=Vp{JL-Voa2ipwEvnDYhQHs`)0ek;yKTc^qsZd zwC!HRyLg=)|4&?3KBK6?*LSAsTa1&e-RGyBSD!6qG5dYau1R{~>Id#RRmp}M)cPEK zQ@*+O_doym@WJz0dpauD9F9|D|96Jt=b6mhZ`X|5?cSX{_*3BeHFNdf*2gN|-`t!o zzq`b<+-VX?tr0{)b=dF0kB^T}pF7u=f2FSQ&hcf5QtmIqw>D0hDHkl&6L~q^$~^1# z?o&3$XF1!N)kfxbpS^M<_jr)}?yt|?a*J;nXYaAJ(BJsxqiclrs}F|kX0jXCA*(Tqpma;C}Ut z&3A2nMBe9TGrVy&QTC0A>*M|kzZ${xFFfyBc9`+W?z78DyZ$U8U&grV)#rTuoaYDI z&fVA;(<-wk@b|%sEB>bR-jdcJt3#o{lQAbetf}wk%j!zMv-7tg=mxHqSN?i`N2tJj@O-M`v$jlaM4qnQz}53iZ`>)YXT*`EvqvW48^UMFw2 z+x+j@M!BkMr`CMuyAhE*`|X;w2dmcEZ(|o0id|nIpzo!}uiuip+b)LfArH@=&ZF~9 z%N9f zmrJf&Z1#64m+i7I+i#U;-`BSLGI!DSzCKeso_o7;=WACAr2P)>bYF9P-j2vKp0d}j z9cQoqowHH-SwjBb$oG~Vo9)V4_Ezp;{&#KW`Ci$-cj|4nRaBC3d$s{@1Es1X=#A`*_^WIq-N-!u-FH`PbQBOig(B`sTB*0qZMI9#)tp zGsk)E=bHY+IM&%eXLP2zZBV@8I%8|4Sj~yk3BI+nHm+SSCvEuav)fzHN*z!E(dQctpcEPje3;quMxLEvZ#FsU5H%fZP zeLZvR=KZeNxnJ9}M2jvsXaDUjn|xm4lft~#$l1oFk{wphZ{GiGIC=W!!1={1q)&%- z%r9Ld`)u3#=?pm?+s?jYsNeg6(doO>iGz(cXZCzwa3+pn_r5cBcQ(ebb~Ge?tNC%3 zzdYx9%^8k;PrfV8KK$#)gyy|pBWF*KINv+(*R7ehyDi(Yu2$N;{yCxd;=28oCz}nb z%ZeX6FW$B^J$gdYG&t5qGFS&T(_Wu<+*CSq^D_;a!x_|4$+j)|O_ulY*n7-t? zw#*H0W9>M<-R<9%eq<>h+q{5T?vT{MV}})%*IhF?&Xcuc?M6F?tmyNW?bsay~cov**`}po;?u+^VCTw!+nE864wdFD8<^J>Q=J=AAG(foo zJbHG#*UlPLdrZ1@CFk+yfVEXszL}@C*^65LU1OHj|Mb;zIqB?2Z*HrK?KNFt{(JZG z=c0T6y*Qg(TT;AkW9;9nkMnCwjwsISmU{8k@%+4nxjNw+mwi{*o<95WMZx~NHES+v z&O0qN&-?ejw62)-6AquAaGH6Q`|+xMBI27ACHE%v7*}1l3;DKYC8v$!40ro)KMXDi zw)frQxfhlDCt_V$8cY0#g!c6w^gq;3WdpCWVq4c?j*Zz^fwHv+W@>W&hxg}}q z^K`-!^Y80!{%RP+zWe9Zh3f0SzFoYuuPQCYZh85v+-viHS9Ts2PyFVyxo=+d`Rv;7 z#{}M2o@vaB+kAifga=iv%@fn@OswQ5w3qnXmb}?%Gd<<34#S&d!y7=_D&UYMoBni6q%wy_2&1iZ`&?S_gcTocEhB}I zf9RH7Sjn50nW+!*|80yZee*WowcXxyjlawxIs4a}(-OAZRsUJBK4CU!&GW|3l^viZ z&ymsBKVQCGoyb$2f4pd|zujwz^Y?xo5q|u0&G~-^oF;Aes>zTMc_<_kx3_({TDD`A z;{gSx+1GzORF_WwIFN!mW`9B93BvW>l2(sPND zBM(paoc;CU!*aVt{a>HQTu~6SG(5IA{rtSzH8KABkll_K~%_@%e&3+JU9r!=0OuGar_)#i_q_0`Fd!s-0lhR;r^{nalPm2!s-b@=P z+xp??v%gpQul_sA{MP={SB^wOWtkIu8XWh?w2O;v=1>1NGx_8FeJg&RZH>)%;&|fV z0=9p@qRxNbApT(LyT-epd!Ei)psc>}+Wgv!n%B~|$(4QoRq2-V`RB8k7qaF3UzM%eY>)$tiRuO>zAdk^7V3mNH+V$ zr+wqt_~o$CWAFIYKaUl~UKZ|7Fh3_L{qIO*y-v7&$uWcI`*P8LSLEB39@(XKF6N2j zobAOAyA$RYFED0*&D_b!FS1A4g^&M{ssZOD?gjVvaZF%k)cJej=`Hq$_pIIseqJRm zWSqZZ8{57gFOKK<7Ht%>ss8+1V58y@#apqf)8AL+ox1mJv)bm;zZX_0xBYsu+0N|S znex7m7b+Hi6W$wGJ;8&#R<@uLY=}1bv6p}U$3yR~RxIASch$F>M#?W<+NPfO*}u~6 z+mTDjud8&f$HhFpczLrIv+2$ct}_Pxx=~MZroIF%oLI{4ukc;`&0g;DQ^OaUOOJ~r zZd1Hz7dCsv&DZVc{)PPtmHcuj>3X`(_p0QTj(ZB%Wb$qQel6_U%Z*m z@Y?Np>Gh9pC^rdh`MKfqv)uEJb|udO&)?hJ|1_?)mcug=VRs_joSYHR!4BV zes%imYPLTWi@zN<&En@GGYpbI9Z`Fubzg59#z{4|rB->pY~Ffv#=IaF>0dkjr`qma zQCzQ8-C_e-;;mSlw^#*Nczy=j&Ge zwGlU*(;xXehF^BynGu=x2o+q#cR9^`hq7CS*ZU3~dh{(X^netbdul(;LEX}Qiu zdsnRan7Bj!^wx>D{zc^cNSyz;SNhf7ifbl`(%tq=>$6`!POi=QcC7E|tmc0aN35=y z^BbF0rT5C8HeLSprt)pWCx_ZA&Na-KZ(8-HqjbyW?ay9q`2E~#*Uf*+vV~&SS8x>X zRM!_5*jLSH^*FyrT&ztzy+2nh$JpTY?B=~+ul{6Mv%G)fxhtO!JDlA)&F;mQL|@*| zy-&4n?6fy)`Sr`_aev=U!)dGgcV2wFdj8IL61&{17k^to*0`5Iqq1AV>)u=E-^caC z*VQe3KV|Q>jWN}MS1)$Inq?Py?cBHRLGE)u2gF_zKOJPX8bw8>84;Q5hGK$|7PyL zbK(d4xmSHQdQlntS_`{f>*x{x1Hq zN9oJtOU0+>?Yka+?0}#BTC=p@(Qh}K-m~3on7s3s@MhZ&Ge1W&@BKRStgCE|K-$+c z96trWud&t7K4QG#SpTmVA11SwzSuqYcmMIS^>X{3rOrG5P_F)Ogm!Ul>F-&dRePQI z_?TkkxA7OAd(V2MFmR#a?*ayOn`eYF`#&f5GvrZ;!1-D`K2dwjBY{?3n| z->h4E{$BCrlsvh#9J3f{|G4uFbAKH(+^jy|a;D(pNa6l@=2`X?&(6$LkFV|xA+J#A zI1s1^tt;By-liX`$mEf7%k)UQ;O})`)400YH~n_N`n_w97=BoIe5%E@GhcRHdg7a} zweiNrn{!^R!MSSefq&lX>bh62vh9jrSU*q5t$p-GvHyF5+Xl@m_8ZQ0^37^tF5=KX zJ?mj=M09)Qx7|V~9&YNg%uFcjwf|@*k`;X%v}>q(-A|ok(bI2k7HmILos_$6-sdx4 zpIfaFEtYPVldb-H!&u<8(e7i@e=8TueD&}7c;e;dt0Gv+r~5v#sd|zdJZJy%sGlh-hJ6 zC9GGix2jI(y6Nwqjm!-8Y-dkAOF7ndrt$)Jv~As!)ChU`>&ZL2o`>|?TNO>p&YK{2 z`?S=ykD+VcN3PhvHrd}V?fkPS+iJE-iEHwwLmwo@KC?bvk+CQ6cjvtodq2JOC$E|e zV)2`6mAd#__v55*Gm6~rHTl|WTBZF;l>D-BQS#bco$udXyohy;F}{4bYs0eb)93J9 z<1%B}`}J;c|DJ2PcQDmAg{%HtZ|_DzBI#t1acg z(#HiGk+|=Eyw=W~E&s~0{Hbywzr!;XQg7&6Pg{M)&dlm|ju*d{?=`M{H|A^c>bWHps&lRI%yN)D;pTBi4>KadtEpzoJss4F;zwVv? zD>3TrnPWNYZ@!P#_z>1HU3q%J$+w9YIXg{xPjiTep6}scnz1Hdp4q-AQ@H2({MY>3 zZ6DnJ+L<0OKSIu=_mYjk>=nn0wk~wuP%I|DV(W>+Qi);b?-ftF+;00^efig&@^&ve zoKK|IzPWb%m}SS_?diPgcRz3JxP)an(U--KvYj{m zU3uo0;pP5Q3BA2F99Gv}oIHPP&Y3UwC&}+kH=6(T-9e~_HK;7hGUE-hMV!;lOki! z`|I!e`0w8BhHXKLwEu&&-*s<~3ER#RExW(s@8ZX0=X*XrdZ+s~d+GiuiNY)YF1?kR zw#|L&&1G*l-pTG#n`iOnmr(xUhh=vR)^7Z=KWe_DV%odiTRo*`SFTBpO@Acve)0P` z?DDS-j6WO~{}}V;>g@D;!q0bhUT)u7Rr+q@+h~uXy@!_W(J^*XHe}ztF=Fo54U&(Y z7g|bwbc&lGY4K~Kux#Ct4QA87+D`s@_Nd%Owtr6)_UCUgW8b%Vf8CR9`|^*OrOgOC zc>QzY;rli7#NBhAEU?QzmsYP@Uu-$~@e>KyYM(nxSbi10P^E4VoHSc7KYay=Lu76T{2bPs!QZ zuIQ*;_aeeNIX!p2ZsDsLCs*ok%RQLZ^Y!h_qswk+cjui0-x>34(YC7O3z|=yH!Mt_ z(EPV%`o`Gzr+YHY)vaC?q$FpON~cS@_cL7 zZ)RvPJ-$%X{ z@~e;OZ*3#b?|bs#U&p?>1r>|GH9zjX<^RR)?bP$WAD>s%S?rp3V>VOX^d7A9WjDkd zU;iw8QI+()^n~v7*FXE-R3&ZiyJ&_jEL{|sPJgX&FSFga&_0HxPu_mtn>TN2Qs(@c zX&86IcJJQJUuOT>mRaTV($%$ngWGYr`fD6jEs?fn#aYJuRo6e~evSE$>dCKN(?4&B z=~{U2&y9<>fAGlE2&6p@JNj<^P5G&nUpFp$u!nzVW$;&?yArRH7wZ|$J8bh~mbd)3 z+s`kit+VXsz4pvVzUo@>nK|sUno-CLzYCn5(WOZL| zeeU7Z_ddTC1+THc-)way*k<cJ!4@;X(*sw#Yo3j*}l^4Whmvu>}(bffbT>lXE!6Gi%paU!U_i@V?BEX!-ij z72DoQ?FsyC3(9`qnhz=zwmkJZUmm@EFZ=PSCGHZz;oVqs;14O`9hdr@Ztr?)>%MQ& zyR~~xP2Hz{`&#b%mG!E3qbt`Hxne8NIb0Id3YNYpz{ml(X%hyZ$n!Ixz zXf0>untoYDxxHptXDn?de{HW^n?7gj_OEX~&ivhf)lj+E_u4fBbGv!1Rz@!C-y^oBZQUOi&V1aMFnN>ws)bRlF*g`{&m^44jJsZ}_b1)D z`cdvIGdJ1aJH@JBe|F0~@_F;Mb$NZ$8I8-29y@S-dvX8Ms{Gf{-JfSl%jRFHyPt98 zUxmE{kC1!Fw)t=O?7viX?X1VTW%FyJ+;IfPeo!KvP?i2EE_ZM4?e~)RPSpRd-dI_` z^y`}0pW}S(e{bo-8u}dv>NwBbpLurUtGOFvbNA-X{=CKR54;_*5L6Sy-PtQ>yOpCB zH1n07#lOyW`}Y;r}}@LD_g!_{TGw=J87-|8JYEWCBCgWdA@4f zBX|DZVd*V?bBhGvVLD4y$+fbH4ff+PVK;Qk)2ed^qY`uLb@n|;F|*HZxp^%7Tz9SA_Z#otuI=yJ@iXRH zn%VZ858uy$)~+0$F43-Y(c0#GO#O`S`f@p-6B!B|K5>Y5Gejo4Z>i=yXu&OAUlRWL zdcVz@+?aWP8@XkUe17=)R`q$~k2gAJKkR>dPxixce);RyzRNw?AeNmyEB>y*TibwZ z9A@Wz?UH8-rhWNw$Mje=Xs7=h_GZUN9VfpTm)0-+>9tF;{afU9D_q5zXyaS?hCAm! z?^*Wl+r7;z%Ihyw{d(S`a`=LLQHvgOwGS8~=?-_7*+uiiS6lfSC+!tIz` z|26y0JaIacJ*WE3=gKn+=l=S3^jz(}TOa42fARB5jDZu+E0A_H{;3owAne2xo>@pl`=ZN=I-~uvzE-l9F%mOYhJ(kyYX%GGv+te73K}xg%bRl98$e| zJ9>Z}~bCbma7Ab$;XKiqCydXWedZ zlKuE*d%x-PFMn=)xOjiv4NJe>>1qD9EvC(T<}fRo@2g|DP+9hO&HK-X{+~0Hlg+>K zZ->2xzzmr@rrYN){k7S=ujJ*WU(T0ozu(z>r&L@&+#h>|t@PoW%7;VT`a0+Be!scZ zQ2Xb{N9kK@-hR)RRA7I;cE8%(XV@D#haDcQ{`vP-;)6otc^|K=43?MvUYErqwe_X` z){|8_*Y5@Y3Y7gaJx-!|U+AA3x7WYUnZMfbjo|O7PQ_`qUuSfd=I4J1c>8r}B71#-ESvtL5&x8yA(IY_O}lwryWo&b^6S zzaA_4pLFoA`#!nEzMl&s(rv5tR`;DgGhIDw_H-w8j@oqjH=8F2*MB*dl%oPo&4>`dgF-uOV;M&S{`|C9ZSXLZxt_(gwEc&{r;l8d-q?f{uw*# zU)}O!_e$@t_gs#Bq4k3e0za~9_m@Rf-0^w-e{ot?;DS%u=^P>ojmx!f#+J>1XFSGZ#6UDp57Fm zE?0d1XKlmb+V_d)%053xueFyrl3?Cmy5X`&ul*y-kFIkr8t)K(bjzaT$FB`DV`n$- zEj;sL<@x=4H_T<1wn{!;BwF;r?Jc|e;%}2pv+@_nwC?}R@44 zEwJLjT}5oAXcuV~=NF>jZwzl`>rSyDrzBrXb_zbbQW`Et>ZK5M=vhWXe2PJC`!DbZotsl5K{#_0Kx^`9g7ZL?FaRkP=; z*?6|>+O-7R>+-joIXl;dTXcx4PHz`Kv@KR%uepGY4Ri{x)b4;2{>r8YHa^bx{r2j3 zQSaRMt#^%AZs+@VB`{z1RW)DEkINpuveLUg9zFi+mF@1$U)MU@eeQpHul7Q8{9em7 z{de2m2`B%Bj1XE{O0oR;*m3)ey~4(Ap1(nRqVD}XS1#AfUEYm76VC2BAin>{(Wh6# zwGR#Bs*kcvZQLa@CL04An~`qUGiPyxn}X zZ$|UpujzZAE1dgvL-53d`47lb#pu1}wR-FfdbRsQCPq5{6sbDwS7 zDn)aiC96%7JlGZ>o_Ot9K6G*28zceHCipy|@i@#D=(?!;3f$ON$BZGr!ACxyhYyefrII z>uIYQ1Ov{@ObyLtB8IgqtP-@$8%>hZ57`m%BGuO%w_!TIB{pn2lk4W6^N zXMV2F0No6Gx^9EjAM^KY*oPU+xf%C;u6ng{`8Bt<+IvH*^Ulq?e*Mt$_t)382H9cP z(mwM*@1MH22E~@A(w|pf`snsnUbg(t8wr!F%idYRn|seYZ+-RBbgAa;e<5$aY`(R^ zcG~LsRXJ-qH|I}}_;PK*y*KaY%?tnXYq5F%*NbO&9xMAA-oO9rMZxw8y{rY-*=?)a zwrz|#I_qBZoq4%^?(Q~apEtTKuh7e`(0luPmS)jjCq8{=J^mGPvaf#z#hhqM`O;;0 z?nUhHfSa3_seNEcl>2+*@nHvd8LKSg3e}AtlXu>lDOe+ze(iJRT7S9M(T8m}^1KeN zwwwI*dD@$Yo4D#aEF&JL+h*M{gfzG3)Hg`%dNM)igXKBnY^g1o*Xq7r4ZrU8_WS<- zf7`#b$zmPr1C398TIpY#m3w91*K5(@_m=n`HnTUoF=MZ7y!Pgw)uu@|zW=?o_0nnV z;}H)w2wP?*{YBR_mQtjWp(FuvU2a=y8ut@BKPv z^t$`*uO~_C=U3lb@%Kf>mAW(X3dig$kFeDAectoe>@Byrp3eP0XYbc^VCfsuUT!DbMKVf+kNr7Z`$YHwZ~SO%h)oRzxus(vHPoxI~m&pZ<}ZB z-%+hy9sSaKY4}ySi1c4RFZa8?u|4Xam@BVs_3g_RqYvi)Bi31c`?h`2;rUY6)cF$o z=YNef-Vidk|J*%m*1rDv^6g%Ow!PbvcV1JUU)qzNU;C)@ zW6ibn`UJ(3(W-VPd|d^ceCzKW4xYSKVXs1hK;zl$KOco{%)Vbq=HQifvdi8eKI3ce zcDde*&kniQC!Oq-H%@o#Sl(thPhNUsF^|=w52?q}YD<0u%U?YHt5`2fpnHzQkk<{P+=hLS~{+b6L;VX6B$y}r`2^3#(; z(pzg+o8@1-mv^D8e(i!^b#J3QpNeDcc^Ay!ytCr{bw10)q)$*(U zcC+8AfAU)JP?DR)gi6Nd3QInHoizD#Z;X#W+Fu*^c{ca%3n!W*(&6wATLjqTn^>b8O$d`}(=(#)sFdz5~6#>fWAcv{DkEb#KMrorO!Em#;T9*Sg%@b))3Wy?IgB-hJG- zeA>Q{zh{^7+9zLldHRf;;;9*&+RsU(y}q5i zTK?G)ixS0nhQn6KnnLal<~!^Woa<`WMc_pqor7BPOgEzY<}p<$`~ z&Y0f{ccR;Elj6QQB|YQ4dhLL?{NEXCJ@u|NrRUelE19)exa`jU`X=_g@6FqF*HX5v zlb0$z5-`8!+VNxaex5Uw1GQ`xfm$~0F*%o>Nv(N)kl%BU@9(MMaVrCVPq2U9CyzA+ zZP58Qq2zY%_Ov#qNY( zn6|mybse@@ppFA)eI87n|K~~3rza<$W?x)!_j|VaXZ7{F z-Jyds0?1*$*zti|&Hgfz6EbI`-|P#V?e@0b=Gf`v3&CFfnul_nH`T5&3*3C2f9~J4 zUsfBvXg#{_e8ju2$AX$G9!Ff3$$P(c>zeiUn|FRpR4DFWWBNQUrpBg!=W~mad)-nU zrYF}}NP!q1#*OQ$u>-)YmmHShjb!R37M z-_Bk8&hz7=+uQc+D{>-z4SOONo8@2LSMc!AFSob+wJ)6A9~_It+J$p@kf!>f)4wLk zvhdN7qTg?~uRnV$zSlhK``=qO0%!W|FJ!E9`;h+Nebu+GIyYKV|GwRQ{+s1}j@Zw} z%5zTsdb9St)Iz&O_atpMnx#bFkF?(U_k%!pt(~#etII3?Uf5auTyB4bpvuWawS>jr zY&Jj3ec4mzVRgoT`(~_(hvN*(wtA08`*%$~$j`@o-1qpML&)SCXFIZk|D{gr~m0KkKB44 zvp*Zoe>}$fHO?k`)`s4r@&~VP{rYjEomqAA@uIVi^*TwiuR-Th#fwSXPs{duz1e+R z@`+adk8>Ce?X$n!5PY4Ho`3dg;`j4YOE&-Yy*@jC@BJ%pd1Y-{cHR*_LhZBQWEfwz zFH!y=u-gf{-%SN~2->TB{d>!F;dxDLO%Rs{90K5!#i--{jSIB?y6*cT6W{Yr=d};z zoY$&d{$^|M(_7uE`r<;ae_6SyY}@{+RiB&&?{oP+j=GqDxziob&t62O zquG=d{!S=ikxRnWgH>ZPf7HHYU;J*hFP7Nnhh!L;%pd*Us@(AOL|h_xVOi6#SXlN~ zFzL-?XRib47U$RK$L`wF2kNNqEO>aR=-;28Po3p|T~OScdb|&7$G_viraK+-lb*f5 zns8>{`|H29;0QWbaL_G2@p8qTmp{Ne;rM!Qo$vX0N#e`AOB2p4m_KD-aN4(Tv(9Z> z7*`$Lnf$=HU%PP4%$KE0PtLvddr#@i-ox)AXPj(~m@R4hStkF#p4pcp z8^b=RZ~tm*U;5Q_zU7y>#T&NS75+7k#64~`@eXkT7n|yqBY`(3r<+I%{jnDshuwKBN zyR78e{LhO&%N%)OeLp>}TC9d&MP)~vA$z;4#R98`o1QOvb-XBc^L%*=h7ZXXdUE{I za!$-)-@D=JWB0hWuOAC-r>(B=`}$+Cvii-^Kgx&(VcBrO0ch|b<$9XPA@ z{`$QKoll4$Hw)lHZv`2gcRJo*=hN+({p7)Nzqy-0!@H@~K09sm4=$T8B5VA21JAFB ziyN<*O{=ah`La%F-OQJXt`V1Sd;76vvr0GJ`}J<6d)({I^FAkqZF{ zUZ7m(0UAqtK0h6MC_YpJS7mox`o6vFm$lw@r~H1cyzKTrcO>=%&fXVV74SBGY2%c{ z{cj@H8U4QTB4@Lv?Fy4f?H@_S$NYE>NzFDcoe-J6cIW%jb5Cz}9BiL=W9Lcf_#?&v zrzKtsHOJa!S7%2WfB4Gt=47@_)wgTk>t3~IZZ($PyfyQ-^P zGtp6w39&U+;z-!Eua@V}iKV^<^Xk{x-}%;%e_ef^V{KC91rx8&4mpeDPG4=~J9sX# zX2CTj{_K`W+v@Y4e)8Yu%%5}ZdEJi%%6y8`ziy0{mwvABtpE?fG5j{`<|^=6P$Gx~KTACAqsUnu$b72(qv; zMv4SFZrQ?mL}|x?p3^;#7R1#bEBtBvYK3tVcX!fuMwfy_!N8bfy@EGS1uas;U!bzwTNe_wA0~*)uQow?4nJFSsi2rTfwAZ7IKl zCBG&wk)PUaY4%C+#f-)3_Ql0Um+HOizPvkGb8UJ4G|QbGfpd(b!(4|{1|+}r~#j~h2uU$$9c zDZ$t=&vIjjWyj&RjKlnM3vXOdyl3$EV(~)v;~8^I?=H7o<-K0ayj0J=Bv&T8<M zWIOUXS{$&U0~W#(M?Y^Ze75n*ce~H7Z?#`pZoiU!{Y)izVclu9px@qGFQ3Wj*IMj* zyYv=pVO>Ap%YJ8fp1Kl9*)^-b^S)0*d(1Wiz)4?E*UCm$!21!H_MqN@6j|-SC%`$Y{cYlU$p3O zzr?d=oAy<2+P5=8`PzZ`GEcsDUwd|7``7FJcdmUuedAb2u=#+ISfurTX0T#E9N}A`dvmKK^ zF2K=<6&b1l{8=5>RI27 znYYuu=UBNFz3N^YzdRjUgJAHJ0Yy4V#YyJuGt=4wQf8FC$dcVFs{S0T?QGlkMBfK5ixPmYOoOU*{Z8~DU zzvkyBBSXWFO;u-fzwXL^w&UBmOZl&^FMDaYR9sZ{kc@2hpP9-p1l_*gIJ5Gs&5OC) z7w=q|@4sf}*+hSx!fV^r_PyG=)2#n@(D@Y-&HBYzm2B6{Hb^)3o&Gh?yVkUH5r21? zU2g1w`6`iXDlE)TFWhluw!C$f^!&zV{zDlt%V+#t{M9`*u6B*4#d+tveIa+9%#Z!L zvBJCOw*mjYXP4Sb|JQAqx%zB!^VXeb+UHeDUw(G*nXAt4-0RO`W51^7-`@7tD&FaV zjHEx)y~AZG`||Jadv|Mdy8p~sv$Q5po}7AlneXGu6K|}rXEP@S7Olp>Jsw%}S2NBm zowxq!`e$R2U!MRUQwHEdpTwAi{!h(`oFwp8eak(M)msJs?&ZOw(mP5 z=mtBBYGQL;*q@wpY47ZQ{oNWm{ocGUuFE6#+p?FgSiZyjwQ%x&J>`9C?F-j@P4wlv z*3(gauzzRv-(Q~vH!CQ9d?;XkKM%aPPEo>^q3YSX))O5I@*#`sw!;?Jg@@j?>riap zdE3*-P#4#I1}(1JrgiT2zS`egO+LFFn++<0zW+V_4p%Z_Q->xai~kjE zSPLKrjvn*IK%02!d?oMt@2{_|-Mwqxr)yPj*NKA6ZC;8Fwi}Jl+XF89j<>g#6m$PTF z-4}D?i!%GAXUEp@n+x>myEkXG|ovPx>mwrWT zUwiY};(eAK+wJ~6E6o3E`eV^I$*b@yjg}TY3uw?*@T^E}I|nOk>CT)m!YzWo2yUr#pLm9z}QgS9tB+_07kYzqJoL-m%4WX7u4ZKX!<}Iw7!k-`}qrbvvEGJDEj@6gb>6S%DxOcdj>Jo|dj+1C2(bl*L`myfMTzI!bx zw|3u(-W~PNZe88_(J0}`nj1Sle0_bV^w!+lzpf?KKXW@SzV-at-dop^f~#_($ue`} z+kDuIWdREfXod@%Q#x=&~m65tviQtu;^2Ft*00G~h^!P{{glUyS=r}6gQihi{< z``LvrSCqcYymUWn{z}^&-|lQm^Lwv(DgS-{{BN_)y_{3=X}gneb^P1&say1~{W`Mc zUz*Ih&Dp z^TGR>FL&pjZ`U`B+vM{8Y2B?~S8ev}*!WQSyZZ)5@Zz_bpv7+-2Q9dy>q|cWeC;mx z%uH|lzXPm%kN$lqeYf-W#ELgZwtjfMshsW4$HT{Wezj${Tyyl!tY_ijzI&xl$sByP z?_|1;@}Um7`Hx?fy8T`Bt#@C`iq|J*2z`*-rd&Mh!_IGSZU!$~w(QiCCn-0#WL};z z&j@Ea<7f3?Cb{$*twaR_d_UA%dmdGg#%=VsmKx5u|T~|Nvr#`2r>1tmoA@TYPI1xi4nnw}n^hEAJHeEcINfdbfOW z#`1l&8*}HcFZ*-bc9(tWHS_h0E8lKZo&RW_#KVNYWqGwpw<2C|x2kCqGPe!6Aam~7 z!wY#n41FyRkGHipt`mLpL-|k!NT=9XN$ZfhAOZ=Ga!Jo9adu}S6a*^OtT zZgnK**?gTD+`qH*^_KE?W&OE!H3E-59(-1Japn5UMKyc5B8SY%@2|_haX-uZ=DbwSD=l>f#FD z`jx)dN^gCgcd7rCYyHcRy)UAV_HX^WtMALIMdruuh5nA(D0q5SRnL)K+st>Ys@l8$ z#*P=|TkYzut-P$~ew*DpHt7z(=?3BC|Leb=J%6kCMK<53fcbl0yRZ9JbM5&0-s1T; zHdeYlySDoB!=p`y-QV>av@f_}ap_fLF-Pf-E$!-Iv)hFtUf=%3v97JGNq*yt-lGTR zSmzQQPYh0Ee(p^rZ`(eB_pa#`r-;~Vvbw58nO-)KVq@VSE z)$*;GGmZuR3e8nWU2=R1Tk^9nGq?5L`nJw!+s0=B{l4+f{w5il7XICM<#^uTZGpGv zd^;nR&-cw+C%Z=QS(jDKnMPmvV`lBu7q3@bKT>6vbaD5!>vw+WMfhxcz+yT5um*JKQ*K>;Lh1XvXRhVR{aN!qo+oL;?88p@t6tsazkTlH;ns-B7N4TzcYl@qYTp0#f^m4%-t+^{w_MKlp9=vZC{iee*B6|PT-TaT%^vfpZ%AIf6UwW%H+5P@E`Rl3r?PZ@Q zvd>MQyV~xfGbg9Gc3xNSCeM6{%DZdYLCeXkkIPqcyUHpz?fsg5FJ68@@xepa_ip{X z>fNVF?cEVY8~986-de8ODV*~xS!J3acsbdXXK^1C^~H-{UGB-P{d%M0;(YzA{1x$6 z_SwZ>S*LO==95z9nf!!p^0=Br2B5~%sn1&*KOQ&4)yO;pZe-3-j=Xd`ep^mt^y z<+gwC`X}yr)BEdc4$B)8W@lc{n{tsk z;rjH8v!j>KWe^PLdB?y1+p}w_)B6PvPXBWcx?pUZUGZn3*ZV*V#uitbyN8xqeNVT| zhb&^Ber@3>s=HA}+x`uP1;^QBJINAh1WDTrw72+I?l1z&$CSI`% zU(EB`CjNB%PF#i4QjY|Y^Vg>-Enix+Y^HuzeCYYjJL7hzpL1QW^>?L-%k63}eXXir zK3k2GuJ@bP6(98p-MjI|$Ho0qyQ7|!+6zZXt#-!} z+}HHayA|{6MtzRnmv8ddGsUy-e)GBF{6RfTdS|S$Qs3p(tbaT&9p#e#cA=-M{qnnK zwjBFzbrkBqXlOTZ-%x0LV�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

    h8d9h_?4HS5Ys+eCg% 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⁡4ccIYJ$J==hEw{G+_HSf>B`vg+Ccx1c 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β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 z zN{4Ne+^F|;OPAe^OX}0J6LcD5QfHt66i{;)ayB^s&EREz;MR z^|53pOY+)L&vSlZ3SzXOkCb>_Ie1~K6h>F(}r-b`C@ijDBI_R z=6;?0Ajjry2jhHE>ytOXtX+Kn-p-^;t39Jjx_;g+ozPy>wRNVv{LfumZfyJZ!|+<0 zp`pZOrE5*Hwa0ILJ$^V{Me&1A$I8cC#mw z7o45*vo}0sD_>1V;+wJ_-fy{kUkH4%ZtvgO(Y)ev-!zL~3CVt+7a!)|Tc}dJJ1$4$ z`8J)d*J~p;KRa?-@35`WIZy#{E?s{smThXpH3^@wf%f0AJ^wi+b@|+~s)&`(*A&Hs z@KtP_;P!CArRNh?Yl%-atc~iscFb^37{~P^j_g09@9D;bJrl58pX>ML;%s^AM+wd` z&t58j%iQQlU^iAS=ks&M?mU0jE?wa!EN(mNyOqAE}I}-4oT_8ZKM%in;B%~fmHmsEdUT&|nj&HL?#P`6lS?wQ-qavo2- zFY#lxeD&jq=z6}gEBCg(S+REyV%T)|Y_q>_R@k+sQ5y$kU4tVg>;9UFeS2$@ z{72RI_2Rz5+1(p|-VBu9SoiDP>g>Nq8>VeFI^MW;ck%SR*zG^hy4D_ZJKlHex~|Jx z;pj>E7hR7DG=7t51BH(P`Qh`70hEduo>WeGv?_dW*7m>OZaZIz1Jzbj*p`bmrgQBN zowrgZ#&SD!FUaq|*CW?Csv8^RL~ntd+Q|Zuhrr-Vd2yyW1A6 zdY#r|n|)xum}CB#ZSm@}D=iP>+6f}C?zf}Hs;?(*_SnwU+tbUaq5FHDr9aoVCm)^| z!ghl6Lw16w2p{I>FZ0NL@2RX-cP4Uv@rxPCcC|T~g0)|a`AUu1C(izJcf9oi3Hwx6zskI*af+LtNz416L=%|>_u|6 z%&!+KoA)`z*Xe9Kvc%M`wk7P5_E)3(*J9iDZv1)i;q_~&c~QyTyx-PI-pk!>m-F$X zfcF=;^>?HAF)(@Rrpj;{&N>?oX)j;is78F z%C&tnp-a_;Hba)G>#B!EM!Ok-HUH`9bUxjDG_esJI3Q+>CPmJ367(SEd^ zPkxPWAPuS_rB|GLKg0U%mdg{D9ufsL7x#xuDt#IDPO~P2|HsnlQ<(2*mGwM*ed|!D z>-zpXp_OaTJUl(4X3Gz&Y0@zvw(qoyWj@57?Vnrewf$H|<%TCmk5`>IXk+)O{%n5D zv31VT$pYhbie73{om|&y8*5e=7EPX~)rwhx_{DC{5 znV>t5_O9Hl3mIJ9Xr1+c^%dnziANeWp`1&$6!<7gTy9UlCA9VFx=Y*k9Sb-=XWN(G zu12PHki~zxfwyNArF}JL`}*j#M0Cr(MSRl92FrPKr4L7Kxq9Dl-#Y&IFMV50&9*6b zA9Ujjkm)?==qU3gR-sl*@5bAtU*e}D<`(wcJ@%bN?DM^oInR5W=l=Yg@Zj(s!!w6% zmSnsUe0@Z0qwD#Dvjl$sT6p-{WZ&%j5dpnmQ=%g5@D{*p* zzF7qv`v7GuplaA+3{nFpArCZ@lUFcLKN57%!qR2kry1{yG_rHEht{pL`oeK1 zxN^&n1n=&BZ>K-3N`BVac_4PHzs}Ef#|-S}gdLgnBHMZOyg#23Z`&1G2oyhZkNIqz zUl;YZH`(sXm#JazrDiNXA7kx*U*^m0KdBb81TuCxDe6s$5Yy-Q`}x)ei54k~4adc+ zf1Tmx`luMhZ1MTV?8zH{U0S>E?XDTy)xJJEIM3$QS?9Xf34GNZSDs9~(2H1m^|2>@ z*WRxS%=cF%&zN7yc{h66zj>>}*T=OLQn%0vT~{pPA-JTP72%EEKoV%=x1J2VGn?avK?>CJXO6_aPj z+ZO-GINx_`_jK8<(^IKE^JjKDXLH_h+47bZwPlui8tgK`EPa{w;bKf?Ho+&(chrQw zd9dhJ_q=_&#lM8YZP(U)ik=ys{%_GLCmxF}&*GQIiu=nyQn=>ydX8?Tr9kPnwR^u_ z6q1$zJb+Qoq!mVY=$;^S#w=cbYx|}a{_oc`pXpd~Jk98c!mgiWj_zGRUt89&=W--`I z&w(D$U}Db!3o}QxvMY9*MD{F_5%(403m2`^YRTBSydd!6VdK(y(<6LFDY%H2^dd9cgJ5qPuN@o5a7F~Ss?NK?~k0+9IN_w_lY_B}>=f%mh3w!@0Coh~{ zAG7P~^*wKAooG+!UtfHr%%}UtI_cgI(-&M8%L&%U)XPO z{G`INvS%i4+#!am_sw%CntlGyiw~kMe_j?(I?*5NeZx$?tmEUEe4RfQJy*hgyD%*<1D1h>gm_(AHV`bw%%P*7A9lzkZy&eN=p}<%#RJtlK_!#Z`YfW@x|5EKD-2`s=jHaVpq`F-dvcBC z8UJ_N)IM)dd6N{xYJEiF%SK~)%WZncu^*LTXtPk$5@)x*op}rFEC52IvIg9s3ZHwy zxyKVg33#CCb7`IUcr+xgzDa!Ef1%2vsh+qXPR zpJa1JI$pNw(X4nm-O4MMm2&5Oa5sUakB2nYvi=Tba#^zs0q# zs11Uzk~%D~_4o%Cl9ouJi~<~x0cA9q2Alq%FK<`;UEg`>$+kn@t*f=zuMLxxK7~qI z>tl9q%6@%!%L!HT>;88F5t~vx*(=L}Jv(mA=KAS7dHc=4YS)zy78QMXIJt$#U2Nif zE`8C)cCL+6nk~(J_3o~k{G(^@orqsQP9`2bzGG>$<@zVj4CeiOxJ{^C;>_&(5xUdG zWy_9ibF0|+Yf9eS%j~vIYk$r)j(^?Hdq~Df?$?co*^jTa**rTm&GP#CeJk3;xurl2 z$AgPpHBRhcXx?GbC9V_Y@0We~SJM6c0gt7-D;<^joOt+(64tN%xu$(1178&T=WD^c zY#rTwYR=xjwJ7+Ef41E-+3fV*Gh4rI-FTroC;Zp$wQ+l^W-?yt(`VBCSh?^03fV>9 ze$<@{swA_GblF+K? zC8Ak2E&g_6-mZyU@mn$iw^w|8q}=@(wEjo1MRx7eRi`#Db-i%dHr0pweu%W?#)6!; z)AOD_detv?PKzZgDY5&)t@OSf9CgnUeCA8M*jSzud#$&(Hu?6X`#YZLtct69erv`t zWqG?R9TvyLYG+Tb{F*!O-=DWKcFvug?M1JQw|QLA>sa(cS!bSIS%dTIIs0DCP5$%$ zrZvCD>8>o^>CQ5bcouw0;9%A|VPiPar=y{xiP80u@Il8Afv1U1hDu4_I)zw-m5h0k zTsC=CHAo7?a(GBceBeC9Ae6?CxcAqp-}Z0piu1qw-o0b}`Tf>atFx~2h5mo}uKJzj z|CNWGlr@exs>^@fyoxEl5Vp?9%xo6_MuC@^+zCGy1p6KPplbIsb#bLuy4)an&Km_)VjfI6WazrW)kCa5R3+=zCTDffLL;u2h-0af zXN#IollgJF-|R_2Vg6L_pQ-+9Z`=r&aAIQUxf4f^x_u6O^P=7FwG#WHIY*`mIPZM4 zE2De+>OWsHv-@W8*WTiIJS#k~O|?Wy>SObLVc)V*hwSv+v6n)9-iId|K@M=+2bsF+y)dyo&?Z zrM4gcFqtp<*Q%-U#RvLiw_Z06v|hYHqNDRx_d&-mLZpWYG#nrIG<4p2%u_JGRbDOY z{mkX1(R$oPjT?BDi^#1xajd{g@Yn_Sd0MqQR!p4lC9lZm6#vnsqpxnu$K?inw);-` z+qo16*JafRK9zsP`}c~?i%#|Ky?-t~R-gN6@$opD=r5Zt@A;5ecSWlI=Y>S?-Yb7! zC~uN}Rr(>A)2cxBA(MtqgVUKEGw$eGG0JhC>2Zy|b>rm&PL`v`@d zORtAp=jrPnW~%ZgKn+d>OjpMvK|5A#T&C+}6ccjmM!=QxXPuUa*-tZkBhmlw)9F{I=9{VH{7mXkSiS92 z^5Q=|ozk;stFrxxaH*UUU${cD*;@Pm9Ua4|^X-DZD~g%@FlKl8n7KGzCQz>Ta`?F< zgFlNW>h<;CRCCzA$Wvq5uOq39O!2jhE2OG_W*lU4=3ah2LgbiI!m0HVU#7-e$uc~h z+*=bm*?&LJlb)R^&3MZ5d0$7#l}&;7k_2)j#Q#f3pB1g7QJ7s}Yijp;m*NS$wP*beH}wA8_%cFd&trz06D35%`c~Lqk^Utq-XzOC#jo4( zyx+x%rT#iMHT7y4`}h`y)g4PY9U*daqWnVt+0C9Yf~!r}*<9(GJv+3ngrm^J|EAaZ zh#c+yl2e}Xxf8c^F8!*d_c23%{^=^UtaK4EX2Za0LyL~MCQ{27SePWt5i|&_p2PTV z^M}JOZ})!Ml6RJMk=dU>i}f5eK^EJ;JltzHi~I41Oj9@Ay44liK84SZvfCN?=Hp87 zoTQqk4(tD1>2j6J5y*PEQt*-TtIOAFGL>gB=e{}7&u5+JC|9w4V*Q-mp>{c<)2+@q z*S<-0j~4pueLc+gLSCzc4@*JmhEjp#8eIn~F|7+LN(&hL9t658@;B+eeIf37?v#H0 z(+?|we7`kBk5{A-bH0*w_sna4lfNbXK4N-MYcGD+h!o(EjEsbrPS;Bb2( z#wfgXw`;+MKkB}-rY!TB$rM-}2P%j_Ymb=bi`>&Rtu6F@91$j-r(GwK^I*p#_t{eG zv{mwVto&hgPU2ff*2@opaalhN*X;}tW)IBE`f}xB{GZrk7aqGuH`#8S8vj{+eU7NV zVTyF}g|NCmDb6x$o23$coc{Hxvb{3l5Ka+_(#h=-bB?ZDu{c&)VY8>;(Ut>i%)b42 zyZ2EO4-Zv!xFUlUkNP%c;MUlV_~hn?CR2 zo|qef(si0CNm&(3MSg6~TCMM=``6=6+vZhud1CQ7fZz`&(6sDq!73~X5x3L0bFUF{bL) zqidIzC9Jl*puXG&uiqezeC0?u(B)R0}%So?ImCu|-iwStq0_ z%f*2~?QLrD!M+G7VS`!qXXc;PI`I1E$K?~`2 zNZpOdM8q~68#x^gxV+_L*x4VXv-iuT%&DPaH?93M^Yr+iDV=+(d^q>V(noW;%DJA4 z*=cQ4Qt6)WrE8t_V};1A9zlLbcWK*?nc8Zmf1)2PzCK69A9O8;nwXu?)|FG|8~)Ms zh?#ur#$;~A{T91=jF(l+TKy?|PE5y}E!$RHmr6RPxSp?GtD^l~_l~QKhaIeZN$hPt;_mt14$LaC&p7-7p_G78YM31BTS1nS~3PV=9-a2=-OQhGnuIDu9 zqJ_KsvUVThr_Pr;sQxL>^-`Ko;S~4E(8uZ*t5T#NCoHzPBJyUVtBL-vOWJ;K9xtza ztS)`)lJ|1E_u$JGAVhH#s+;?Bo99P7%?ExUgr zZexgW^3NEv8TR%6GZ7zyXP3m}!apbb zHNj;9_G+tHeKJTt8hBQsICYMc?V_p`*Pr?O?(yC3 zdZtr2`C{6lj$4}&4{Zw7Wnj?$wNPAQXXKv`fjl>vI+6lUtC_oRVV#o`^4cLo#{Slk z>-x<(slvqz7Q0B-EWKRwQu$J{fAs4mvbmiHe+k}vCEg{wb@@}-t^Qy8Zn4g9{Fk`s zn}fWa|2?vs(u$zUP|@JK?<8nb`pryr6aDGz?dodpbZUa%n(-bN(bKYOF|+!0`J)IS?{W>&YBHNef8Eh?&Em# z$;UWRS4@SWxwxFo#h*u`$}0q$2mX?H!8zbH5L(J41e z);ZUlbIMlrEjaD|Q&L&qZdUuFgw+w77RJx-KPIAmOz>dTMiGA7w=aYr8!T(m|J+-9 zG*<4ZKI6Eq0i zoz20n<)Dytf0FvY0=*9r@@HA&G;_0ltoV@j^7y3Pt`hy*wg_ek&V8!hwE5A=K8X*J z8-*=rZ+jNF{d$Di%4aIkB|=a8Un}tcRGBsV(_`g*dZybh%Gv+gw9udD*OiWEO|rRP zQ^Wh){oS1&#C532t8*wYO(@iDisE+gkFIU>=v~miQ8eCALDyaSQ|E%SGd^j@g-xw| z;LLNhuQq2x|7X|s3GvB4G{g%9UZ%MF%KS`NJm*wDpZ%9EWuxuax_e!cPp2Mj`+l$b zy=K3C-|o~2pjPpO{&~;y$mqX=^VSRr7N0BgB)v!U^A<`j?_J^B%d2GlXX<>jeLb3H z$*1(e=S2reOqMmAAThh}ra>Ejc5h2@udy4?&uqQOt1~k$&aLFHsexUSXS=2>Har^AJCU!4!Abn@1?3k4zqV*@`ReV;_iXjgr)j43U!uI%Y&<9z zpA@Kk(XBH1oJ9YhuEzbJlGj_zine99&RRdW{K`CG&wY{Uk`647410EGUjEj1i@Cyq z{O0rl3sCuN(QxayVte_Od)oemd3pj{1v!otcq@h#}VW+kL{VeJcs!0e*{MBEYs;RW zJG&|GX}I3A> zfvwMRZ)E5-U-{~54fdu@afZpedD;pK+n)OCu*jEO$$Fml z+-U-+mlnW%^~s7z9n+TARveM0O>=zX*@L{!_B!}Ir3Lc2?~tVz{Pf?+?D3KRV~n znyuRQ=HcqD`KKkCY!6A~=7_eNRXuZzc8dNJk<;n9_6MlAil3?fxbWW2=&w`dW$Oy# zPWi6Aafq#Yt>nGj82N2KR&aQK(VFFdW`6r^ao;ty=hbayC={~jDKkwld)#qsD+lA^ zsD$MHbu;(A>2Qud@-%~gM?-T)-HlaiOOH#{AN$z-;CbFwwl^COyX8K;Zq>0cX3Nyz zk4sNGUu9g{Yp|?R*ni&@4%4cfursM|_bmQ4$K%sktJ4fh0{x0_Bjl>zZ2aTxj9IumhupHtfa$JM!lJV69DLLM2haO7#iaDr728j1oY={rSNWH?dYr|#V&38uafjTPZRa5f`ETF!s==kt^edMYnI!oc6VAZbMn!|i?e1h1oTRm z`9vfv=sslet>Zuk!-8b%9GidF4foKrF$9cw-~qbQTd{?;dT z``k|#!|vT#b4~WS#N))~2mQRsv-GWA78|dfaykk$s3y~~XWBux11@h5+SSe5OLmV< z3Djd#3V1hP=CDg{*_C(JAdOg zSI%2yJbXGGCo?87F)i9Crj%rqd}AZ`)*DC9I2smh?nyrH7@;O!^JvGfNZX|EnNOFi zsac-zpKozRTl=vz^l+%FzI>g)`8%oZ zYj)T@J+AjFb6$_}GSf?8`|jk#PuT#i2s$%hks`+Y!Mg$SAy({o{(tb7c42I$aOAyzM;t`{X&Z%u7p5 zQcsDzUGXHsl@ac`eJN-|O zcD+iL_A-mjpTc>bb?evW2;LHUxgn6}ScT-;)yYk}X`ODm2EqWGC&d(E5WV6olKkf3?QZ0+W z(ddM|FV(vLLLIlZKe5z3!@5tCiC>Iw)sLN*7P>!}*X7>LzwOG4Wb1PGFOuqNOy!}u zNuBRkNu1(eE_!iJ#_6`Gs!!eg(zlN+R5;ZsUpRGs;nU^Q_CC^(uevp9#dRr(#b+aA zmamoBlKk(^TOW=qYYhZ-r$o%!$FnAXIn``ixg=cfQ?^`BBLBo$HcBPQ-Myc@*Y8{%R`*nK-lOMfTjjo-(%+k; zVgFdEM1T72*XQTk*P9)qZaL(wyEP=L^lIqMz~9$m9)Y&^sTP150p;3|MNHW;vbi}L zZ+7X<(=HUq`WXJveM-MwU7*Nhn=Mo2rQaOgoGKH@^XruS*IDd!r_NhA#TRa2doxx2 z-0Z?H-~n5nUTwL;3z=(sKRv!bO<+Ux#U(Q|CSPGxUZ=L&^@N*4!g{lBJ?;TZ7Q0FG zf7|lo;%_Q8=Jee;=gPOHCBs%eQiD?#n%r#%$Sz^VX7E$sOSM!on!L zwVLVi0T#)7fz|JA9`4+!BQeh+CiKTjfkj7cTf4jD=B+%oQgXU%?Hj3|Hj}=7N|mv$ zSR+!Tx$Kr_0PK_aY`i$!ntrznnXQit7(9oZ{5a$5}f*bGyb&*>6u zJe77doPENbQ_DdMnmT@5ex@){ez(VsFuOMbM}zB*9_n9IaY=jrpR4L(O1pn}dr2Qu zf9AZsMh}wxWKSn3CoKAwAa8&E9@%YhLC|o3pvHIqzK60~zn?JPr7PZXtH9GWOYEcN z>Mpr;noDv%21~Y|*IHDTCuaRpa&hncirqgJh4X!Kt^WFO&!XwJRYwEsN({r^iB-Sc z7+zQMLvfb4<%QF1wzXZyiZ*u?Wyv17c4v{j)gQ@ln_DkbW=${3h?B}+t>(GiiAT3B zV%CB$FEWn1Zd4GQbkY0CVyV5itX6!<1g&and32)B&P=4_$3kWE*4Wig=g&@^BXv+L z(AWB0_|MM8e@-p5+b8l=y?oB(Pwqx#W|~d1izK#e47MxsIfvG?OuXYedt3PxxdY6v zG|3*oJ;ul=y!ANa6+1plpDXvQ{R`vt_@5|UGHgjH3^_WrHM#4^EWW_j> zGjd7)b?IrE;IBt_gS73NpCrb7TqtD{I` z-!X~n5@lZtOM1YonZBOv*WfpG$@;4#;BT3sZCC8#-}zcu?`OwBiA7&89gqL{)LS?D z*wpzEUs9LbS!em5cX=B*@yYDcX^buka?ZkA**`E;og%yLM~vEDDZ5gaQIYisvYd%; zO;*LS5BY+H{u?J>5bGC}t+iMy@-_OioiSW8#Hzvj( zinublU*c2m=Y#C^$2z^ED^2Tn?CpP|^e#7V+MgrAaz8JJ*Zui;@z0d`b;q41#C7sX z3A;wHOr9P$SzSGsaV0AgkJ5o8>FPHuHp#Ch_bXkHaPC+x^M!TBr_=F272LGN%r+gL ze&a@$o%wwH({%oN56Q<=MDk&D5I)1=TFVgJEy!_;j zj+Nm2jpF9h%<3L(c(i!O&Pa>(PnK!S`*b*0mCsNjyzXdMOkBwg!RX=^aqancbdowML+K$2`9N*H!|{Gxl4c25Z~65`S((K=T*jXvFGB+3&SHVw=X|C-@bku(+;^9P%HUP^7ENw=P@-d&?E`h%YP?? z%dYIRJ^!NdVWjIKqnHqvCCR@YUAYt{FI|}RaOtVIjV5h#Yc8CeHp{L_za}Cp=iyeZ zxV&j*b0S&_f38g9ss1y?-n?7Z>SuuVev56Jl=naKY+rxtho)Gez}2r2HD`7cTpM=LeJ+n${|FI;WqssDjX9NS~qrVucKfZL_=IftAp84BcIByrNlFXj8 zVyl9ht90VWEgP9-vU*R3SM^>@UnnT@Xu;(EUy-4W>v#M}>=xh_GI5fYKHDDA@ns9^ zhMEhS>d8NZ=KtAr(PpYKe`w{D`4U?;F1!#v(Qfsrh#p<(q6z%*w@yDdvK8K%K9kz5 zr4N0#1h(d%N=?)&@On5y>57s{_i-&D)7qO0h4+i@(_+=rdA#Z5*)C~szCTahrHgj# z*nVp1pH0ida&k00o}AE1fAT14@lTDiFV4$LCo%{6C3$x&j46!Wa`bj+-LEaC?q}QW za$5?|uGX;nxsbE`k+yu2MxR)4{0fG|Lt9vRxP?B>Fyu<^a^|&^ocrm);+n5kw;sF8 z3kEPneUwOlo_n^r;)RHN)vsCAd0{^sq=~bK+QnQs;lH$BfPLZm3MChJ`&&PPC63F*KUJ4sv{TdGbYI6O{;zFyS#n>F zOg(A4zx|tdG!@xeP_jt{V4NKi#)qN4X$@|sn$4VC29eo9iB4Q4T zX)!+U#O5;ev!oqcq?`Mu;Yn`(}LuC+~R^^(a{R zjOWjn+V;6Ee>%Rby7*YzY1^mO*DQ8^J>9JTxbWPI6a0bIbAP|vo&PPlpRp5pX#1FW zWBvc%_g|i~e(%FAuICfH+|PIQx?Ne1rmBg7rrR9W3q1IL`h5Mr&m}*fPG4UC=dt|D zh3#@)*=shsRsFg=Kkn2)cKJOn|L-&Q-_CpdJI~9%`qt%&r6IvDxCAl#+LL*oYvXw zbNqFL$s$vD{2j>PxKs6d?bB-c`FExBc09~j*4=Zr?)Tf5m%R0Le@PmrE&2cF{QsCE zX`aDbx}TR`kDU&>>2cZ4;^))eKbWlUulM}Wod3D||9;Cnt-C$ul7h^}dto2n9Nn3* z{rO>^J>t)w+R4j()PB&1z3F@*onyv|yXovHbCxsvYusO+=KgkeaixX0#gc-+WZ&qP zln&P|8yBvaKfBfAtZ&NCq~jG|rpJec|J$ONcv`&L<@18Ie{N{lmmN9IrwCn6Ww=su zuq~&ub$P&F|HIkp_nXa^UBzRk?2!ER<8h4+FQ@t2`TzesUk~FJCpma;r2kY;5 ziZ53_pF3UQy939>H9Mcp%3R!Q<|S}9{zH?v$K4I*_~Vy>ZaRHgzW;aZu3xWKbDykw zIyKx+zvdzLW$(C8leWCy_uEW0#{Sof#V@BRolh?r&;NNw z=;;tCG3zC2@m-e>>+zwd=x^yi(aJ7zp@;sZ@oW zF|>}kz{+HPzoz(B;c;2v`L8FeIdAc}XWOEW7w%Ty|9$V#=f3hi%C#??<+D!L7aHe@ zpVzPZ*!}Xyu2FLe8KfSG?ua-XGI;rZF@{yU%LytHMC`TqCP^nE6e_9;g0 zs5}2P#Vp~W+#@#WoPc$2ztyqzWkCAIe_I+lZ~ZMXIaaT?Rd%bq#5s~19Pe!q%;-2^`~A-3dw-spFQ1*a zYo*lldOd5)`xTFSQ_FMNj&-lF<@mpP{f2M_VNF zLCw+pmfza{3<9gy+pLZ*Zd}1zFLF+sX}-ug-P(%v{m%|r)I{|LcHh^UxAxD~<RCr6YBAYN{jBJkV5s7&234N_xCRwsF4Z;;y0#7t2cw7H+ zowWJW>3GYRt9$qJ@fAMt&v_#vZGAR2_v!NWmCi=tGFituI#0~sF^l=}lj-uNwU0E_ zOqJ?y{aBpt{xqxLe&T_MTLmJ%u~^^}5}8l|u9G`tHo+Zw&ghvA$aLxbw z{l0x+anjAy>Atgbw?*En`FvLR|N5N~bq`y`mz~z%zh}sFg(a4&oP z-cxyZzAX2fJ1g$%s_>=0=66m0zVxs6vj2I~Uub=u`-RUtPs|oossDL8{?hBX@4GI= zrq38PW&!<@Y`2T78exKs!=cZQPs(e28^7Vb+wys*wX6^^Ns%v_2K*^ft zQ`gs|{`$WE|6I_m%T0_`9p0cjm{0ND{-TR0yS{ULNb4)#`#M(j!t8rrmK}L_?(HcT z!L2*>j(!hm*4>ZhbIRe&mH};Kq^1T@<9XhD)aC{yAwY@JUKb}@|MiYRr{_u z9^Wkfe9_%`{KWxPg>mmbKb-f!%6b93*4;2eVS|OxR`!QBdv31xpS$Ah*A$QF|G%#9 zKehGFi{pB?kIRgF2czPv+0rGg-~oD|net;|g2- z>8v{s*tSmaY4qoMKV{aw9m@)JR&#F`wdXP`i21nKm-o8pBy;m6A5-TTz7f27>EYr% zS3V`j6faccTXg5jiyC=sKWXHJiB_N0KIi)H zl=s@558IE}?Nf?AZedt|#yNV?jZe<~ef!?L2o`v{G)y}BTEC0^C;jQCe|>&_e*W17 zsT)9x5H|GBPro0{QssE(wQJA4b*uJf+(~(UwO|*c+}@pmXMAf;lye-})2+YHV%Cma zQ1u`o+_?MQF74c%Pp7rcn7#kP(#_}Xtk>>*HY@qp*GmiT{|`TYSM=xp-;Mk=2}eH7 zv|s=0PVM)*+=f+065f3%IJ<85yIG)fmW{5wI5?~0pqKXADd#L6_c+Z8UvvM@GjmQS z+yB2O{$lo-u%Yu{-<>xhmpv*()x@6&_L=6debBu}W>EKQ=|HZ2Eq$db;cZ({qQL z1g3q7yu5yi&e`i*p;6uF=#+4BBqme_w_B-mf#fwae#;A_ru7u=coj#5kEB0E* zU451{=~Eo}NFe^kCthE80&s`Q0mha>e75?zDe~ z1sq3`J*>q#Ebj$YKj2%beutImqgw3T3D>f2#2v{ny*@dy{Iu@&CEiH5$?UcYD4 z1Xk@fKj6tMXJ=ksOj`#;YmeQh(}qgeY?J6`he;_rw5{@MTQ-R}2(w{y40-t1&y zvKHUG^TFM9f6o8^oZV3MV@wk7zQ$gMLN8nAAf7@zlMghdbi*7_0B0iX9;QzuDS!dx;5-bPTcIDhvolmcq0@i z`Q#Yrin5X$iS40U_ud)AS+5QEyaSGF2}b1&ED8ehE3&=>gs&EuvBI_`WOv0Uw)NTT z_inR@FS+RY^sUC)q(ouQbf+u(xLJ$OUGX{bndz;{o#)%7Wi4OB>uW}318|G# z>+B0XD`eA8HXpElwWhrIZPr2Ng?3Gq_u+6`#Ps&b*RZiRLmelF9tNQugX)Q7{l?iJxGoRV%DY@(6 z9O+02=L_2Ve?3uN_vvz9q2zP}H=bix!|Y0KbfvG}nG(8jx@^_Qyp^5KjrrcbGF+b> zFL++?z7l5l#jt+P_L``5Gjp~tV$EK(YHP-$%We^C8V>YtquNT|uzMdLhwPna{9Tv1 z3)IRieo&%Q;TvLp=zi**wVUFTN{#zFKfPrwTrX~Tta|UCb)~OsKMtq5z7aXwck!-=`uys>|KjhS{eSh>t;)By zEvYPvzWQ0e4KdGLS^s3B`!dkgR7bbfIsRF*`J5NKd`*F5_P4SYVSgLL+IPkCR~LQU zS@^J3e4DG%uJ`+XbFGZJFIo5Zb^P+>_J3c7o{=rPp?J68Fz-@+$>+WKHOZ!KkN^FC z?|&mBy`bbqLbf5a!Joil<^JH=?0h}*^NOoK30$3-K5yo z|BvJLmyAy9OkTJ9-L7vA>m$pH?CxYcIqRQqw?4R;>hnnVwbP^TR$VTR^QcbE~3j zl86P*2^@``3R&evdUwx$eEIzIhmF^+as|$oh`Iet%KT965zzIgPj&rVFFuyvdu;Mc z-!Jc7`V|W;Kwa(wEs6CsgI19&Imtnb{rfJ-cb`Gl%&*KDqnH|J-W#@^gUX z@@f8iefQ@oI_kT0D^EM1x=pRyPvK(QhMo-pFINgOGS1jC{Vc0>Ql`&=jDLppW~&+2 zKR-U-sjkNIg1}Ns1*O2}X_C(E2Ipc*9Hw?#Y!S?Q`7(Rnkt+xLK6bABvxZ-~`QeJ6tJA}@^ar%>#Y9&j;YhV%Fgfna>@Jh+U@tE z@_NqAFjUUnb~Ekef@Z#~9nH^9s?VRZZvVeuMwT3Tpb?5nqsnV*B3~Z2|5v!vamO*K z>?OL}ZY+A^a58UBZ%fUD4HM3q-?!QO@9TQ~+_IuaUw6-mxLf&rZsymk;r`M&8ytVF z|Nm?Kme1#`#b^KGuM5ASD$I0kPvvK!^?9+CPp6)~^Qpa5k=1y)GoR&>qQBSo|C_q+ zL#uws-!Q53b>B8$zE}PJZdaze*6&?{x4gdZB zNB@6~{rrW2Zw#uwUJYOV-2VU1m%jN`!KNjbJk>*&n8(dMQ@G>xy4|M?ZNJ|sKK(H< z{qooA@%v@MJsM&(GD9Ev?TF6XnQHa*N^o@P*14dnbAf^Y=YjeEzAV4}Z~wWY;s36K zn}U1d1e>`3U;go@<-@0E=KCwpvGr=Pf9^>!ckwVg(|9QTYSrtt z*H7ez+!YOv34C@wogw?-=N-Zii+@gCUz7T1>IaXxEVTz1*{96iC0Tv@_PuF#zb^J) zTGLX@Qf9~aTH}57{oi6gZMq(R{nlUiW$}@nTtVtB#q&Piy1s8)k0a0TzwhhkFY}oh z^y}BbJ!$9Xt<76GJ-+Ver=Qo)rC;x0cqakR9hvuQzw54F%GPCB{A|i=_T+<;?ys3% z@qjPL@Vb#g<>#Aczn{%sw{zK!{f}ked(`mfs?3cs?=cFru1|e>hT=q@=6?l8@gOiqzn^?I|nTnrlzBMs!4*z$i^B*nb+1mX+No8j}>jsIz8P|;l_f+^2N{co-cYZ*InXeBzsTb zOOwi%5dsZ?*@Zeh7acDt~zEs&oD{i(3hvvCXdE-Nq_?`uJQ|i9&zCShG&v3)*b-R~=y3nmR&gMn*F1g7Yu9x9(XV=qd z(Na4@cV%8)7HZxUSk#yTx;y(=bmj-wxZTa$lI*APx|BTAf2jGMTW`mLlJB?k_d6wA zk65$)ZrSZEZ#JD43*BzGgYi$h{hx(*1lkH#+`X{#=U>nmz>|zGM=X!`>^wim(pa|c z$HS{%6xf|+xc~cJ|9|_0FE>m@Kh-EdY}=LRW-irlRc7+kNoe_e9Dvy+*|GG+rew$AoUq6^X zHwRs@+`aE#v-GRkIh#CVW6#~LkeD_5{n>SgPrU4o|MRGWebLhVknLUS_ZP3<^=g$? z%eiKS&iZeg=db;e^}%+p;LL@WKPNu=#&!Oqm3&&?+DDylGmNh7eBm;O-+2E;&`_Jr zEx|7{Kt&{Y3v2>Q(5q=H&h9mTcTn-p?WE5u7WY}L%2{xgBYxf4I#6r2Sa^clzQr%u z9@^Aw`I)^&c9EGy{p;xaTI==%2G6e45G!5&eR_4Pdhvr@-*4al_f7Er)eGJ`(ofr7 z`@ZM7t?mE40esiNZDmK$5-vyEqPb_QE8O4OZu-6_retCS`o0onPrrRvesu2llCGa9 z^}4Qd#S@YJp@kP7H^==v*>1nc;?&|jt3FQ7u-(*KxFJw3i|gB|#g!MQ#}y{Y+ZTDK zILBALyfQsE+7xM5iA3oYoSRCfBW)`AlUfuw=Z;Qs|F=!b+de&B{O5SzAfhs^i{~75k4_2yNZzaL`w$ zqlCjy;bh_GPp7ok>+EtfkNIiD6KH;KO{%z7Ue_lPt0%dFEw5d2KlOesv9d0HxlCvB zjk4RhtM$L72F3pCSf7!nenoY9OpqYQ?q0@|QM-eV?|8H2oZn`lvVHe5m(RVTYn}O7 z>i+rKcg0s*)!38+XLtL_|NGFct)#en_aXxG2re=EM_RFpZ>nDx37I9JYQqk z@Av!bf1Pl*yVP}C$!v|Zk@f$>KQEnO_S3KbdD{JkVSKIK=YaFKve(D<9-qtp^G@rL zzcbI*Eb9?&Kfioq%V#0G$2Y&qJoHtpxpuU8;``e7)lU@-k5&HA*q6$zB&L#Iw(E&Z zhh^hpyXK1K6QAdOw~2w)B?&A&4$>SOnvL`CKG>6UR5aXY|F5g-g_b#wEFpc~cqnC5KxdG+`WPX0xuB4!E=5@)MaZ6v<0Nw;17 zCgZGB-u}Pex(?jc3fwJg^Z50C)Aoz6_BfwaN@>hH*M9P_P zVg-jy@XHKix3dgV z`!7t&=H2pkU5e2RfjU_?pFHc>)-bs@OO~VevHR>FXE-OW%}L@bnUc}GzGRkutxMIL z%a7V8>D*egZ4^s-Uq`zvX?ImGn;OK^bJwf#7Jgx8_W>lvE})5V$Uovv|B zb9iok%dh_(ExEq_XSd7SqzUy7E|1+L>jY-`*?c_W^x$g6+%w&FLR(Ya&$4!aT5OrU zrq?vAZC_`8{>2*}SH0)&x7+GjEqC>1z7~tl3Hqv(6E%;46X{J92?pvD(v5))!T6^zxwv=Ro#ni z1djB{WUt$qCMpzUFn^^DM~g$4-Ioi_-n(!AzpCo-@1S1CgnEnmN5#@cr7Ba3^UgF! zR57qOooyA5vq&n>KiXyb|N71YXAXN#SgIiCI4>)_;;+r_#Mg}Ln)$3&>{3`4A+U1Z z-#6*2XYZJBh&hVmbHg6i&e`Yhem-x%KW56av$7og(?Hj6F1`DPU1EZGe9PB@#C`ji z%~&*I7d+qbaT*(^^>vxzGlollU)#QKtH6!Qh?nc@|7KtOc4OKtdtiFDo7u1l=78T*lFHQVgwSvF) z&d(j8i^{AkzBR45d-kV6_8ZoDk4x>&{JC{d__y1oQ#)T&%;z^=9|o%D?!4fLN{5ek zNi?bpym;Do%iqN}bM@M7THgaIrTO#sJ)9>g?WT~E!RQ$NJ!f(J^0#&N{Q0G^Zw0pQ z+`sbu><6~h-`;5XZvQ^Lx>0@d!?@+oj&6ND+0QETh_s%+-OneleEoXO!d8ntX#-WL z37nuhPWAPH!_KpfQcumRy!yFF^48stobz;RKpWsXIiMTh3Ibh?ocaU2&r9Tb_B6*C zCa=BmL|i>=W2bZUoQOYD;w`5#?>&~X+~UR5`P)7{PkY*|oBZUG)Qj!|dh#VAPx}im zdZ#$sZ!^7DCfmIIt<9SSM+LhNEz-F3JWa5-^T(Rz0|_<~&expnJC&N9f!?}S_IF4AxK>5+4<24C*cNxXl5)tD@cFzn;F*0r?aMW*|FiFQNLnwj};wDoQ; zUpL)$E2BaZjR;B-zWX+HVIrb z6??t)TGZ-SWzx-aeH0feDyeBb+Or^(WbjsJJr=Zb?f-Fqt zOrFx4%!>Ygy}o>I`MsTQGB^eQgC;=~*M9EunJfN5@~ma|Q4VnF(bFK9A=@}Rf1l;s z9gq8-O7YJ>J7L4mb$5L#3d(QiZeJ_c^f*^?&)3fPO9I`Lv&yUQHngAE5^a8cX+?xg zW57b`SA}|8!lN>m9ywez3A8>y_RfxNtuJKUAFsNtnzg-K{dIz^&^?}Jo3AVV*PiP% zaXY)QbNAfipYQmcYwx_tZ4+&KKKE*0rQ+L1mQS|6I3IS-_4x0a9aljEK>AgG)*!~0 zdK_F5Y&ve`upL}?b7IHYcjxYyPd>8!zSni%yXT)je7k0~?4q(g{U?_x*8HFH8_LOFz8o%Zqd%RhJZfqa zrnlpe_EKM7dC_}1e*V<7_q80@E8uJAC*Z)M z@HmQPt60OlZNHc%N;%3WYwt@cP*=V+!Jj4f*p&E>n^v7+mQT_sdz0K;J4fHD<&V^1 z_njTh9_rRvk4~^lKMkoX`LQru=GnSGmr_Fodv&K*OFx_Y&9BiXQ!)osv)y>i9@sN? z!u$RI|4ou;`sy9`X_Bj2qilSPrCn)Ih|0}RPbaF^NY@&+s2t_hYKdLv>JYZcDp2~; zwe9==z7<^ZG0i3S*?B9MUD?||qmqE$v&*YOlLB zwJiC=mVcmb$0WBUyR_HsPbx~aXCrsz zokHo`Kdi6xtnl^AJG0sN?cDNvk#T>&zK;LD>yMvS{NlM$rq6DHQs@Pq#`X1oU#A{- zI<_A)V)Xz0tecC|r)TL+Q<^aGXH15g!2U{8#Y6v}nD762wtL35-}`4Ve13l3A2b`- z$y(UfzUoHe(uo_Czk&K4Ml6AUHl5bXP6;ddb3VPV=9&4gJ$bJr*lv7e{WPUa`1$7M z?FLsmLv}c{v@L1}%WUam;NRCFKc=wTKPuO|a zCw&Wud>>r<+Is0w5*xh~4h2@w$xf5DCvp#J)!e_hnR+L6}(40FuO47ZW z%d&bRY#uXl#C~z^U*P=W^0Eup^hFJ4tbaCr_SHWZvvoHfW2=6;+-*_sr(<&r<$j7X z*FQZTS7>7XOuBf(;%~Pq-QQXw)+^uISmFNmp8N$+UQjMO*^+U@&!e{`d_mUp6&}la zRibaX%M`jOe|O@#Ebi8k^5%|=s?gS(xm=q>ti#$r9%) z&lPiN&gynqKCddPN#){N@S%TQa{Mob%(ur8en2i&xJ%=g+Sa=KQby^Urf$iPDEL-LaNCW*p=N^+t?y zw_J29-5mJ)4abh(?{+V@ez#-s4aZB*n2Hul^GSTj^4u%PxJlHy=|kkM!+h2%WkLt} zCz;KE?@?3HaaUWh#C(!RQ&i>CslwJhHt#FXXQxD!yy-fdZntQz?#GLIPuEvnU47}} zaryXTKM&qkFVSP>teqZPw(=N!4l9Ah&7C30IDffAg~H6w^EbAz@A$IQ{+4sl*^XO# z_vKyST-a#(DQ#Wl=Vw!&*1e9tpY`kSR@p^m>J`^M=1pI5_x0z8ejjA|KPMKvWS#eR zPIuq+p9Q-?>)F=*58VM?+F<~m@@SmM@nzDAvs-T#pR-h7yZM}z@?@UxH*B2pg`V6A znyqPS^3Lg||MQ1$^%l!6`o=0AGvV9)`u~%f%sD>)6?i%QeW!8yIUVVZ2I_U^<9^?| zeksP~hEBJ+ozmHNraF&OS|RO3#{({JRi8NU>latJ=gvDcYc{t_E=!YPP0)#}1-^nm zwtVo>?C6O35a{Y5_E18)q$kmx=Vr3<-lRb9`Lmbu{tx}RF}&`W;G>1tB`lM8&U*g* zTrhL@pDDZ7E$`?3+1gxk#p8@;w55o&^x0OMLjrqqUjLMQ?J>h)`yytSwVj!XSF()P z)m#dEeE86hrJes88u<2eq`ec9eaz77lF+eoN7nI(8^;TO{SfYkZs9goFG(s(Ivpd3 zw1-=F;|jr~i)ntRT%$K$)SZ5s?dPIzn($0?*yGZ&+(l*Y`Ct5eK7anbpXbWA$<9#k zt$ZZWY5x325l7^ji5q?!E{SD1q#xh4*k#c->H9y9Ilbz7ym+f(pyM(pH|6f_-dEDt zgFZYg=T8g|$(v?&>+LFuC-OG6XQ#giTOycf`>WLHPWQhp)}4$u-}u-63XV$dH5EGE zy8O)7EtW3XC$8*S7P+4NcK-gqr}EMSKDuUHwowY4Eqi`eY{{hB-KNLWK#Q0D)G1Cl zv-NTL?u|M5EIkJ%bvmfKyxp;wbGLP$8$+6SdYO#Nw)=IzOCEKq>oJw6|6l!hwwA)5 zn(w>s$ExIoZ1`=qn@>q#hRdBkvptcIh3Efp3EbGd;F)Z$Tek50>!d&F4d zGL8=nlJhs(OklNaJpb*7(JUXM+k!QNH5VaG%h<*e_&b~&oIu*n7V@vA$V zJnL2JT@t#eYI zY$JM=*cR{JZrd3R{%oa5-Y<;|1qCx29_nwyv64o>Oo|V|R zX#FiiwQWLQw7T4R{!W@0zu)GD;>9@j-Wfj(m;KD-kxf3beC^I>X-}2yk0##x;qXMw ze&dEj>jR~q&-UG1`zB#_u5N7)=pdQuf=A-P9wEsSXP8*OUFTyjwDsoQuDiO@o_iXX z&7HM4Rwe6mip7z2VXFJ)i5gu$Gt*dl*EZ)X|4zsMo3umVka%s2<>t$2n`Mtr{c!*P zzw)0=^7YeA!`3hNnHf}cKM||T9`}`fExTj; zbg6!A=1-fQ9}aPMOYY|W6fmLXGiMp&{`dQScX0`sKT+$3r&|LvrjMa#=O}Oe^udDv zMbW;cuj{7A*Hs1=l^ZWATfbhq#3^IPzhAE}_gTM-aJV$vWtQSKt-#&FHquXXU=_%l zuRjfTlys*rf4*q1jr_YWd+t0x-22aH4S1mgq}z2snB&6*RsMLT#knz}=YLlonCL4v z!Q)EWVU=}r%_jdyc=G1v=F4HxxmV9@(XQP;r@eerM_I?MkG>Acthm~8K zxzc`F=#T&{!7uB{sy5P3{&(25|TdSuk zYPm<3_XZ@lYt+x#{^irvm=~*keLgA9lFoh9#M`86=lxvhdOM%IXkura>*tHVJ_n>b z9ms3t6mowcP6=d82NXSPbr1Z5EL zuFa2qxAxi>6i$ErM{!!+|KInw&s`F_=-YFn=^1LJP8YU+BKyS)98@-t&S!|q?N zR$rFB_n~c4*{v;^FDH5Hbq24v_2$h{y#?j>D$_3(9{%*@vcLZBqA)k%3olxBgwGFC zH@xw7>f=_Ksuv46lk9ePeExkfFaBfN3wQfp7mFO5_g{_NoF*!iH0Q93z*fcM`I}Cv zbxJi}`FggWlwIe)#2a>$KkP zoDCWGde(pH3A_LA+je2=IWCE3l>#<@Hl6P*q?hI#RsZ8*`|0OmyP4i?ILs#{xAob< z#lH@_S!{^5O8M4%(dQL6ZW}n*~`nzmlvP6EkDz~ z@LEsvekuE!MnM%Dd%Dt)N@$wYUxbLS`g(0UOUZ~mg?g24KNJzv{&@8vDZ7Tfc+ zdHb|0OM`7*7rxjIt0}(ys@V~3v)fYq?bV+K$2VOD^+uZKLHpp~dg-iS2mkfCg~ud) z&D$UJHr`2giTnF1e0g%e?Y1q^s#(qs&)#m_m0tI9>2$GAd7PIX%l|EqyZ3U^Eyb+k z@0$zTKdq2|JF8;#_vzLLCx1O&`C*yI-i5n@bKZbQ_9BG9O|FtZch9dXoD&dN>%Wo+iaSI6lX!VAIt(A=>tjJ07i+yTtdGNx)o= z=hzhQt+CZ9I`JnZxpB z>EuwCNoKjiTdV7H{(tPRSDANeTEXP(yxn_UW)rH!L6X7f+M^}H`i`FCIwysvQfWJ_y=>-7sKN+ z!A54g4Xv-0SalX2WEEfX_xt_*E%WSZt9Jc-Hke?Gz>JHb~$+d zuPaH5<%J!uqe4=yF8@6GjmY0-`9BK;=Dz-%bM5&v<|m4OuE!LgZSwv5dBIHmD!a!Dq3)Sm zqRm{2|J^T+Ypi)JeP6=y2wU{Mca0wwT-<&C@4HKRPub_IzVSJHw1l&w=rZf1>M1{> zex%#~zWH*^=5t+#^AOt#eFZw6Jf7@lwQ^7B;?9>Grq3B_p1s-?zj=G*M+4Coj+?HF z%JkPu8(0>-V0@T%UEEDasr=u!?fXR+S^auCEn4sI*Y)*lXHT(vF5fOwWX*#g`8L+rOX$CB|NO!4`ZcY<+2-!YUVkqXo?Q21 z-icrQ)^9cx`OY)rKl-Un6aJf_4c9Zi)++6lI4-|8c)NQm&59wwPnOqm7H1~ z^*Vh`ZeY_k*=A<$B%@hN8X7Xzw06umBLTWcs?4xBpy!Ux;~T{S(@wI^w^&yf7M}BK z#(Xowla6)2j!fkJ*EM^#>NY+uvyNxy$|}wTe@^F-zB!q>vrg*zoR^dN7y2sdeRk;R z)h$lrxp*ga`5&ve8|x>W{<3HBH_ZvoI?cV{%HrW^rIctcm06$@YriG^PWe`NeI95I zS~-txo6*s*j$0EOrp?dts^N@Fll*Hfaq1Fpp!K_Je>Y9vt5f^F`o6SbX_-(hsDV21 zl|+ljvDcFp7knJS|6lkh@z`U4xBb9eCfB${oZ~u{NUD?vf5)(Vt)_jfi zj{kWoe3^9qp1{MY+dqO9iN0EGDCm+~mMClnS{v_r>9R}=IGwpUFA!d2w%cS=v@(-n zJNw*eQC`be`lmc@TrqwBpQlgnuwb`J{=Ge)9HyUR4v$Qo z`svpNtDC<;JACG>R(Qj4?)lb&=WF?Qzu#9aIoqbPsHujJah2@P1MGGaDxU6ck=C+d z5Nj=FmHV^n-LBVNzk=ug3OPJ?$Kw9mkQ54AvU^Y{P#mUQjK zp6CDnz5jn|=Yibqcf(q{T;9gTny+Yjeyn)@?>k2h-cRzt%{evJ_l6Nfqb9L;&Uah=k%jBvAJ8XemnPi_H1tPpoi1D zQs&NXt>%&sWvzRuywf4%aNoWkyH+XAT{OMlW5pN2V;`3K+hx^U6*sq7t@TbjS)_yI zRR7#hPtrOCLAQ;$e^z9F{G;Rl>OWon@vkSWO%iDTb0)UzNZ0G&x;KmFKRaoW9HpH5 z^z_+puAH~O*Bo*-WDyZ|Uo_9Idjj9=9ThdE%Un4(WJu?-#FXha$?kjc^fW{6AB`t2 zi*&1UOyp%{-ds`BTV!#{Io^rq%}T*Xn#+nVhua;U(EIC1LS4tLQ|o7ZQGdP(e8L#F z(X!MHf&z~1&?@No^BYblnnGGXToGK7HSb!k%A0>*F3OUUlw~x6}la{yd z=d-CNzwiJ5_e-aL&7vis&cT2CI+Sez_ z>@HthqPaye_2Y+|r?l7mT!(gi-41Y=I5y0FTx0kD@B4cF`|mSpTcNGhwRUGr ztPXA#e|~uH0qE|N?~gzooUi+NAY+J-65s<1)5l#3`RdQ+#j0`GCQgXXDcEvaZ+8fP z+$Y(zwOg-gnI#Kut=z3UTPU-+1GG*vCOWU&xJyttYvJdVx$WBxwg&nhQ_3p#pZ)si zn-#hb<;<^dQvLhMc4BemKI6~U4F&zvvj662giUvst6cJC(>dvdm9w`(+mw(Y=wH4G zpEqg-FUxR$+y3d5t5ll>S9~Z-P?p6qfu2nLsopAC-MhVHYek)_j-`0-)_Zcj;x61k)_TkKMf|#?*_U+uhn2$3JytUcV+uC}*EKBfHCQKc>afLeJ^hPPTl>FP_Yv?b>lr^3@ifEAtL}u1N)LTlsy` zvhIyi?Z>0y)1SO4;a&I|)T335Dpa1z%?%obKJ9yP>GZf=y97I(RkGf1y&iXz{gT1@ z1+6>&9=HFuF-jy}VkhTK4^W;6ek;1Z!qxTK({AnTM``NTAsg9R=9>L-G5fy8@}^S7sWghXpgY%a+|(_{u!%!$ba!vF4%DH%k^br<}`MsdU{jruobEhi%f+ zwr)zkd{TXW%!#HuJ91U#9_v_NkX-v_+TKfE+M$|{K02M$TQ_0*>r1?Wzi(x)_XX`n zJoS3X&%3wEZs(ppw^iW#jmZDg_y0-#^<}wz?A<46=D8d{KdM#K+Pwo;hOanEoUW*` zJz3x(@{GwQe`Q4a+|pCoZxypY>=%0YUt|7a>HIx~FR#~^{Ms*NWFdYjf7i=pLX+;A zRlMk!EBW(H!;dr1Ma1(3<#H^)-AMMHEe{%Qs8r~bjjDKjlvOo?zqSlCvf{<*IXaF&oj@f6u2u~?syU>@-GoS`(xsw@J{3U z$=l`}rz&~p@14|Zc1vUL$KHG$^G!eRoqulpT;jzG<%uiqcE4sjwbp7~cebjH!@jTA zqQ#AV@tWTWI45pd|KPXDbA1mLvCGeM)om2|c(-v}H`!6QaPB>YeEF&u3sZaK4fB`7 zGHl`Nr#}roKH3#^bo1@c53BC^eS8DisJ+)p|NBpa{i0%^J}PugkxthE)9W$8X1gvO z3z?9)Gwj4N(E^cmyI!sOG}qyJ*6Z1xE{n{*|NQap&~2%mWl~L`pjo6P zJJinZ4f_~daohO2%#Ls8-ZS4f+}Id%E=}#u>;z+BXzdLf!4LqQTsBo7d~#W#2>9f( z&H%3OQ_M{5ZUkNKe|tyvVtUOBwvPgM&MxbjENuTs%l`2xf8FY%fp%ZEs0OY#HE^4~ z(ZVmr!Px$$$ewp>3GigoW4eZFMYH< z<1p**wEWc*{MG-j{+OCBP!{!Y;i`)*>>F-;Wp&!7BIMO)^=ieI<8sv*E1v$^b~{hI zWyv(zHr|~-1M0n5mT2isb z?5fy=HCsOgTz3_Zy>g-F{nI^?Eyen^+t=4$E3dx0VBU;kk)jugn||&1H7C4d1utLB ze1S@5vsINJW_%9b_kL4ci}}tu6_5UJ{=RPEthn-n|0ZYVO#Y!Z*XOF-q%EFTwR)7I zM3#hnadtd%N!;dwS^m}s>`NEa2_9iy@nfO9h>J+;{;$zSoN|s6wVIqRhK1Awaxco5 zohB5(RlFh7=1*bNBL&@ALkisZ+boe{Idyy63-lxm(ZtdDiy-{i1y{ zZKk(a+smW`{7(B{^+UlX^S{AQsL=WtPA66|nb zQ7W))wEsETKJwqxM?cRm|B)|HmwV>DyjJ{2(fEyz;^m&4-#n!uw{?E;LzyGuK{>^{1FMd9+pZmJH`POTf zUG54@`sGZ#S^M|Yv3;1h<>T)aHG#ihZhWSnWgNfCAo)~{cJZn?bE}WG?+pHO>tf-t z_M_q3=N7AqC6?DstvFJ3r*rnvIaeO$)Yg0`KPP6L#P{yn{IA~}=X~9$eCOq^FNa3FI)f*TrA2HVQ7bkH1ovQ4{$4jE#+9$w@Jx2lgqV=RRizL>swpj^9<1Dfz&v_}Q6P zpu-QuMJn&Uj@$n0{{P?g`t{Y{SMUF|y8P{D@vY@kt=a!Qp6>WU{^vyb$bSjbe)qQM z=YLiWdg2zJzAtc1Rb6unqyE2dI}hcz85}rvLDYzU>EBEGe=ohN-uJv(>~FjMpNF;o z&nC}nUvFo;r*6t8^ZL)`rv-j(K5zG%HT8$|)jy32%oXuI-)1)-bY{CC@Q?H5-nIwN z6Z7^>`SlTPtBLb^06O3zo^&x)B7FN6y5#*%?XY$!#~^We{cW(C(7*q@ALU7 z@7?ph?9cyW)v^D;vFUrRw|+krukrfbM}4onNQcY?<@WJRib`k_P_k!d;e|!XRtrt;QALI|39}{*C+m7 zpP2bLereTn>-#(ZSmpk!ZT|fHynej>?Dlg%P1)kF{ku8;?@iJFQ6m41X8fOfKKxrs zg>mIAb?bPI^o}{VisLt*?>%S!`TAk@ho155Kff9jns+}x`)BJ5$9mfu)U_c zoCwQ&0*!k)|NNZ)|EJNKv+Etd3;o;b{O{A#*YW>YzV1i&G#gMpY_7S{W50gJ z|D##CJWKcfeVZTukEfY`$=Z4j*Zto>Szq5BoFng9?VoOC=XY$uH{)bmb1~y(9LCG$ z%+xGpn8=v(%tx}$?aJfh0<$;1u-u(&JZ;abo4t$q3~yX5bYDNAd7;tk)$!+>@5S9X z`@GMdJMg*P@7dGm+P&!g^<`n6jJRUmwZgKQ(q-RTc`uf|Eo+cZcVOp;cRJzdY-W5v zcgkJ%1MBp6>zB)jKU8EqnpgkhtbTdS^qMyu`<{GPoqhP%j|t7Yzgo_o9`W1FzxM5$ zZ+U$Sqe{M|+s1D)y!F*wy;7j8+T7fZC+oF!-|nw3op+YY+_U&M;qk|>@g1)(?6YNg zR(_%~jyEg+ne8WOZqUZB9gn&qBR;k*DSg347#sN?Lvk zexLTkXu&yo5&OSiE}uTHTPJ7t>4frX&{87q=D$4k_j~G22{v-LBV|I@VXIVBde62;rL{&W`Em*UL-XIGPctQsi!D+x4m z>@i{dcYEr=td{>}PrKvIoqxQq{kMDm`ks%kncI54E4zRE&GzL`{F7(%7e8|r;ysM|Q}_r|+t;`!xU)c3x7e*N(And$rG z?wvosr$$+z5tNn$I}SYK{P5cE-_h8AHdF5lr!`EoUtM+k_PuS7;#c1Fe&+c0{l9nb zgoXLlYe{TSZA|LaA;_8a1+7hX5dv-ZAip_k-4zxmELv*U}E<#zwHSRDN3wA8ny zwei-jeA-VwB%VlZes!^Mo_rU3k%Hvjq#o<4^ZP>H%~{E5<2b|J{@sra7X;h;Zt3ic z%Kc-ZS60Rne`N0GJL|umOs>tYP@k4sn|0ncvR>|(oL={X_8HB_b=MXjyPIrlu&?RU z6PqX2pxSoE{fB={bI<*Go3c;i@Td94w+^}Qc^j1%@OxYJQriGn7=Tj^_TVd+%we*k zcCy1XHAo-lUe*S?q0Exoc?xp=v;EA6J7k%y=I&i;DwVY%I+{;$ttt|*9AUXAFF*-`NDh4hTys80yYfWi-CxgU zrB_~j=$==dqIYdZVNA}k1@0fV?lXIR_TvwQ8v?Hijvc?Z=e*sOjbi(5)YN@--dewL z;a~SUJEw>@9K18d4LbPUKOai^{`8DpvChBO{8@FyiQ-a~0!15EH16MbZL|D4raP}K zH{3pN@s7)?NGSX7P4T%&wPmjpzptBbn>73P?Ba#xcdgIy&$BLn*TZ>h`*erqTerWz zv-{AE!mR-Dn%dUV0CJUz>@`uOpg zQO|3W|O-o4)W!F9uV%L_A`KQ|s}VduKXsnp*4LtqBWN#+Id^#TgqOcB2( zp5Cl~Xm{xj&YXXig(Yxt0p;jIB%&AJAe1H&6K_G(tXQb z|C;P3Yj{O{{@0C#>HE{yv>y}SI{!uYt>z=syqj-D|6|Iw2WKE`#WwaZJHW*SL$G6-yHv6P>B(m8$y=cMl`@3szn%m7g`_`}ab5!w)ve((Oi)Zy$9l4o6!Y}NH+bJ^!EoWMTU z@LqeC_`b@{!{UnK&KEe+Yu>cSbX1*VGGm)-x>3-(?$zt$`PXEY-L<-=&YoTqaVPdw zd)CIYJHIYu``Yoe=6XbbkK^0p(pThEw#7(Yx%Wvt;x|$XA&P0{u)y&xuY;YNYT3RO zXBT`^Keo$6%y{XU8A@;XRIHD`5-=_Qd%^PlsXbcVkr8ix^*nx;qhs1(-e-LH;kkQJ zr+@w0JX=~`%;@}ysN#7?j~=f(V|#qz=bbAWBPQSBvRq?oFP{FqZ0-5En{99Lm!IP( z`yD01{_|iPzfd-h<(bEa*VwOc$e6J?p+bSZf8)jtGu!7rOewjhc&zI6?>GK3S3?5P5qsJqVs$G6ICHD@lp=gHcizUAwg2>qU;2aJrDo;hfh zbH+!riTAI~@>6pouT^ELpE|-*lEnQt~%*pb@zrf`~SV!Tzk&kY5Jcx z9JZ13cYn21zT$pm_hR*HjXAG(XD{DoU)gcg?t4$)FP<#>l8=v$8i%iIP`R1L#G94> z`S$AXq=w3D#S06*rCG>N*HZVJ6EWAOa*}>lebJipy+?U8H?R17?q*|3TA=0Q!=LQ> zPAhEvyz$0|!*<7|&9ChKI7jl3nOHqb{P}B!`Y-0g&H^}o{MU^+y|Twu**|aWC|#2; zSC(_;oRoc^x8Lhx_iM=~TKPYIX_ztJxav(u>6YT{&mL{~d^m2`&3}{9g=E5V4#nI% zd77Ey{%(f5AI*=ki?#8elfA8TBQ4>YIeYo*)t^}-{N3(C&Z_ihA(p$X?|aFXzH=_U z8)H!ZNAUAR>AAK7-7Au>AK%q|_(}8KpUE|E#O;$$WXHd`RvZ=)pCnp+p?&w?nauZh z+S##-O_sMf$f3gC&F;P@es}Ee!a9LJ6%M6#JXQNdZ2j*}_O}0AByM5Va`)GbFGtO~ z>#n%(D1MeY>H5K}x7QNQ-&?%9=H5QxxZT&#{#?6g_qnD!tIIrQ$Jni}JbC=*x{dd) zEcmvdK-#1E*7k$mZv=@iT_O2M#;}oXYrn(?L+|~@EB@ZQcq4Cd|q1ub(1r%v^r;*t?q5#oLZmr<8XV z-y*j+jmC9X+}r2ttT=q*F!Bx2ga4XELI#H|Kfj(^FHgK0Q5s zdg;qcORv7XynOoy&TLB(6N>{2pZ5aCw}*x9totFX?zhHop3TVx-)?S&@$UDvf7*>6GRCP=5ESW24^g!W(Z}=h}2^ zy?Jr-`H$z`Cpr7eq_fr+Mc@Coa`pP3XBNJn)4cg>=jC=AJ9g_P--Z7gQ~gRVsF-*N z+v%iF<3D`U>dof+aSH9Hm7b+E+%*1oA@4r|7Cb@7? zxUk@xnuh#*DeLB2?9U4S{ElqJ-}`wk1ET(zErQxBhtj{LexJ`QpYQAaDgWN2I^ttv?v=T1wHonq{M~)7GQ0I#ET-{y)!I(Cs_78k^lM>Mi-iL- z`)tz||JdKo>9W5SkImaC*)O;8-yfw5+0Si`7r3o)^?UvMXhG82{@&d`&n%ty_uj^P z1rHCks;`Sv)wxN9TB!U^;qh1he!s7O|Kj=0jXxHd6|X+Cz-s>~2F=rzHw$A@z7<}$ znHZcFAh{{*!_jAbb0u1g&B|XXY(5wD`OfP(r|)$fY@d0f@`QB!5xEtqJ*Axo*Uj6! zdF!0WAGesxKS}k^+x@lH?(5+#H*WSu+85v79`GQogWp~6;iTJX7dbnPnNM@@ubL+- z$YNl*zewlLiKV^<-|Vl;=j}dl{k8DB>`SSF<&yz3zvXQrY(cyd|wf4=m<8Jat?%7_OeQd$EnQU9xJ9VeCZQcHd^;#Vf z-EBy}5}K-b1u_DvnJ4rIc3QvRQ(St#_PecBR8`iR^L}QnbFSz zKb9)o{25aA_r^^3)WTzKb}X{#U!FYA@hf|lf3pAHyff*w&(bU>cS{^K-u-o>;CZKK z>7RP+w+g(nUfeA^`{$dhzizE;eerzr*{b=8>ne3$HQ3Mk)9^4}U>hF~d#Txazl1{{ z8#n&GR1;9Vfmy&dJxQ=wpq=+(o4nQI4GW!X5|1rTU+8{3Z;t8P%QA;kw~OhQ>f4tT z%aphLc`~#5sh`|yX?GrO+uzgszFs)mEq*>`r&ISyGvSPY>e=_>_PP_%(S`;HxFov4 z)5x~f{P52mAvb?6`nKEMKK*!A-E#fsQ8V>ZEnQyKtSoDrIX5u1Jfm8synRupI^XVn zM;1F@dwfCg@SoLRZwe+o+Zo-yW#i1_R@X|^{XSNHnfv)cvTT{yzaL89j>hh-d}dwv z&3BI7oU5xp_vPMqnsk_p|LNgP$~;1sXEYyuwWj^7L_F8wlO6m|m^U%I+ZQc5+%IwN z*`|HAk@sWn2xdR<=lk^AHM{tM_3zj2d9Qz`<|Mae3f8>km;U!`bG*#PiOs)iENB0Y z`}eF!{djEh-k*1N7Wens-Yf!@wm-So`~~|FG|hyP6mW}5gGyUA1^LB7*3GwS0)M{& zjbG)TN}4xiXGq(Onb}YK=1GPeu?#Pnb9ZBL*|}*JrEi{G5x>1F!T8v(b7zu*=S+1q ze}2Tz=Br?FVDw(Y7b2e&Z(P`X;$Usvw8GeV(`7H_`ITH*nErW3^5XC}Z(ay~&)#19 zFXQoVp5IL6pU&*GxUBIgQeNuX^;m`jvmRgIPL`Q&k#uIEzQdWL>&{!mm5a@>d$*6{ z?U6#Y{q~YyuBNYR>@)o>u=-rxPUTl0pT8+Cnpb=B;AiDuzl6K=v+OPQt@!H_e{Y5U1`@xsl?wPni<)6-{~f6cypW`Q!Qj3XqIbM0!Ye#>p>gAXP{ z+G~WzV;)>!k-B1Ma%ioW0dH1)mdU@J8)qc%wGk^`I_Kt0_td;;zxNy~6@0TMRGWJwqT8m!>hFz{$vk$~w%A!cx-k2AV%~gl zdDq*k+a77_$L#oU+~bW)^;6rN22E&Z@h7)_w27@kJ}d#0Uo1X5=bgpRB$k%EKG0^_9mQ#d-_%7- zUtIrptZ;k%7rWDY9yi->e3ImzCja`J>GPT^=IkG@9lvk$ZChNkewMw#z7>Db27PM- ztGVMdbV)5=Etr^iv*a1CB+n@V4T;O@+L?+q-{N3Cc4nGU%-J=Xhir6&3^@ z=h=rH?>l2^8GZQ9j~m>jDIIb5zy7+xr(#kN@sV}o?HT;X-bwEMdS#>V;pUH%)B4z( zoKO8*BDKo(M62wD6FhBmo_)1>eyDz1vHHD*naNiQ=Vupgw~N2x_GbR(veM!`JU1%C za&&6`T79?BJD*#deR2NIi=Z)te#f`RpDEs7=)G;ifj@lGSMD7Wk2sCJ{J<@W7+3)< zez;ou{qAv4OMl+|%-)$%EtbL0qURcyvR$7U{cg@oTi0uEUw^#5XWi2;J~lto7cSep z{@n9T*5cWKMfRoX?1E-c{BDt=?5W6ga1wLsgeT@Q2K?emeZImbAq@|WCfeb)M{AD=c% zJpJoP)x2V%#S6-3_RH)`Df%&)-9F{p_oWjjTjYFO&MRy7srcA*S;J!%pD&o3vF%*x zuUGS9(Kl)Rm>mVrUWHy#r949gwcb2*ea|yfo-BJ?vG^-#eNz?&rU%XpPE~yKdCi;d z$LIEFc3V6TK3;foq5bDo=bk4ye{kPWcRlZd}kS0wjIc2^2F=b85tKJQr< zvvbp~nxCIG>Ba8aVpaR=i#+oJWyWy{yR+yDPxdH=feeMc9V z9qQ3K6r*Ll^v=x8(sfs@%S!Ia#>lNo?YMa}e&Mch! z>)g?E#rtl3oL{}gzVw>;`rVatH>%E0@_$pX;a|-*JHz5NU(;pnehbaM7k)wR+_Q%Z zbA1@zwLEk`e8|C^yX=o(;u(eu(cHT~JfFp9^*Y=C-L>O=GtU2=_3f5{N#*nDjc227 zbv(|o`Dz*5zq#~y;rE@-<(}94P&o3q`E1?AmGZ~0{+D{qE3O|`Gs*E@%5F}R6?^Z# zU;mEOiYcebq50PA1vNEUZ+NmkyT08FnprPi!qaOsd)K}h=C058taQHqLiF5?jW4^; zMn;zWdR@JE_t(z(kJr5K(Kl-~-n{XO`v=zx)!Wuty?8=iIQ2o_|l^ z?W>EC*Y7?*zAb;_fql%&8RR%;#{;`q@%d;N#r$CT2x zRm;D6z0WSUwyY?q`PZG3htDb9+w*wGlW$8C+~542`q*dww|-vvzbhNh6yAC})B3Bx zIh{|J*q!ofUP?+Qz5f+?|9k6y+hkj#eJlRnuzBKL0ItC;>V0Py$6vX(?|bBN+$9XS zqlnQQ?gIsnyW`i2=QgFUt}I@Bc=@rUfZ0ET+SeQ}oN1dXclBt^%kE^u?OpQa&r9#l z40X-#*}VGP)+FU=)?aUQetnnoA>i$~eM!lN@3U(EtTFEM?yKaRw(H0Ze$x%YkN>Ry zdiMO?=NGQaJXvVB_qF@FpFh|1-itPX1 zaQr-znfvaVal75UlaBQr>91!`{(U!j@5e)}-2L%;S6M5bG!x1QsFuDTWlL&hbwdZ# z894nrEZn;A(UDhAPEM{1{QdJ{zw=?9KBM)o7&NVom+?pxr=2U2yHZv*wYJZ+y(;Hd zQJi@D%FgKirFLbn&o|$CR+4tDqWFUT#ycNfEwo>KFl0BYz42V;+oJU!?{$9t+2Q&= zHoo|Ab%No|M&TZZq74}xM{lw}In&HtT{q)v`_pyjY@W^g{F|x$_q)?`-ab2c{@1@F z3T(SA*EG*vnDIyO_Yv_z_w$ct3YQg6?~R3 z)3MYpT(+v^X7KZj&V$os|JKM|fBo*p$xegauV%)a+db>>uQOYez8#5_FZ+6>T&~P+ za(ipUWQ$Kx^1Hv@{A%9+^+Iu2+TQaGy~f*ap1UbE=lQS4RR)R|6IO7dL3}zZo|X#3Z|tp zFOG@Jzh1q)y!>@^d(AWX<9DAs=GT6Gw!yB9eOJ8cIsW<9PN?QRw1ooD&8l$+v+v{Ri!5hZP$KX-*Wwv zq_fuQex+Wn8~M=ZWKuw|DRSFj%n`GyuMw|LMKLipM`cKbN21 zUSql~U%c_BY|*^yQ?K zzR!>P`9E*}71ez+?$5=^{Z`N1j>pO;Z&1GG?w>o&?wtH=?!BLnKi+X9s=Q9^mEsTK z)xCG_-30Zpng4iPI?ToU`@)+p{^fU{)e6*X6-?HD(a>Jtw&A1EiIwwB&l)yM<$15s zpK$BiW;?5-Ru7x>IH9i}XR~ix+b*AE_j-1>#k8MSqR&^nf8z9IcKxIxw~m>w7w*np z(|&%gb$Ofjrn{iD@a}u~cT%e(GsgvvZ+!#o>`cq{t@!)y;zeW7ynxP1=d*lv{8tyH zUz@Tp=Xvl(ItbRh##hr^Q`--G9&Kn!EXPsq07MZU0?! zcb7?uzv8f-zv`V%?&BRDrnP)Uw{Oez_f@=k_PEDyqki^{>ECMKide3haJXG@I`1m? zfSNvv$X`{&h#$=83KyBOqdYi;!XrSVy_*XKX)Ir6Z3!|ls!lAm3xTl@a5 z#G|*zWnMfp{$9(?$)|1NHg9KU$v%bIU;J!K?o?LDO)}oiuz`7!W?jt=%U~4ZOUH@`}h2fod3JA zRmI%9Cex(rgMi8Ud(T#$jGSPnkRZ@_HvP{>VH>meSCTn-rJd}u3&dx9?cFZdeDT>K z_xhxhz4F$36^;ZSmiT?#?Tt)xpGD2hjgj)Q|E{=y+4yfxx6~1(^-`}Va*ONP)O~%m zu#QjXXyndp&(hh~AAfOuyWH)X__3sAR}@pyQUsp| z&-8Yk;hef*O6%Evwf@J8ia$u!rzcwqKj+ald?tH5_1V;0I-euw-wgXSfqD1Wv!>@i zEjrwP=i7;xHHMFO+~{%ae~?|9du{gPkB%D@uRQGO-&;Aqc15yo&BmX9UbScaPjdd< z|EH#9!wo?xBmD#c`MzhZN8g>ES^F&F&vp4Lf1VxEGx?*}4pMMK&R6L@1%Xanica?Id;=XTI+gwdkwdguML#p_8P+x?%+lwb2$I-KYHJ*~`u-(eH? zo0j^|vDj!;`RU2x#lJ3tMm4$jWxVxwdY*Gr@XMKbMd|7HLgdqvW^Vjy(|1~D-NzR* zBU2k@#r#luGjHQWam8~|cPu9}+y1-v_Vm7wA9M1`U(LQg%Xw>b{OviHYpy7_$qByy zv1opFQn>x~$o2NOJ8n*oD2R8=K4;c>i+z#iIS&5wlJ*ZaWE+R=HG60Cf~VEyMbAgO zkli27f)?=YlxT9Zc${qi#OX@0*apKFYdU))J_X0i|K9S<;O(`Ic9s^84?lVrWFOL< zdu}bi=?Zt9=ev(pfr^-W3%)6Ad}_pRSBzP4?_27Bd%-u|qwya}tGyqHf%2u;p?b+_ z_kJ!iYrZvK;`OD7GgFL`yEa%)cq6mg`O2NI&d+PKKd;hBOWgR{xNrC7jaL-zS)Ai( zx313Cef|1;US3Va2^;0?vz21v^1ltg%e0?+zKAW!w@CZRhHHOf=FGjl)vo;9w+#C` zmdZEYW(UeVVVAb^SY!Capr3#9zXePS6VEk0Y?QG%cI;4^Tv^-Xi;?XTuh+icY+ras z(2?_2&5fU*w$)DHpIdpQc>DLlJ8S#-W>#<3+bZ(sOsf91s;7Ou7NtLm%D3;ceQ;cS z>wU;<{s}YQtov*`NM8sO?YTfdEB|S>b-`uuv@GX5$=9tLB_h(6O|gt<@13dXx?$n` z=OH_dyRFVIFLFQ8Twp$*`C_q5`lHAjAJwn@y5jui?5{URl&yFZ>~IlH)hX&z3}jK*~tFKeJ{#Ei`aDw8ZNwcYB*p`P(bs)cH5wcs}o9;C#oo?Rs&0D%$k*)NlJPaD4l=uD+Dy7O^m> z6~yxNaq#0Kox-aptNVX)ee2)%b?3$zim76y_bja^oYB!ruZg&KyijsUnVpz)-HqoJ zkK3xu=NUWSIQFRj!Rwp9eniO6-n{YgjwcCrVjKIuo;}>xdo%L!@xqgtweL<;@$CGd zI8RRCbFo{$?8d&bch_QM%Ia=-o8ONA&i-oht=W>tp6SRap2I0gFBOF zv)<-8^Xu7zyxP)z46k1%ud)96=cL2gozv`Ie0k`@`?>eA(v8Zx9FDJFQ;*Bb?#`AG zmoHv?Jlwwcu5C#_sN{KQHi2zxe)IGj%7kYHpnXT^bdyCAX!O_cLGrXZ&?45iTaI7& zqH|`C(wlQ@jLJ{N-nP)&yyDdi*RN;hXr-4wk6yX>T!3*(cc*E#AzYBv|_9 zS44T?jG7JB^*#N6AEonDzU{tSb&l(`_nIXBUj^Ikiyv5DKmPnc(kEthiN+@hA0Kpl z&)%MGe~!ONo`1!;cE|J67d>BDUGy?N?j4hR`-W)w+52v!UF`qGQGRZZ&nK&hwRf%F zJd-_s_ty)7PdAqDd$sXw`s)>&)ymKFWllc*+*JRk#eLIjv!$-ciR3Y72K+Xw=(Ker zwJK6pyRhJ!AhTWC%W}4@_pNVLRq3#8ohhICOf+%cl$p`*&g_koKcPoT)qa?W%pNV!LKSvs=UK)8ACj{j6muwOMiDMy+Lou-tE* zD~=zY+8jUYeD0e0y;*l`h2Ni6?Em=W*!ep@ZthNhUA#TN?abN3ePuEcZ`RGXJ)svIeC9l|7U*k?TtUl#n)Lj|$%ujsrZB;XKRr^}`jn^G1OiRBuRWUy;xbtWqZ~c*2S;K3o=6t*NZkWuz(agH)o8`Tq zu{kd~AFp}fpZEH+VXr%{kp@E zhT98YTr9laZ_T|?Z+Ci4WnD_&;(x1;RsFcLvpC&AjS2-ya(cjT+r^7FCx3L!edaBx zmX^M5%F#b-(%+xEQZ%1^`^?C%c75JD`#Ls0aXbFWrtkXQx$Sdb7rFJ6?z^V=s#0QB zMe*bFbLYx@-u%+|{f`Ih16xoZe(-H}80%;O~%rd#j>J*>V%)uD@p6 z_Azu#zW$Z?>xJs-yZ2UxouBI}H|^{3LcxlN>3`>Kl#`0TQkNw6Dc0t9;%kmG?+gCT zGJC#n#op5Oo7+eo;g#V8ttDf5z0t4g)fG+lt@Gu3t&+XY*Ram63@UkZ=J2K&$*#vE zZ(F>(chPWnS4CQSo9M$cIr^57b3}7Es$N$wm#bWRzVcjm>_IoaH}lrE^Tj{Ud7HXI ztp4vD`)zEM5od01TAY57zsb*WeZ@ApUpxQZ*>3p%@!T|iZMzMC>} z$=_QAj(>98xc+%iJAa{5n0-jM0DH!Rgw1UqR%X|~Sd(mj&5K&aOCRh7HUkHJcW(LyqEoJV-1=$$(t$} z@;qEpA=Ogfy080;9iNqT&M6)(=WAU1Zrs@@++1+%nV)RRwaDyw)pLt)N*n$#5Vq#8 zeB6D5d27!`J;NJUi_5l6GvGb?=bu_9Z~b|N&bb>W+7~?TnfGVT*^}q~=>EKTd-BgU=kMsG7YQz|NZW2__9*hi zAD?+2my0>ork89?HlDvXD&Bglz~7o}k?)Pqn67t~{op=X-rx`Sp=*r~7o2-`mD9(< z&Y&!Q7Jn9B8N;IIJ~~N!k2WaY`rw={V^-3kf2QJ#&X*TAdN(htot3=f&9z5M-#u;5 z>wDZcVZKfA`a36+Yae$cE=>P_X`|e(ijR+GYKLbSQe(*!sC)kX#q&22=ih&M8l(Mr zsZP7cT>Y!(3^p6Ddc&97|M*>i$;Ts!*QZyMoT!qqN}5r>)y~@Kj7|CL31()WBaZKS zcSO^!e_yd&&6>mK4#~$K*|%f0`S}|4bNf0kw{Na0y|?jgv`10I!-X{wWi5_LQpFo0 z=6>BE`Pe(rLh@r{jYHXk7w&!~KLiiojJdX5{q^i_>m=SkCmrkdXXNtLq}TsFkz2dJ zC-;njZqxd|iHGmkeCt*=D+-vepI&_b^!=E3Pj+OlF$azDZrrFI?YDr^0nMcJfZ6(4 z^JTjobD#Nw7F|w1C16~<_RdA)<}QopU45Ia%g&vBX}-H#(QwCFy0YHfNjbWXB?1C1$zf{CT5wr$28}zIC><&+1E#TzSryuDPLCh$xn+O6++o4lAH@<~^3>X*CN{+m{3`o3qNG<}Amv6lWi;8nD79O8( z+$5J6-hXz^tuxK{KJS@5``5W6vu?|rJ0g@`oBe2Y-0bqtH>OvW9hIoD3_hLy;2pzm z!xs_PzVE!ke_82Q!OZj5*RcPXsM0Pfe=e<3V_MbcWcT+Ej0-+E-sp`Mv9>?+Z^fC_ z{idwXKTnvgAA0^m??yYbS3=41&kkOX`Bf1A-hKAYXEuBhvrpH&usm;AESIB~^s;>4 z?Cp$>^&+>e?F-a=70$Lt@2&Cg`Mm4Rk8}Ty6kcz)w%oB<`CF5G`uksN zpDRCeaC$Ub(aheQLx3^qyW)*nhA(sWa!-_Xw0~~4-%=uKUhRtK4Q6JqXXme&X4j$E zzVo@Y-H-Es7dfw3-z$+lkv(v^yme*I!Q-<)W204{EzZ3C{Ah7T_0@oyr>)%La=WXh zen^=OnruCrzy2PnRdG%mXtMQT&74(ptV&<~@2Rsh1+~}2PhZe5UNI-~+$yW?Q*({2 zv%h^j7o*L5{fXo858I2kpV^e;Jg0JQ_M`rLzkW<)m;aRXyr&}VIQzx^ir2+zVzYN{ zjJ#j*N8rnkO&eai^QD~Yjg`+i@?p*A13Sxdo*3MVYkQUO$XQ&%WFQU zPm6hT;!X11ozLd<|9Yly@7Isn$M0Rs{^0tS9kiclPJ2ze-c2W_&(?GHFFU(aKP&$s z_u8kVjTtB~xq~*(C^uB~1iz~Z{JnSaQP5ngbmD;-H-p+%&op(Nu{`zMlvacOE`$D8 z4n}qyb}u$Obm#jk8}KYouk0&mk5&CvyUI2FvWjwh&9cr|zB&2p@SZEi=We~OdiUeZ z=i{$#Ox&rKo;^cazItIF&&Aifc`L`x4a`zA4^FteXWsLeALq;79kDja?Xh}Sto!cT^X^+6e~YiJ%j=uYXnnq` zw{?B|bGhSBcdpIX{bg)!wQt4WXNKU3XluxJ(8T6j(Lb0-UgnOp;R2X(o#^iAP<1jn-V^+Iy)vpI@3d-!n;)^!To^O2U-2?5vN%McpUBA2g>qSBH z@2Rf8lzv%s*`I`UpzoW;#$^ZPxA*Iq^u#sbeahc0*enpA$ z#K-;b-2VNV*uJ^>^k(~l#^xLH`{vcYt5lb>E;RmAc(<1A&&R{ZH-D|=D~jmeY^?)#m`bNJ<3Drz>|)VKQjc*n2!6c z9qslvIx#!P95m?t`|s6SQY$83&?0Z)DgFMva~*T{t*8aFL!w{7uqxkEEu<9<1u=+(DPc779U|N8g75Bt;CxE~YWDnGluhSLvRgFj!NS^Td1 z*6r_h#BJ3_nqN8)D3B5GTVsXX`#H<~=2n%I{I~*I-yHvH!dDBu&CAa$-ZewNwovC; z*vH53_N=qsyy``7VcFH4VL3;Nmdjahyf>FuZq?nJ;W;|bV%PT1FFjUx((wGjpy?97 z7qXQl&H2A|-_M=DWq!?Swz;yr{O<`<`}to#&VKwx*xGFV#LZui75+~;2--D#NTz8~ zVam1Q=ZaSz8r$1!yj7#ocy{0B{s(R^lzs?y-;3ax)0rG7JhS%V<7E4NGJk9)iyQWr z?$Ca6V7{#4e9N_G?^Zp#aNOGR1^>sK+Tx=9)oaY-AbYDz)m3h~fu_eEN3TYlFa#Zo zLo8~>K1VxS6|{@5^8TwVb;vHhOZr*%_P+`8`SN&kii(|2^k$+!xb( z)*J2QH@?{WIy;ubsL1 zuFa3g`|~A^B$&6CZZH<B{ipi1{$i7#wXY|f|MPgqZ<`lu*WZ)5cKn^g_tnRKJ}iEIZtg)#YHYz; zUvX4BY<=C=)jt<~yPSMB{z}@uki=tCeuh2I!#qKX|IoWXS|2;U?hrQbwp@Am=C2T6wKi$6)emB*2G^KIcMd0gKb~0CM&zu?_2Q~v=M9Oz7@6}IXg{O z?0u@g;Ty^A-Uf%}Tha|RJzjSTkISz9{eJ&^$G7Rns`7Nwd<4^cuBWF;9!NVkn(%*uLJBHcX<`rd2gPn*&bLX&#-&n zn|*f*V^}&GlD6Cbc{bg8owr>XOZ=zblg=jA)|@za_t%`W-fLLP`7YivcnYTJL-!f-?d`$(k(Pr`Dhs%#uB`z;a3!Uko zs&MNjs3U2dzG|-Q?z%f4Z)-n0y3kzAy6()zO)FCU&KKWHjQjI3@n2Ycw&Cq=`>IcY z$M3w@@j98O?8vVdE6-j!{xi84=@=PXminZv6K`8vKdJ*w8hKVlEKHQ275nkwmfL&y zo7S5py*i&aX#t0GJHN69-LAUk?!HE#^Z6O?MRs+c4{ZDT!TC&j zZL#2Sqxn^@CEw4D>8ShcA9Rkxu-LYwy!Y#eoyE`36?kr&4LYyk@4r`eOt{MvZ1eU9 z)HqC5?BzUleEG3+;#=?AT2-a#ux*{GTDs!q!RHI3zMPq5H05oLR@t*i*(-9#kNVr1 zojYQ=-CL(BJ0Snt_j6~otNvb`ef-ypXEBd={aAhc{;wAu&TqPtKX+-ajQGZ7 z=N?_hryFgj$dC`oaaBvY&oGP&hVJ*-t>5_ z@^e>M<|&+6EMHy|@uI`oJy$G#ty!InxV3eY{-bl1@2>xPvT>j39^uoQ?6y9ix5l17 znSZ+L2j?>fCGB4aK7NP3$Qd@u+p5218mU=Kh7mN%%kaw3Z>RB!zb`UAzKJ;B`}Be# z^T~57th7(}Xd1o0@j;pIVb9%)&kK{wt~#c_1Lc@^=k9KbmRBy_Fgsqh>QmHx%cxf? z(%qlg)h@f4_P280bc-6nvg%o-XYSlu|8=jl^PaymnD5p++n29+FtPR631jo#bK)tJ z@2za_v*thVT$CoxQ08ECw4cBHh}5&|ZL!jIuggkqe02Y?d|vr07tc(R!- z{qtqzs%w90o-CEK+@NTuU;b!qzRvD_H`e;=z54|^3`Tq)IO76_fcWt*fUE?ovNY?&!aa!Vb zyYfFP)+fyVdPTW?W3l}af&RIB=B&;Bf9Bghi)ov;Ki+XgeST@r^Ss(eog3|67u#=` z@FcBMzt>GruIbs;+cu__+?Uu{c$7B$?6I$FI{s{KmCnLM=M(9?@0d34`*h+VNdAALV{Y;V!FGLXv)79c&;Qk7cWr)gU~|Ni&}7@9hlg5^uaC36 za=uYD(*8~q6K~f2sDC~-)5TzC0fdq~)XNJRwQAd5^0{ixz7>D3ocMJp;>;AQmNPv% zk7~4vS8^1u;F-2*!_SLP3S&z6>>j_*(Mf+aCsFm-p2s`R>nvD2t!xw@zYuBHxDz>rXFl(`z^Kqm3`_25NYg+Zq=EwgHcpIOS z@qgm{egQFSC+BCZJdX}v+_T|Et>xzPGTr}wHP5;qbEDNwu0=*C>%sc{E zJ5uGQ$;Lm6I&0o{dgjasmfeN#ZhTNb_v`VF9}A7!?*2M=MB@ju!( zk2{{__Z;TAmKO3JJ{1cd%vC75(ZS#7Il+eE*H?DNO$rT5<#*crR@xKYZk-hO)hX#Y z_tk3$#O43qSnH{GuIYJRUA&T6i-pVX^sjep&pY3IU3V>I`#Sr~D}v6opCaX@%fD40 zs{$SS*h!^IdyYk6Qt78BCqa_{{axM zzQE$^{Bu9AJ+pe#j8@QI%y;LG1vOVZwlJ1?_h#+ZHS6tn@BEmk__=3|>GQ~#nm5Pq z6w6r6@0RK?J-K$m;i%8Wg=Klyf8DXXz4&jz^PYt5>s<>c$mje}*m!KhVH>+MznZyP z+AO)-*o!_$NORAwydml5mM)vLX8XSL|Be*8v#4f#PJDj)_BThnl4pVE@7_CJxZTbw z<=xp`SAsqmPv0BydaAYAqbmiVEp+XY8J zTN{%O9M}1KZo#)|x9IadUk^p_=okl|l38>3*qJFxH!hqnUUg@t>)hwTJC&a}?wEbP z@r7ld@kgCEKZLVuUnzb|t1U|sd<{B=WR84VjQHFG&l%HlHtVPVsi|}_u>a?f zyhG~X{MP-?Z(fhvz+^QEpVugtoIKxmVe;3V(esU+YF+kPS0%}w*tTzXS=R5# z?GbN^&%ao4e!(|qas4=(;-_35lX5|e5h&XaPz0Tx|GDU!`te_PBF;=O>b816N7f@v zY^t%H&iltZc!I3uyLs*36z?f?-Yb26reaR=NB0k3b82hW^q;+XqcEn(K)yTT_^)S) z$B(^P^YQVHCtK{wQ*7H}ehB#Ucl@+me7rBh-MTzmkI&lv&C=O#^()m5CLUEg^K|YW zn}!d2xi84pC)Xq-{&;X_R-x&XEEOLCBF)mwf#I+ zDEP+4-mK-~74p zKX$zCqjB4wZ%6ZN(_6o)hHYf8-En)q<%hYi9~UPW{)B86sVF$|8+3NibM}M%>>^K@$(hionMUg%NrLv-&ou48=tfJg?nv_b$XmyrRy&-1oh^e!trtzT9ta)ZJ3?|LRrQ zPd3m0`{vdDf3NpXvpaTw*)CJxJBwD;e@n05CiTC*@M~B2o}{mP@BiNW`_-dYS68pT z|Nrm(_>G_W?tknnf1~{`%~F24UEa0NQ`DIRE#z4KJ&pgD`qlsc7yoLr;`6rO*MKgY ze3x0R`BeVzMftUI^?yEIyd!{@<@JS{(8Fxc$G6qWeEK)ZE@)d;8Vb z_4R)fgT)ZDV0o5}%jefs9ewZl;r{0MpHt&^uCJR{`|ak{_`g@Pu#@6R*y_tLKWvO;U*Yf&Z zNghAr|9_1S=gHDuUw!v=So~+x_{~WN{>s3}>bf}hPR(unbsw5n-~YAtepJ!lWBGrM zy|Ui_**f3r-Xz3AxMuR;#z2ft>+kbtH|Nr&r`5iyIm;b5EF8a)AVE*Cs{y(QryDxwC=FiQq zd%xe?T~qT$djCi1>HAww8H5XgyXxCPL(2K@zwiE6QWH}0XQy5Bt@Ptni8^WiKbxz> zJ})^lcT;iswUTYTUyW{i$#Bc3#dJPCb8d~c^Sv|6gt}#=|8?xPN?LO|Po}IoQJp_2 zx9rQC;ys^t-?$)rJo4cDJJ+_?zj~EzSNy{I`GcI=M_&~C&mZhd2wqX2FjH98gp>DD z3;*evPY)Mts8d6TbD>f7~aM6@7e<^VT1?uixqZcrA6i`J)Lx{dBfY zAYo}$^#6ay;;SNR?|-ko|4MlNk0W`;{Pur7ylP~Zi}-uI{?GAGrMWzOS@my{<)dwX zy;!_^pSjhC*0=n%FPvBB|Gk#KcjD=VU+g~{+i$LV)Tth4bbNZv$?0qAK8n|W-1fhB zBHPyZPs^S71Un9#p2Dzy;kjGhd{!&Y#z*~{mj83wRnR?!s&D=O9PwZC&JNi@q-y{9JAK6FK=T)Ztyw3me@p+e@;S&9;b57S^e{(ed-;K+0Wu@`Ix5n>& zbbiA9Z`-!7wAxfVyHZYaiV$c&+zkQH9ygX>Gp5{>yi#{QvMsxHaxz2c7A+* zuJ8Y!oL^_G?S5z|9{8J?pyBv zrS5;<_kHcZU+e!@X&#aHu>E!;dA0eThrGL6C7+~q{9c=1`+8Av!0&n0?;`g;mVF=b zQGO3U=sHr<*Z+Ul|F8dcj`hyEk7pixcXedDycSaod?l0?u;uEa$-Aa!-92owwoP*S ztV@@6g>x?E(S3DphuW37f#qvgdYAf4o#lSl%cDtbqK0VDyq|UVE&so@ef_4k=-bmd zbLRfJ|2*>f?|t8^^Iz{T+jKqd_5OWde?R*5dj0w}2D=V%X+OETPCUNmqt~9W(r-7@ z=hq~rJZu%$GrLo8xGDVWx;>vx{d`##_Pg%I!uC(ACr^F9c49|sPj`SXKjVkFC+S*xqR5V=V|IhjVXNK3cINTM#U%D~v*IJdV&)X(# zy&h-1JfimN)z9BcE$1JHTnLl^x&q~eH%o=}wST|g&kugH=kvLvE0@oUD&O@_DQo-T zox%PUPHUbq+HyYM1gco&%$%+q+j#eU`^|RH$=gSNKA-PzzP^bg@;2fcBni;nUJeOy zDp}hPzn>K~f1goc^~^v$K?QvB-*ZT2I^#+R-psQXN z$O{?-?v_6&r?9e(S6Xe6nfbq?hD)u&4z~Gs^@-W(NZW*!d@-HAYpS7DtU>5}F+Oc4 z`8<8Yn=ia)IA74-f9#3!x=)w;3ujI@aOZh;HQcV`Mpydks7b3f*{|~66CL$v!@=!K zRr#d9D!fp6q54W&{?`oqYr6B}wu{_aceS}cE6wlU3&E%T>`Z%~y>yrV)lnoE{8KT- z_*nSQnaOJ^x>Rl73S~wY9_x_|KPt`RnV#v);&Wx*ZuYldugB|y?xIO)vPs!`J8$>e zh`OIot94#Y4Uao{Brh+{@tWT0#r<|sZ#Ev6n<{^FPg~aVxn)|jO>Lj0Nv)T>UHknm zcU{l))LUCJkLvAy6ZF9oqD= zQ;l8T)@f{x<`Ukz+c61zojLeQ=nKm@_WXXg`{%>=)8p$b_b>Z(uloJj^{dvEm-}3K z=ddQurt(3-p%%`YI|CP$?LEFq^xIk+`DJp#TcZm@WDawHBO82O=w~%1wJiQMkE7JG z{@?%qH-4W#?{$T}owoZ|zI?O!{JK4kvs(AP+xdLno*NPIZ#z40)wZsAECos`&p>x7 z7az-r+w>r}r&D}e`mN=enaQrX6{`#Uj>fl^pHkbG^D3>=Ovx&_{eWX@itfQ_mRrws z&+(max%G+TBEOwV?@f;d<^D)uRyUipXQOKf^Uf!W_xv!>x2-MAez`euwUmT#_`esD z+WWux|1z2SJo9PrJL7fH9v8SSo)h$bAQXLck+8=XMIGfgE52;$XkhU9#l4)@Iw{ld zz>0q}>}Q5D=s!O`zxU6Nq6Lax#SSiu{O;Pc^CixUDshZRmrzob_Q$A26N zsr$w+UGhWmNKoCgsq-yg9Vqv>73S&k)>AD@UFB8`IPO2J+x<@K+wJ`QF-JfxfKyps zXTwTQD7K53->)g=JDgqKZ~N^=nzPxH|C8tcSz_^e&E`$-uSMs_&Z&O4llN#QySnh! z+YdE%x+y2HuyHY|Wr_b>D;yVCy`V-ZwjGp*4sb{`{^VzrdzIE|yksW(YTqmGe!RKT zy}a|5?2ef$?lw062M0Ph%G?fcl(-*odHZh08DC%BMP+L`*&DatOq;#OgS$#h%=+b$ z$%{O_f2(C}7x7~UUz2>LwW0G?>A|btj_uJ+KB+qWj`rIVPqyrxY-X|KgZKUSZw~8= zJ`dRwY_a`A;6_o!$Uh-bH!mJ?PhEUo=A%H#my5#l_a$9Av|rV(>gtk;Q~deU>^6Rw zxWa$+pED27w;ibslCLgOd?M~Xz4Doe|5mO2&rY_U@cS+H^;Y|g&4*VX+|PAyLACjI zqXY?$<&TyMCos8NpV`AVt1QGYgHgb?wnp&ifqqMu;u{Mm%NM^8kTv+ZINiCwFRbp= zN-I(2nIT1m0jqB=?5^t(d?c)X?bHm5Q~LHbH!fV(o3>5RIQ`t5F9+GDWMrm;bEy0K z=l1_A3y%o8KT+bdezW0}cKhtLS%+FUS%skYDQExL-}mr)x@_&#{Wo_Qw*Q8e%+JbM;wm1t)_kt{_U7hMsq8g@cdA~m zJ$l@3nfKJM3zHX>1)4NH-{W;<-S;_b*LU99dQP|c*A(+d!F|_#dZPAyO^RN3G8yR_ zsV&k>e;u!^D}8r0JYwswSq1g;l#f++JXkEc^>jpR`Q6f~zb{SLRrh`O{ioY4roN3b z%rl*L<;wl}ona3iNPwKwxU;dL^HwqQ*PYWh7rVZ-4Pp(x^lke&uOr#5@u$>;R{mHz ztNn~lpVnHB+bg3LT_5+$f8KOdUN-2Pb34EI)~WNw4zln4)V<{FoJSh{pH}sXpWJG{ zskg9Wsm+$08_C@(^p0K9_LF(MeAmaxytOZvUY@aYSF6HVF6*Upm%1iw44lz%^pd80 z@u!Q9jdOZ3+P5@sX;8LKT6CCC{#V!1KdU@{igp_=lDQ$={3GgOl;MWnZ=002eacSF z`MG4J&W%-e&o+eHT7?ZGA*m=SGiPVZQ4(>@?as&CI<)zCh?#VROfM zUu(0v7d>*eQOok8TMn>_#{|r&`E=6q7N`20fHzyk`4vpn|1^Lm2)X@wCU{O(6P^F} zO?oxYuV=IK#U>mBZRJaPb!Fwx8T_(VTN0vcJ|5ltUVQ(Lqe9^V4b3 zVw2VV&t-*8zm>Us?jq0a|C0M{r-d^;KmHd~sXqGq{l5OR$h4VBKc7z5xBL6jUwr=m zKhL{;&F^k`&|a(kr2gOY`mX4_olAwd{#=jBUVF--Y~B8UzaD+x|GzeD?Y>{Hj+*cL z*lQ8{rESIEH=ECkO^+>$Jet4v>ox7No2k>4;_h^?WENPw-}AW(bWPs_iQEkb*^WM& zogepR@ArF0mAXH~e{?_e{Kebtm4`h7K^LeVZDg1GaWUnEVEfc_Kj$d?|F!;qRF8zA z()Z{-XyQ`*uBG z`ZE9Dm*q(}HYEPsopn97To=^bnWbt{E%@`2x4!PY>UTS3{^gIDiFe=`$WR~b|NcI(g5J6|dlW=UDJUw;4QZrSa%4{Ekp*G?B!RPJve-c|y+&}d>@sqjp zm1Sw`Rx3*9ZVB8c=JtQz?{}x4ADJ`z-&6hilh>zO$p3p@|L=Ly@3-5JFX`U$sAk7R z2|M|BMG`g!OrRJ9RmD9H<}9;Rvx@hfw>4|2?uq|>>w3}ui|+EedV4+`s(Jr*ef{6; zjqi5776TnOX;}8=hRyxy^|SV>`Q-M-bmtzmJ6hdwWVP#+w0GL^KfUHHKc6rE&M{;?4zf&*T<~ce9r2p@j=rf=$&$~isYPl(5v4^fhf#U%yjtt|O6b8+fCJG(C%C-zO7u_<+(&Y6?$Kab8#^%E*SI^)b^ z|2mhAA>37u9yI$o*|b=G$=THVd(xFk`%J+%sqQ{4bFQqh$eMY$?dOd7Kigbe&1Du` zo@ikxR?FpjWjZhG>9Dm9tUWK<;}VwSeLL)Kn8K~l<*GgV%G*og1)Bm_GcTu_AIs3o= zJ~O{ffZ~-+pG3^H1U=m2e;g9uC3=Ma;MB0Fm9zIvdvwP5{Fx_e&!$Htb^dAID`n{Y z@A>@tI<@?d%)8ZJzHG}jwLftneQs&kyr{C9sh@oxw2D95IpH1CL>?!xt!G~T7tP!8 zk$I;m(?-c4>(%j!M_PBxjk|eK)y5^WkAG|7V$i_u-Mp0Zoh#0EzS>dv*y!P`2dmd^ zi`rMnVfOJ+TgNT)I|a@MwO)U`zoJV?++6u_SGvHbe!E{8GoMJWOf|CHs8IR3?N8e5 z+_0FUld7UjaoVp|h&<>6wKW#7vq&jsIj>uxDo{5qI&Wvx<-1>c>%LFz)UHUAa3(wnrPZ2V|pJ@GNgY!f=mbFVBJmaW)e7s-Z zqI^<;AM-+vrtOGqy+Xdx`u(2GpUm|0=6#N?@w@b5=j2CDEe{e`i^talu3Dvg-R?`Z zXmi*+>yOp{emw3!Z+?F#+r`Oqs$Q*}x#HsF-e*z=h3~s{+*)fR-=_0F|NpoApNY0_ zz1Nz}b2qED<0+hVzPY7cw*Keo_-BgOwH0E*CmSXo6M35LWm9wh_H6;VrvDfF>q2De zemrEoeruKI*4I&I=kZToeo?|seqGs=HO7eidBB~+#QVxW(0E)^yMds`t>tryy!PEY zQM)ng(BDIs{q6S_onJG{S9w?1-*uVKqH>f=r`JBRb$M2$lvN!2eNngGDaCL1>;Kp6 z-z<}_@W-#_aj$t-?f1Le6BIXQ9co@3Q~Z4U`OeEN>t2yrP4K1^u z5BC{`y}5F>wlL{qaNW}*VO3`{*I2xmI)C4%<$0=d+s;h%{(WG^t|Qxh@8&G7$eP-} z(WSU2IsS9$cEgIh=jQU=vP{|-XfgZC%Gs{PN_NbAW*lq(Y+Cf0-|FV#pgZSY<{ika z?>OsqRj}lzhFtNJqwb{(f_b)XN{m_OUfd=6xFcci9j($!?*40D2tPJhu3P%~-|>x) z^kzK^^VELnv&K!~$i+)`97mEp?DOs%`P6l5t^KqK8{_MKK8<6ydp0B4Xy>*!2R=SL znVn~_@6##mpKa>eNuV3!&n^>~SrJroW`<$v^-~pxS~!0`TOji1gp6rcNL=DfsmQr6 z_I|&2`tsGhjFao{IN7!TIQqPE#+`-~)fZWZ>KvNdcytp*b>{`hSr(-n>zZs6cEc^o z^NO0>>Wl(IfE&llb1axS{~ ztf{f*Y|-5lDhinwnQ3=_S}dPq@$g~jl^aK9-)fhu$|yX*$X=q^EPdbnUPbb?!atFc zy`ei))92TgsogeAoBApK&m-~Jj`FpuoPXW{cLuT)FK`4_zh1ljofF$LYcG}ARUNm^ z)_iwO;>zzzn93Vw;22RV@ac@Ozsd8Emae?xwC8zspQw!BzUig+PB~|$ zJ}Ni+BoA-aE^uf0argA>^*{FRzme1}`u$#Y{z2wsTTkQXen(oT9QeNPoaKd&(KFaD zM(pjozjMvH-YK28)>@T6x+V5p^v(K~`)B_Ad!`#VC){tg+1jGKo6(EPlqN?UhyTT=ZaTbD;)U9LQfQ~j&~oKoOm#K z?p(8qrC%~1Ev|)1<_ekN=$-Ze8pANcNPL-Ffdm-wclJ{2MOz14HUzh)~*&5;3s{Zbgxx-h(;!?5j zlETsVwr*~L6BSd#bsLwQ4n82% zapg`=i;8Zi`Gr&FTT+7a6xS3U<`=RodeF!oR@XBD{uQ(TKURo%?Iypvt7*5#9m90pMP}xFD}T-{ zx02I(ESd#sX4g&K@aMF+`HsXhXI=7Qnt4~RQl4;i-Hu0Hcht|FHNQXS_piggNgmGy z-UytyA>*89V+G$xGqI6 zD%*U&cH)dhRX^-SAMxLp=GNU3p!VxSL;t_~&#Rl?b1VrJf7&V9d80r3dSs~4KsQkO#?>Cnh*KU69mpQQ=)DK#*C$fuu za$zgkKX+MLm;X~J0idH*4IZX|7__M*t*#MuiLqH zOZVo44_AWypB5w>u+-x}cr;s9X8ZH`^>(+9d_IwOzWs6OGMPQo>z}z?=}T0&_TiY} zx!%WGT~8r(>E@XdcJh7hXKNuD1nj~R_XSg3-b(!4JpXUbzVF9o^TgMFy;}3$=lQ&T37jgXu=cG&!lG|~zI%Ff=WkHD-kq5&>Qk|? z!0+LLOX%QEYej}-Q@2AU37u_n8&q?(E>1y2nDS5rcs@|$(zG;`F=lLyK z-=}ha$>uGJOdlmK_0R6SRa@*3U;p>(smnL-%t&_L_y6zv@LDfvCt+>IsjN<->-$!z z-T2)6_dzrNIqlG?xeEQglE%w6IbFK3F`1j=(o^{vAK9XQwuM=$C376wQx>+myy)}f ztJ||qJ~=trc&3kb*)-3Dt$%(w$=6S4W=_cpQ+k@Fd#Jx;-WKtLYhs*D7n!l-7hKM| zEAZU%p100M7xC|(j`FJ6|2*k0W`4IMIPR&>u?bgp7#!UnoaC@b`!u)yo(bU|N5y{L zd2Tm7{_3$+EB7QxJX~2l@$RNYpZ&F8cNE?=2Q|N@2+ojpc^g*qJydzw0?+{L?l(y_ zTa#-ZbcJiavhHV}rEoyuj>rYqhkA{d8m{sxT25c;b0sa+>)sNDMZ({pQmOt@a%~&Nz&SJIdT8r{WR>w=P z$4(Faa7^dkk%P@g0;`m=wm-Vl`I>LdgJVuC9Q*$&UZ1u!Zc*9ZifNzE>Mkm)iJ15K zjC9_Pg{OZmezm53MeO;X2CGGjVtqbsp8r>8{$ZmwmW7{_&#sOwJSuv1?Uq8EfC9RP+>};P)j@Yh_e5NNh>;ITd ze)sMfLk{tVmBR%J~Ufps3 z)Yg~U>-TIbdK+1KsqX9Qc-?;=+U-+BzxRIJ2pNBNU}sXxIv+p3<(%l&?>^PGmbn63 z1v!p=@Z9-<>$*szKlk}5yp8=`2i!#!BU_SlE*Q4U8m9F3e(7@6u6^~)PJG8y`Rb?X za*A?QXD2Ej3-CQPe_8R{Pr>gt%`-H6BF=Z|qLQI{?bCpqoDlBH7R9QY(>@ztpAg`% zc@eYA>O)(Sx4bf5Uvuf=qr-h47k2(@XyDt=ktUTU`+3)7!A8Ypk5ZiwXi)TqbzAqvIr4LSv51{_AxpuhDpEad>U(#afIom>o1Alw@ z#p%B7b+Bps@;Gf#*?sxjo6lLTc4D!6IwiO(w(RE8>zPW5>wR2@7XyXl$t?yThfncK{3wjwfa=8Ci08zT}!*ZVx~ zEIjeG@TeZEcKn?O5e}E)O0R~d24$Mx%2?dgZ588^H1%Uv(Q(=GCwFEkt6K`ZTGF>8 zXxf{o*!D-eOi?n^)XrNq??bD1A3f43%*}C&V|Bo1g`h}%!xJ6z?u^k(Pf`2WAIH{Dh@8?bykK22)_G}MQ%i5g(bo+vCH>_4n$%KXH@d_vR|^&yFh8-FDAv_08$;6~DP$sr&J; zom=d)(~j$v=WV|~`RDL+uEcx);AbpZ+HsCTn>0`1~J%Cp6z_*IKOK za>RZ8pOv$Jf4aV>M&fe%yt+B+eMyG?@lJPpHZDJJquUf`m~8LgR$18g)L(~1{%E+p zzsaw5g|l3S8Ufa)BBZUo;8WU^J%k0~7fu(ctP zx^XJrU$-nWGyfUkD{{z!$#b^+`m1_nM{L&oIO`kKGArWds1;EDD9pMLjFnf1m@={HmglvXmi zADa4bq29jB3Ps1;dzBi0gNBvX@6!LBC3Di)O1z^*{2s%_%jMenQyWBDKgb?u4zzI) z>C~LV4H}8N**0~nYtH@p|9`s=^I7Y>zRCaA*?-BRoHyXXUC7X&I7@{>&-+joC7qTV zmY$oR`(2N(uYFoQ=Y8ehZ~D*QW-s~%8bkJ(X{5UR>B6Um$;YO6pLkr=ajW-1q@R^} z$E`Ii$GZwR_}_kJh+X?yWUnGP(aU~}*(|xpEPuhng2?l&u~%;m z&d%c(UVl@lNG<}tqC42JkN2PN?hg>2zgf2I zMq{3NVroI`?`vB>=DCG|?Rgf=;&Wx*emA0o8v{!ViqO+rvsJQ67RTVq7 zOw|5eCw167^|1e+D_71Mrtrsy{)u@uf$vf%yZLmxZC%dt@~;-?FVwHo*>+?}Xw5H< zwH@oPoUU18&8waKEQGu6)#C8HsH0+Lo}o9>E4CN@-*D7@_6C>rzF&|0$=p>JnE182 z?uldL5y2g2I2?YRQJ!_(k3(WBlXP{-);Fo{GQX7c+^hLm9w@BhkN&##{>G#8D`jo6 z5_(n~m9x&d5?=R~ecLJ5`M%qvE-Ssbsq!Lp`zK@l>ZmU_bf#^4m>Ifzwem^xmpZu} z;M(Px=+@u=8n(?^v9?RT;z486)wwQlZ5y~JMr;DL(c?_HPxdT7vD!1g_v`EXmlZzs z=TTg6xAb~!X!xD3Mo?;<^)L6~dF{Osyj!Ln>6R{z3N?M!*bvU0{_k(y+wAz&Ynr^? z8K1LQ{Ol;(v)_yO9z}sOLn_NNw!qz@_iHDvsQq>`UA(40bn@){eU|nc4&QNPmkoL8 ze%np&l>2{=E6>hKY|S%rk^lOb%W%!Ko%gCHNY0LjZLH6^Ii8CNY{t|5 zguH@uf;&4tn(g!eH8U|cg~#? zJA-ZN735gj6A!mdb$(u$-+8O|5hP=LT&ut5Yxbojo=-PvJ-#Qfb+)a%TIA}ETQS{9 z2OI8rZGL|ENhYXuRb9O$CmrgF0~}}8b9|Y$;%rh7XgJ5%XOCsa=QtIiIot2o{cd8_ z&f?6MebTFY!oU94HV`V^XS$aX<5_q_q2DcQ(yG0*Zf|@hcK6x-?O43 zvK0RKEm4z8sC%_?`HOE+3dP0quR_;!$a2hBVOw7-^uS?htNb^QYFpJ@fvtiTt2k=H zESC0&zqoTD(?@>qv4U(#(;$I_vlRH^f+F@3zzP3boiW#bD3mTE4=mhzZ>5~181MA z44SDvZQ_nu>c>SdP4>9MZ~GB+-4HU2zo z>I{3>#&OJdT~%x7>Yt7B_NTWdZJ1;t9$hsFGz5G5RT5}idgEEM+h3kc(>Li@v+wJ* zXz?{0S_=*_sYPvF6*Zxv@Nw|`Um96mVysMyk;QN=m7w)^{$~iqsTyoEA&q=|P7q0$!{OZB3i;RZ9 zTZH{iJga#=xBA`At1;TUewcCG`^5Os`-sTBvX86d|E@}s?z~mFU+H33_aAn-iiD%b zW#K*I1!hbiL(lH{n7se*x7E3KEH8HzFK6bnSn%ogw-t-~w2t-5$D8KIuUql=jPd!9 zy3?Q`7glYr>yz#YZIwQ_IqKX_$18omcihg~{dD`r(AB)L`5m{;f`+j}UEao)-Bi_= zayWC(1C*FEz=^qdNe*JP;LLfB4{YM=IF;69ojK%jRb}4y;`tMQ_j;&gZQdaG{Z*D{ z4M#t_RON<^`bz{Cm1%><$KoGB#>dh^KYc!Dt-oB>x-92lbi+i@Y?GD3H|G!T71AF! zoz|QE+xBnbMdN!xxsdi%f$lM>xlwuc8 zzmPu9@}`mcIvuN->jdT{*Zn%8!v0fI*xl@hcHXOJH>@;nD6E>hG<;?7SL62HHzyli z?9Z-FJNCr+#b&|jRsu=M-e=D!u8J)?wf=GI-$j|yQ^T(8+hl&kqbZ6_58e^4zw>L- zinGG^tE_DH-TLwMdi;47&9`?a``bl+4&5%S=A*HrvLmE=sjzu;%ug>RpZ0Qr)ndvt|dyb;fKhaGrkMq+iA|XjNXWNiQ>I-u~J%x9;jI%IoiK5Hw(NTCl(K*4kh1W`}p&vWfV5MA-ky z;e+36*1lKgd9<@jZf$ybrq$oxBwbk%IMZV91*csh5!T__=jJ}@DzV*bH7A>?YQxT} z+FAdfneW%E;N~=1Zl3co%xLYi+E*)=KQnKiDwrj5zDVX+ar27WGls`Q!o;7%y!mjL ze|=cg$6ML!pMG|hJLmqWbaB``e&Omo!L74x<(GX+Oa4(KA)*WKeK!cM=sf_M81tEH zWh!0JpEtMk+RCgyHUATRhkPu$thCr5^&f9@MY3&yDFh*0=G;uB?x)`tnDUdJNk2lRsU2w0h%?gPx%e z_Zb~$yC3>OWc?||5mEI&KHidQ~j}D zg6EzwUS7Loea*_~{ThjX=gC)Uv^6X$PV3Af~=0Qp7xK545x zR?LjHv^{7QsQu|tLZ&~zs{tKWvlEnsiG!@b}K=^R#y)Z2bLhw|M=Z z$MT=`cqNUN?0D3r%@xL=;k{?aMXp6Usc;u^`M|5y5DwI@ciWH)b@9u9rf3l&r+p6-?;vWpu0%T z^Q%JlP92mso3Oaw&dR>yh_uR&d(P9MvQ|Et=q{&Op|Nt7&Hq22D_z~5J@T5Swk*W? zv=yv`UhAqbsb7EZmrG2Gob#86KKI-6x5>O*VQbi@HivVs7e_MkzkE4o#l+&}>GNyN zgs*nmR(yDH>V5ICK!w_ZTBo4y6?Zk}bxGd_mDBuRzHeEiaJ@caW5A{9E^jOTE)sjU zYVn;cPUR+3R+;<<&7v-p(Hh$>a;{SbVOm<6mF4UCtyUz_8@S1>4JYKAyMl zUsAhdU=#df)uY*$4jHy4_{h)8RLSbz?Im3+>Rk0K#e2Wblj}7%r~f&lU9XaL+I>!B z&DN80@g+BuzNlVGTr6?sWZSgbFrKSQ(Lb|$)_>!V{~~odY~#k<2$3}p8BR`=$Pqc> z7H{n_Usn7^VfrcS(-Brj1K&u*v#ZPu=S!OtF7sxJ{DYUuXSCZs8St-mG+QMc?V?*{ z_KhJ^84HUe9{zt&#m(5)NrGd5&o-;!_~5i zH$Gn2E_W*L&K#>33!0NU;=aBIEu>tutVhwP{@>^M*Eigc((5@Qx*{_2%cE}nbN;uT zTP|xY*!^x-cHG;QQHiOG%+$5kI2}EENHcg@iuj3~2^STU-8;q2XQ^f#4?U=OcH=3_ zCm%jOKAs+AS1BG_a&gbEmszXVik&|3q-d?jg&f&frfTp?VGTu4%j44aN4wWgb;-@T z^!ifejP|Q4_TLQswpOd371*k5$l)ZidQ-^hzpqxW7n_~GuQIN6@~R(x4@LWH^7D2) zY&&{prg8DctLId=h#!}$&Usq8c#qMP@OCA&WgLpzVI}J?wnmSzgwVIe=WVyIb2&TD zy0DJnA*158)akL;RPC?p?)$#?eW;vV@}%|yrE?c{7d~HbuXy>7=-C3-W6NW=w=cJ3 ze_VCocK&7opZ0=t$D6MQ&N^y*Y?1u=<8?m{%ZuIram@UbTCq&AF8e3WL(Da&b+^a# z+r6=0Qn}=s<%9Ee-!?OSDw(oRCF}V09r9H#7XA!WPNOA?|iva1y3i(ebl>5Q`%vHxgyF~)$6rZ!K?Av|?bDUB_AsXIg$&^|8tvXWr9M7XIqP%SytUhItt#T5m3?~7XKzp@$$A(ETDega zd0J<)PvPy{?N|3o%=~t8Ehtka)VUsTdHeJA3HC+bx--wGFXi2*$;27H-_V%5I~?afwswrQfd7oEiFQ1>aK<`DqrfjE}czsMj3{ z1+82S`_{Giuakeg(AQh+&su!vEMG74CAkhX(PyeHvPf2ST9-J-)5@D0j5$m*w?=^}qW@`g?cfRh7M;68z;}PHq3Qs@d|5V$fvwmb{#efpsrK zcSk)9mwTjH_bTig``%C9>m^Q|-@|dYIk^7GmzS5VBg85qZiz7pZ+-r5VRp-kzds)L zi?3d@iOXO6s?I!ap_myC3a>wHDXQXiJvvW*{vQt4u-MY8kB&*_>r9JC>a?l*^>TUl z-|zSLKbX2N@PcgFjl{^KyrCXte>B|l_I|yV^mgm@bAPM;6%;1!e!ERO;we|+{1viF z;iidKU-#GldCaQLxOU2pCSmio`j6f5BHsFYOZ)`qFL4jde)>7fCHKui!A)hq>?bGg zE3A6E_4>2fiy|lfJJKzER$$5L)lJ7kPw%+FQu+Vs^!Rg`kw>RK=F5z}w8~24JUFfv zh%ps6uekfBT>kf^tVQ3{^8)|KS&CVo|Nj+>&Y9S$ekAp3&NdC3 zB`tp1iFun&s)-&lEt?o(T=V0@qgSif>t!sq`SoJ)&#e>R@BJPZ_IZO){sjjgpOXeZ z`ax*|G;(O?*f9HXbl%R?e}A{1Q0jhib>iv!my5kX{m_~Nv)|X=yQBCpCh>8v`MJa8 z_bS!*uWU9ic8$#0c$DkjyHIZ_%koDuY@2kM5@m|k$^}$^ILO|eU;q2|)b{gJzOPu^ zcZ%OS`wo|lsCTZ)&u`*^vx|+_`Fp4>G2i%hr#kn;CESN!{yHO>J}1!Oir(p9f7?)< zJs%E5-hK7?A!tFYgmB}1*jWHh=bpXI2Mr``H=kL^%cb;plDFQ?rCZWEZmqR|%qi@a z@#9CzXBT)G&-vdJc-LLDPU3y(qW_oY|C=Jd>QeLcJHKNJkBZJb#c!Ima8*|Rl*)&# z;-7YEe0QBVQQ7@j_QE~A%k`H|yl;9ot~>YWza!NhN3?~v?!125HYDuIv^yo2eSg+% zI>!98Txq}IkF#ge84?Ax>oy;&UbgDz-|zR&uU=DJKdW`04y1^>09p$B`MP@J>ynyYJ|hU=>a!SJJ5>M6R!$~?EY=TFSjM4 zTh$ANvNQ8ReWTsS*9$H(YkB$m-R|{2K26^rv*D1jz1+^3og0MAR;S-DILtd$Hd)m> z?!5HVf4|?q-xPIODtk@fn=P09ezI$7>o}fk;_2-(EIPo*F0v-CWrF&;8s3{#jjTWP z7i|;ZciNKIacWZN^2*S)bv({G&r8!@uiKqxm~~}^Ptr3b&fjNvqi;*FK0 z#V)ydtB!>ptXyg;p7*G*^3BHMpI*I;Qv3s2kjQ8laH-2m(Qi2G?>ptN)t#D!TgCVNS1|tg-~7JmdE4(Xbqm_A z+SL93eLsBP>#hE01-5n`JZ!ZlN%LVE>vK_Mx1JOH0dvdmRkA)2Z+Uo-zpviz3|27_XlFkRTBP&zv-Y{o0$GdsasjB5WQfmCZ4UVV-2VU02coYzj2Nt;pc}x zX6(v`4_iqzzT^0iHeI&-j-h?X37zlG{x%?shDVSQIwXd8N6UGW|$oTfSyy5^qK z-}(IH?GOugRWp?&!96?u&PLZi{(I1Cfmr#Y_ucpYt;_rtm7`szc+XiyE32M=}0*6#a!d8=2)t>DYYR&%;av?hDWADU6IQeeZwnND?XOOEsD zt*W_rIsEjTnoe!owSP`D^MAf%=%%m8CT=`6{#TLAmsPD{AFm{xZ}V7gc1v4Nw=_Wd z=St^YSI#!oU%7aF*^NhEA03ccw6iaexn9|UcSpK-Qow|+&SX)q)v^h3+qPKkSUH7~MH z_s^TceI6-nSrxl+W8(_l+gH{;S8EH_rMx+f_5KEBij5v)=ti*8J*@l~d&wyjYZ;x`b0$t>j|nhqd{&t9R&6 zoVWU<6Sr=NO#Ppatp2^PpFIH$x)wMK&9o}bQkxX|`K_mT{B-HJ5qG<0FZ$Cle{w+a z>W*7?Dq2L&xw0&|)}Iqs$+q(6(&=%h$^_Qt?|eEf>EluH^U43dxLiq_H~S7~I9{dV zSWLjKSF2VVebkG)lQCt5Y&dH?Xw_@>E*BQ{`A;r+>z_Ry_E^}@LUDcBsU4!F8tbA# z-6IEoj*benc)uM`}Zs@2%KtS^g--G5=YIOK#D|M|1C;3Dq^{ zFZvig?KNZlkHhktIQiSJ?)rD-#7<$03GPpNi)8ogY{@njkiQYn^2j9rx>HnVI^T_- z>Oxx=$JMU0EV#QsJ@ZM8#3Dxi)2|ud75({oJ>LGkbxWS$Rz-~$XVcc&$*b9~&XTYB zaBwR7pHrrW&#JsucYd$Qu+seFNRhZX*M?a)7V zxP48PPNz%m%T-&CJpMC(`^PWsCZBe~`1RuI~cXUB~m=*Vq4j&6>}*N{#tp z`Jz|5p3TbsbbH>T=ibFnw_US+vS}`OCt>4HR#1Cwy7JwP^L6%3T(|h$RJX~OmrXX< zvFbyxqDyx*m$;~{P4L;vM*7yrZiIeLWHtC{)GuojW>%!R?3ZEQtaIOP9N0f~ZPCHE zN9Alko>+Y2g~Vw$yEDqC`sdxr*(CTsV&jGG`Z>F9hF3neo5+7qF8-`wbaIqS?(r3k z`&n|sG$O2hwJ)B_j60g`zTv8j-6~eu2Z~<=pIJy8nKHLX%Z){AW@@~wLy`9UPm2$S zD?IX_-|SNN=EdURoG3Gwk5l3|en<|sc{$bppOi57#MnO*F1df`{CPol(zb~&PagE- z(Rtg;V4tE2nuXss;pOgccZ$#J`q_THGN)nchRUFFzozq+&*w~@|6^S$_s!{3w^Z+1 zae!<3gpHAoR;QNR|9$xg)GgRyS^n{;czTi8=QS0lPF>9Juue@65j)!wrs zaOG6TofFUSdU2W;?fiI}lWVo_(Wz@v5BG-YX}r8Y_e4jP0Mp-F+3V-(tDRhaM~lB= zQu{RNTWeStF7|z#8Xk8u*L0mk`_+S6iX_b6yx;YDoljl7>`bfpzBW_scc*D6%}du_AD>*8QVr z7ANy{{yyp)JZJWYSjqFAn-=~DkCB5jrzp$5pJ(&M_W%33{_~GT-FjNbdL)BquHJrm zcJcDt`TO^7S|xG+VQP}u{*RHay`isFCTLjLOPJ@ygnbO_%U-|N?7QXtTb0k}rruhc z`{a(MuGvKSGkyH4i`N~_{{$Mb`7ifu77PD$#WkDMd7?Yh??|q*FW?LHK9IY1>$O#; zbHDb^;eY&N_x-=?9wgSRd+TBG{z*l_y;FyOuTeX0_;}XAV1HZH&32aZYCjJ1+t0DL zzP!wL^^>6Xs2?#ee|Vg)``{+Qa_QGe_4#X7?z)wBzTNYh2hV)|>!mYta^Mx{nd2OH zYQNw8c~9!P;%d(8vnqcSwTgzlFtSx&WcK{PpKlKscWug_?oexx@uZwL)uc*yo9J$V z_ln0V{?sKn8k)T;{G_&YqO!Z&~~3M^KRbz%gM$}3oSM!_wY(v{kiZ`L3hfpPyTmp{JRsnS1gr(9r~|g!_;Om+kH8w z{NF`P{^V{{W^}Sic9F!Fjlp(BJf62dluUk{HIeu7jZ4cQi@?>g`0q5I>I#@}`Nzc* zyzcY%J#%{w+G(^MbZ*L;pQ|2xirWiX2>vy}MwjPcb+75Q6*K0PT=HZ!FPj+bXQ?VY zReN&nm6?{sY5O=&oVB#;_tx8)@~`kbuUFlhXmHAOJHTPmeZb-OyX5*Ga&0V!yIO53 zKpi?CpS%**GgXF<_GR0;eTO!i&-l8P_lUr`zXwugrcOJ_f9&<0{>MwN?y-#HxB1`@KRvkf z{7w!2#m#?(ymcm?*ZisTz1;+~MrCcsMfu;aWFXxj@R(4BIm?c3KfYY{7w@TvpysLr7ywimO6I&bZXoo>FRfPYeP;<@70d#7%TnzQeU>8IUoRnJJNKQf&4ML8=+;!wj-YRGnexk*ynVZ+vxG-6QYN%8_2CSqjj4Rr ze*}J=IUWD;!ogVAeuHUx+E&LO-Myq`|M|(mxQ|Pn{bQak@9(p@bXjSmU(S=&mXCzh zKUK~=%(pPqH<0~#*jKIn$37j5|Ej^Z>qdIac7X+v3k@C}S#poHmm{HkYT=Jr$#KOurar%D*l*ip`_n|tev!=<1HrG33iFCCgx6%boEQ7v zzvGEATXDy?>4yJK>BmRiG+O`XNRp0qZ)He9$gTuC!$~!h&s}QcIFc;kdFzYsmAu2u zw+>B;y!v_mznAm1v~@n7GMLx04OXDd2p9ZNet%C@%HDXSFgIY@>-yl+X?^`Z>vubH z&aEok<9Q4^SqoEji?`9^%Cp{Mdv4x9$ZTO_6y6%$oV?pbbM1hwR%BSf)vOiVN zxZ3{gP`n?(Z}-F4Kjzn|)xREo+c)2=FhAJ*x%#|MC+2Vb^tiwORdC%gUT()IRjUk< zt_{K>`g^<7)oU47%CbnfG#s`2c7wCxnTeYGY=>k%#d$>rVhN}8>z_7Dtc|#FLM}cj z+1*>0Rhc4c8BDUiA}nG{XG_LAw7zGiN>0=6dUS&i?6C zpBK?1YrSpO%2JSG@ERGg&IAY0!lMQ|8@+Q7^KZ#83U9srhv8aeT|{7YQBkdVZh@Dp zQ=4*k$9yh*(Z+VJjZ=Cpb!W}l6{-Hn_}imnmyY|(gw=?cml{8xdMBrA`JaO5PG_EH zQ{y)(O&6CfI}+AA;rWxvyDI(cUI^w)jW0eW{&%C}4CfQh^3qqA6>d@NFG@T;=Ue=* zC9C2?0{+gEujJ5)YH1P?PY`%3bCg>rN_I|$aP3C@_bVQ0i+yJ5wcs$kaiVc=&Q$-e z24W3Yzcp80oxDrb(cPzJs{O4+lQrzuellFY@lA+w@y2};+%q2K z&|$% z-F~O&=#!I^yW8ceR?Gm+LA<^$xK8wL(P`bfjQ#q2ZOPzWEwDoOizSm<)_2Pze&FKD zfa$X#c(EwE{hAfFx^I8po?9*7d8!~#aAKcicd&PSa?X*Jt<$xtk6w}~`{bw|9d(Rj z--pD^jjh*LRji!-yC6yM+0*6IEZ=+#{&(eU*^4L6tN%Q@ajNf6m%8k}SC5xR9C5rd zEjh8ih%TC&;N`H1`Ne5#rV~s|8&ceLzLqMOgvlN2c;ux& zAtQ2Ol;wt_Ze?3edFuRPnz!-MYXzhB2kjYgwJ#-C%X{8TwSKxJG_E#d$>H`tM}q5~ zNnF;OwM{V7_3i3Ci^`l9ojvOE*37Wr8f@ERn6rN_Zu@x%N7|K1;M6_2~II%mQb{T&aQl74)6xOda`iO32Y1SK*+ z{o@OL9j~Et>6M(IX8+Q~md|S?p;I+`Cq4DftX_UOxh(5wsOb4=VvhXZrx@zi1mEls z<~|yz-9r#`E^ z>dqdW(dBMevqJEqMD!O!_0N}%+dTbK$TxqN3+L-1Ey>j$S8geGE$ZL!`O8LTnW(cT z!>i63rnxI?9C1{a@14AgY2Twq?Yd4n9v3)jb3*tx3cP&Do$zx(u-~%}s&+q97h6p= z_6_}{VQ=^%`S7ub*1wqs`;Oazp| z8^e?gs=vK?G_U%d=DNM#Zaw<<`@O#1kA~BSVpF$X4b%R1D|>y?_Pb@;Z9I~fN-rrR z>t$5F;KpI|@rdxz9fgmJj#|Ilkz9DE@c7oiuX^zDC5IDB+(sNU1* zwri7;54SA{u6x=O6O$9tpR{N8sZ=q0yA$(uFLSSCHX;N*8Ku5v@@z9Q+jACr4HG#J-b zoZ0+o+bab*tD_U=85*AYc|q~T%?;skMV=dib*?Uo;VwV-P<`&B6`^%k8)UV!)+a40 zb4rvG5Z?N{vH8Xmy*;2^#8*}ZcZbJSE{!O;=-MqB9)F?CIK=fgr13JW>NS8a z2Zk0Kprr@eOln!%Ur)?l^UiP4w;NAvO>^Hb<2__F=hBJGt-)Oe?RK9+BoDjx{s}q8 zQ7CY%OWmpD%i?}}>CZPFYi~0CDR6b!pDjO>PTeDf)6GhI1{sF zY5!clc@6fFwk>iSmv(zm!<4<;OP?bWRnob+(frQ>bBkFT6{$@-W)^KjqK z7yA2`tow1fy+t?vjbP5z@VcBS^DPULgUydO$aib>f70gDEiOoZI)9htvQNftr|ga# zVyn+`5SedR^-S>TMVsWOXV~V}uX_3DkIZkDjIfZFq)eZfGKUA*It*8n^yS}fIB=oQ zI8BeMSkT~UIM1pV02#odSmff)j@N(ZaVi)0p`EANsU*du;i z>bjL*K8-!oifc}IOW2&yise0~(|676){>10`TB6>rEu*!?aC#=vqNGl4)$zx7wNz8 zB7}KgN6D5=f%kF*a%PDCmyo{NJ-4P~^{$Mm{xOL+A87~jZc1G9ON9CM4Efn@t_P+0 zCdhOiJl3ZyRo-Lu@0jetKG`XL*3I*#E>eCyFJe=0%rPbzS*O*1&YYaKQ)82|{h=9l z?2~sWg=NQ8W{8@XYX7{bcqDM{rm6FG-Uyd_Ic4(3UrL$6-oIDxII?)Z$E`5KKCFD*)Iu3;jOPqn#Ac?H4at#&^iG$(y~ zbF*@`X?B=l)t47$cbumqdi0o~f;SZzFr8IOSX8!|W83uq3mluf7CN^(U70s&TlrX2%w+|MTNyo5d~us1{4kpVHGL zR$NpN@esTf`77s^s1P_SQS67Vq$!`ZhFtjqATt-m7nY zaDF5aKXGmHoEi4d7U~D){9NdMJff`Urohvsq4Lq+2q!tOeF1F+`p$leS>0VdusUZ|hS#l#K#PCym7j5ENs!ARjq$gWs{RGtup(%H2sX5 zjM-EFyE+dR?%C44EY~F}@b@Z@PiLq7yIcn9Fos`V_Fi=B?RN#c5>Oij#0QhZe1(KX zW%CbMEokPGHuG_LyML+EQNyKa*bZ6SvAW~emVyYuUj@~jC*9%?$u!0NG*y!?oI1a* z=k%Ty%Or#K`#vo^9A*=JbyCR9xUxs`+U$il9^AgPD1EUU%UqVdF11gc5J!7R{I7vnP*d+A50Ga zx)ApnYg>~n_MJK}lYBH-=Vj(}kK0|wX=ir4I?P|Vd5bZqivE1D_${cVh3J%l*JuzG zN{#;<54gPjcd&9nN@PMKYuD20aaHF-&TrYWago`cP>U6h);lSr3dft3Zg!Ctoa<`V z+RSw_s!6vvYvytGh3Dr)eNqTq9y9T~RPsu*nhlM@(w_HjD6MLY`4kveGh_O^eLJ>( zxw#>fx2IFP{!7o)_}}Wavrc{9@=5c%ZxUI|H)YLlkBjn zb2#AgwvM5aVQECcLDp{7=`ls?LoPi59SK&LH*5|B%X_}~`7Q8DR&oOBZ*xQEt-sBm z9Zp`_x#*kR%6XcZzoXM*A8kFPpDNrL@+au5bDEg@)UYLQudJQ0=;QJJ%A1e+`80no zJk0)Y^{2~9KV0su^|*CLv+t9}`lvrDx8!dgv$&zbuPgoShSI9;jbFNikN;Si_b0_U zzUrk(+PXYNkIjetGSf2!JC2B`C2cG@b$m`uNq~a7@-4-;3c3$Y^v!s&;c)xDB+dO< zL3KxydNkO-9Z}d9wk3=wXYt-Q9c%wYNk-dcYH@E{)o=Mm)c3RD0=%{0 z;p|NZ)mx`?bxOu*Cx0mj5d0W(@nZOCo7#^#A19+7`=hi@XP3m}%0DOjHN`3Rv7r`2f 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 z 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 uar9KGoqU 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 Date: Wed, 10 Feb 2021 13:58:08 +0100 Subject: [PATCH 119/120] Move all into newgui/ --- .editorconfig => newgui/.editorconfig | 0 .gitignore => newgui/.gitignore | 0 LICENSE => newgui/LICENSE | 0 README.md => newgui/README.md | 0 angular.json => newgui/angular.json | 0 browserslist => newgui/browserslist | 0 {e2e => newgui/e2e}/protractor.conf.js | 0 {e2e => newgui/e2e}/src/app.e2e-spec.ts | 0 {e2e => newgui/e2e}/src/app.po.ts | 0 {e2e => newgui/e2e}/tsconfig.json | 0 karma.conf.js => newgui/karma.conf.js | 0 package-lock.json => newgui/package-lock.json | 0 package.json => newgui/package.json | 0 screenshot.png => newgui/screenshot.png | Bin {src => newgui/src}/app/api-utils.ts | 0 {src => newgui/src}/app/app-routing.module.ts | 0 {src => newgui/src}/app/app.component.html | 0 {src => newgui/src}/app/app.component.scss | 0 {src => newgui/src}/app/app.component.spec.ts | 0 {src => newgui/src}/app/app.component.ts | 0 {src => newgui/src}/app/app.module.ts | 0 {src => newgui/src}/app/card/card.component.scss | 0 {src => newgui/src}/app/card/card.component.spec.ts | 0 {src => newgui/src}/app/card/card.component.ts | 0 .../app/charts/chart-item/chart-item.component.html | 0 .../app/charts/chart-item/chart-item.component.scss | 0 .../charts/chart-item/chart-item.component.spec.ts | 0 .../app/charts/chart-item/chart-item.component.ts | 0 .../src}/app/charts/chart/chart.component.html | 0 .../src}/app/charts/chart/chart.component.scss | 0 .../src}/app/charts/chart/chart.component.spec.ts | 0 .../src}/app/charts/chart/chart.component.ts | 0 .../charts/donut-chart/donut-chart.component.html | 0 .../charts/donut-chart/donut-chart.component.scss | 0 .../donut-chart/donut-chart.component.spec.ts | 0 .../app/charts/donut-chart/donut-chart.component.ts | 0 {src => newgui/src}/app/charts/tooltip.ts | 0 {src => newgui/src}/app/completion.ts | 0 {src => newgui/src}/app/connections.ts | 0 .../src}/app/dashboard/dashboard.component.html | 0 .../src}/app/dashboard/dashboard.component.scss | 0 .../src}/app/dashboard/dashboard.component.spec.ts | 0 .../src}/app/dashboard/dashboard.component.ts | 0 {src => newgui/src}/app/device.ts | 0 .../src}/app/dialog/dialog.component.html | 0 .../src}/app/dialog/dialog.component.scss | 0 .../src}/app/dialog/dialog.component.spec.ts | 0 {src => newgui/src}/app/dialog/dialog.component.ts | 0 {src => newgui/src}/app/folder.ts | 0 .../http-interceptors/caching.interceptor.spec.ts | 0 .../app/http-interceptors/caching.interceptor.ts | 0 .../app/http-interceptors/csrf.interceptor.spec.ts | 0 .../src}/app/http-interceptors/csrf.interceptor.ts | 0 .../app/http-interceptors/error.interceptor.spec.ts | 0 .../src}/app/http-interceptors/error.interceptor.ts | 0 {src => newgui/src}/app/http-interceptors/index.ts | 0 .../src}/app/list-toggle/list-toggle.component.html | 0 .../src}/app/list-toggle/list-toggle.component.scss | 0 .../app/list-toggle/list-toggle.component.spec.ts | 0 .../src}/app/list-toggle/list-toggle.component.ts | 0 .../lists/device-list/device-list.component.html | 0 .../lists/device-list/device-list.component.spec.ts | 0 .../app/lists/device-list/device-list.component.ts | 0 .../lists/folder-list/folder-list.component.html | 0 .../lists/folder-list/folder-list.component.spec.ts | 0 .../app/lists/folder-list/folder-list.component.ts | 0 .../lists/status-list/status-list.component.html | 0 .../lists/status-list/status-list.component.scss | 0 .../lists/status-list/status-list.component.spec.ts | 0 .../app/lists/status-list/status-list.component.ts | 0 {src => newgui/src}/app/mocks/mock-db-completion.ts | 0 {src => newgui/src}/app/mocks/mock-db-status.ts | 0 {src => newgui/src}/app/mocks/mock-system-config.ts | 0 .../src}/app/mocks/mock-system-connections.ts | 0 {src => newgui/src}/app/mocks/mock-system-status.ts | 0 .../src}/app/services/cookie.service.spec.ts | 0 {src => newgui/src}/app/services/cookie.service.ts | 0 .../src}/app/services/db-completion.service.spec.ts | 0 .../src}/app/services/db-completion.service.ts | 0 .../src}/app/services/db-status.service.spec.ts | 0 .../src}/app/services/db-status.service.ts | 0 .../src}/app/services/device.service.spec.ts | 0 {src => newgui/src}/app/services/device.service.ts | 0 .../src}/app/services/filter.service.spec.ts | 0 {src => newgui/src}/app/services/filter.service.ts | 0 .../src}/app/services/folder.service.spec.ts | 0 {src => newgui/src}/app/services/folder.service.ts | 0 .../services/in-memory-config-data.service.spec.ts | 0 .../app/services/in-memory-config-data.service.ts | 0 .../src}/app/services/message.service.spec.ts | 0 {src => newgui/src}/app/services/message.service.ts | 0 .../src}/app/services/progress.service.spec.ts | 0 .../src}/app/services/progress.service.ts | 0 .../src}/app/services/request-cache.service.spec.ts | 0 .../src}/app/services/request-cache.service.ts | 0 .../src}/app/services/system-config.service.spec.ts | 0 .../src}/app/services/system-config.service.ts | 0 .../app/services/system-connections.service.spec.ts | 0 .../src}/app/services/system-connections.service.ts | 0 .../src}/app/services/system-status.service.spec.ts | 0 .../src}/app/services/system-status.service.ts | 0 {src => newgui/src}/app/style.ts | 0 {src => newgui/src}/app/system-status.ts | 0 {src => newgui/src}/app/trim.pipe.spec.ts | 0 {src => newgui/src}/app/trim.pipe.ts | 0 {src => newgui/src}/app/type.ts | 0 {src => newgui/src}/assets/.gitkeep | 0 {src => newgui/src}/assets/logo-horizontal.svg | 0 .../src}/environments/environment.prod.ts | 0 {src => newgui/src}/environments/environment.ts | 0 {src => newgui/src}/favicon.ico | Bin {src => newgui/src}/index.html | 0 {src => newgui/src}/main.ts | 0 {src => newgui/src}/polyfills.ts | 0 {src => newgui/src}/styles.scss | 0 {src => newgui/src}/test.ts | 0 tsconfig.app.json => newgui/tsconfig.app.json | 0 tsconfig.json => newgui/tsconfig.json | 0 tsconfig.spec.json => newgui/tsconfig.spec.json | 0 tslint.json => newgui/tslint.json | 0 120 files changed, 0 insertions(+), 0 deletions(-) rename .editorconfig => newgui/.editorconfig (100%) rename .gitignore => newgui/.gitignore (100%) rename LICENSE => newgui/LICENSE (100%) rename README.md => newgui/README.md (100%) rename angular.json => newgui/angular.json (100%) rename browserslist => newgui/browserslist (100%) rename {e2e => newgui/e2e}/protractor.conf.js (100%) rename {e2e => newgui/e2e}/src/app.e2e-spec.ts (100%) rename {e2e => newgui/e2e}/src/app.po.ts (100%) rename {e2e => newgui/e2e}/tsconfig.json (100%) rename karma.conf.js => newgui/karma.conf.js (100%) rename package-lock.json => newgui/package-lock.json (100%) rename package.json => newgui/package.json (100%) rename screenshot.png => newgui/screenshot.png (100%) rename {src => newgui/src}/app/api-utils.ts (100%) rename {src => newgui/src}/app/app-routing.module.ts (100%) rename {src => newgui/src}/app/app.component.html (100%) rename {src => newgui/src}/app/app.component.scss (100%) rename {src => newgui/src}/app/app.component.spec.ts (100%) rename {src => newgui/src}/app/app.component.ts (100%) rename {src => newgui/src}/app/app.module.ts (100%) rename {src => newgui/src}/app/card/card.component.scss (100%) rename {src => newgui/src}/app/card/card.component.spec.ts (100%) rename {src => newgui/src}/app/card/card.component.ts (100%) rename {src => newgui/src}/app/charts/chart-item/chart-item.component.html (100%) rename {src => newgui/src}/app/charts/chart-item/chart-item.component.scss (100%) rename {src => newgui/src}/app/charts/chart-item/chart-item.component.spec.ts (100%) rename {src => newgui/src}/app/charts/chart-item/chart-item.component.ts (100%) rename {src => newgui/src}/app/charts/chart/chart.component.html (100%) rename {src => newgui/src}/app/charts/chart/chart.component.scss (100%) rename {src => newgui/src}/app/charts/chart/chart.component.spec.ts (100%) rename {src => newgui/src}/app/charts/chart/chart.component.ts (100%) rename {src => newgui/src}/app/charts/donut-chart/donut-chart.component.html (100%) rename {src => newgui/src}/app/charts/donut-chart/donut-chart.component.scss (100%) rename {src => newgui/src}/app/charts/donut-chart/donut-chart.component.spec.ts (100%) rename {src => newgui/src}/app/charts/donut-chart/donut-chart.component.ts (100%) rename {src => newgui/src}/app/charts/tooltip.ts (100%) rename {src => newgui/src}/app/completion.ts (100%) rename {src => newgui/src}/app/connections.ts (100%) rename {src => newgui/src}/app/dashboard/dashboard.component.html (100%) rename {src => newgui/src}/app/dashboard/dashboard.component.scss (100%) rename {src => newgui/src}/app/dashboard/dashboard.component.spec.ts (100%) rename {src => newgui/src}/app/dashboard/dashboard.component.ts (100%) rename {src => newgui/src}/app/device.ts (100%) rename {src => newgui/src}/app/dialog/dialog.component.html (100%) rename {src => newgui/src}/app/dialog/dialog.component.scss (100%) rename {src => newgui/src}/app/dialog/dialog.component.spec.ts (100%) rename {src => newgui/src}/app/dialog/dialog.component.ts (100%) rename {src => newgui/src}/app/folder.ts (100%) rename {src => newgui/src}/app/http-interceptors/caching.interceptor.spec.ts (100%) rename {src => newgui/src}/app/http-interceptors/caching.interceptor.ts (100%) rename {src => newgui/src}/app/http-interceptors/csrf.interceptor.spec.ts (100%) rename {src => newgui/src}/app/http-interceptors/csrf.interceptor.ts (100%) rename {src => newgui/src}/app/http-interceptors/error.interceptor.spec.ts (100%) rename {src => newgui/src}/app/http-interceptors/error.interceptor.ts (100%) rename {src => newgui/src}/app/http-interceptors/index.ts (100%) rename {src => newgui/src}/app/list-toggle/list-toggle.component.html (100%) rename {src => newgui/src}/app/list-toggle/list-toggle.component.scss (100%) rename {src => newgui/src}/app/list-toggle/list-toggle.component.spec.ts (100%) rename {src => newgui/src}/app/list-toggle/list-toggle.component.ts (100%) rename {src => newgui/src}/app/lists/device-list/device-list.component.html (100%) rename {src => newgui/src}/app/lists/device-list/device-list.component.spec.ts (100%) rename {src => newgui/src}/app/lists/device-list/device-list.component.ts (100%) rename {src => newgui/src}/app/lists/folder-list/folder-list.component.html (100%) rename {src => newgui/src}/app/lists/folder-list/folder-list.component.spec.ts (100%) rename {src => newgui/src}/app/lists/folder-list/folder-list.component.ts (100%) rename {src => newgui/src}/app/lists/status-list/status-list.component.html (100%) rename {src => newgui/src}/app/lists/status-list/status-list.component.scss (100%) rename {src => newgui/src}/app/lists/status-list/status-list.component.spec.ts (100%) rename {src => newgui/src}/app/lists/status-list/status-list.component.ts (100%) rename {src => newgui/src}/app/mocks/mock-db-completion.ts (100%) rename {src => newgui/src}/app/mocks/mock-db-status.ts (100%) rename {src => newgui/src}/app/mocks/mock-system-config.ts (100%) rename {src => newgui/src}/app/mocks/mock-system-connections.ts (100%) rename {src => newgui/src}/app/mocks/mock-system-status.ts (100%) rename {src => newgui/src}/app/services/cookie.service.spec.ts (100%) rename {src => newgui/src}/app/services/cookie.service.ts (100%) rename {src => newgui/src}/app/services/db-completion.service.spec.ts (100%) rename {src => newgui/src}/app/services/db-completion.service.ts (100%) rename {src => newgui/src}/app/services/db-status.service.spec.ts (100%) rename {src => newgui/src}/app/services/db-status.service.ts (100%) rename {src => newgui/src}/app/services/device.service.spec.ts (100%) rename {src => newgui/src}/app/services/device.service.ts (100%) rename {src => newgui/src}/app/services/filter.service.spec.ts (100%) rename {src => newgui/src}/app/services/filter.service.ts (100%) rename {src => newgui/src}/app/services/folder.service.spec.ts (100%) rename {src => newgui/src}/app/services/folder.service.ts (100%) rename {src => newgui/src}/app/services/in-memory-config-data.service.spec.ts (100%) rename {src => newgui/src}/app/services/in-memory-config-data.service.ts (100%) rename {src => newgui/src}/app/services/message.service.spec.ts (100%) rename {src => newgui/src}/app/services/message.service.ts (100%) rename {src => newgui/src}/app/services/progress.service.spec.ts (100%) rename {src => newgui/src}/app/services/progress.service.ts (100%) rename {src => newgui/src}/app/services/request-cache.service.spec.ts (100%) rename {src => newgui/src}/app/services/request-cache.service.ts (100%) rename {src => newgui/src}/app/services/system-config.service.spec.ts (100%) rename {src => newgui/src}/app/services/system-config.service.ts (100%) rename {src => newgui/src}/app/services/system-connections.service.spec.ts (100%) rename {src => newgui/src}/app/services/system-connections.service.ts (100%) rename {src => newgui/src}/app/services/system-status.service.spec.ts (100%) rename {src => newgui/src}/app/services/system-status.service.ts (100%) rename {src => newgui/src}/app/style.ts (100%) rename {src => newgui/src}/app/system-status.ts (100%) rename {src => newgui/src}/app/trim.pipe.spec.ts (100%) rename {src => newgui/src}/app/trim.pipe.ts (100%) rename {src => newgui/src}/app/type.ts (100%) rename {src => newgui/src}/assets/.gitkeep (100%) rename {src => newgui/src}/assets/logo-horizontal.svg (100%) rename {src => newgui/src}/environments/environment.prod.ts (100%) rename {src => newgui/src}/environments/environment.ts (100%) rename {src => newgui/src}/favicon.ico (100%) rename {src => newgui/src}/index.html (100%) rename {src => newgui/src}/main.ts (100%) rename {src => newgui/src}/polyfills.ts (100%) rename {src => newgui/src}/styles.scss (100%) rename {src => newgui/src}/test.ts (100%) rename tsconfig.app.json => newgui/tsconfig.app.json (100%) rename tsconfig.json => newgui/tsconfig.json (100%) rename tsconfig.spec.json => newgui/tsconfig.spec.json (100%) rename tslint.json => newgui/tslint.json (100%) diff --git a/.editorconfig b/newgui/.editorconfig similarity index 100% rename from .editorconfig rename to newgui/.editorconfig diff --git a/.gitignore b/newgui/.gitignore similarity index 100% rename from .gitignore rename to newgui/.gitignore diff --git a/LICENSE b/newgui/LICENSE similarity index 100% rename from LICENSE rename to newgui/LICENSE diff --git a/README.md b/newgui/README.md similarity index 100% rename from README.md rename to newgui/README.md diff --git a/angular.json b/newgui/angular.json similarity index 100% rename from angular.json rename to newgui/angular.json diff --git a/browserslist b/newgui/browserslist similarity index 100% rename from browserslist rename to newgui/browserslist diff --git a/e2e/protractor.conf.js b/newgui/e2e/protractor.conf.js similarity index 100% rename from e2e/protractor.conf.js rename to newgui/e2e/protractor.conf.js diff --git a/e2e/src/app.e2e-spec.ts b/newgui/e2e/src/app.e2e-spec.ts similarity index 100% rename from e2e/src/app.e2e-spec.ts rename to newgui/e2e/src/app.e2e-spec.ts diff --git a/e2e/src/app.po.ts b/newgui/e2e/src/app.po.ts similarity index 100% rename from e2e/src/app.po.ts rename to newgui/e2e/src/app.po.ts diff --git a/e2e/tsconfig.json b/newgui/e2e/tsconfig.json similarity index 100% rename from e2e/tsconfig.json rename to newgui/e2e/tsconfig.json diff --git a/karma.conf.js b/newgui/karma.conf.js similarity index 100% rename from karma.conf.js rename to newgui/karma.conf.js diff --git a/package-lock.json b/newgui/package-lock.json similarity index 100% rename from package-lock.json rename to newgui/package-lock.json diff --git a/package.json b/newgui/package.json similarity index 100% rename from package.json rename to newgui/package.json diff --git a/screenshot.png b/newgui/screenshot.png similarity index 100% rename from screenshot.png rename to newgui/screenshot.png diff --git a/src/app/api-utils.ts b/newgui/src/app/api-utils.ts similarity index 100% rename from src/app/api-utils.ts rename to newgui/src/app/api-utils.ts diff --git a/src/app/app-routing.module.ts b/newgui/src/app/app-routing.module.ts similarity index 100% rename from src/app/app-routing.module.ts rename to newgui/src/app/app-routing.module.ts diff --git a/src/app/app.component.html b/newgui/src/app/app.component.html similarity index 100% rename from src/app/app.component.html rename to newgui/src/app/app.component.html diff --git a/src/app/app.component.scss b/newgui/src/app/app.component.scss similarity index 100% rename from src/app/app.component.scss rename to newgui/src/app/app.component.scss diff --git a/src/app/app.component.spec.ts b/newgui/src/app/app.component.spec.ts similarity index 100% rename from src/app/app.component.spec.ts rename to newgui/src/app/app.component.spec.ts diff --git a/src/app/app.component.ts b/newgui/src/app/app.component.ts similarity index 100% rename from src/app/app.component.ts rename to newgui/src/app/app.component.ts diff --git a/src/app/app.module.ts b/newgui/src/app/app.module.ts similarity index 100% rename from src/app/app.module.ts rename to newgui/src/app/app.module.ts diff --git a/src/app/card/card.component.scss b/newgui/src/app/card/card.component.scss similarity index 100% rename from src/app/card/card.component.scss rename to newgui/src/app/card/card.component.scss diff --git a/src/app/card/card.component.spec.ts b/newgui/src/app/card/card.component.spec.ts similarity index 100% rename from src/app/card/card.component.spec.ts rename to newgui/src/app/card/card.component.spec.ts diff --git a/src/app/card/card.component.ts b/newgui/src/app/card/card.component.ts similarity index 100% rename from src/app/card/card.component.ts rename to newgui/src/app/card/card.component.ts diff --git a/src/app/charts/chart-item/chart-item.component.html b/newgui/src/app/charts/chart-item/chart-item.component.html similarity index 100% rename from src/app/charts/chart-item/chart-item.component.html rename to newgui/src/app/charts/chart-item/chart-item.component.html diff --git a/src/app/charts/chart-item/chart-item.component.scss b/newgui/src/app/charts/chart-item/chart-item.component.scss similarity index 100% rename from src/app/charts/chart-item/chart-item.component.scss rename to newgui/src/app/charts/chart-item/chart-item.component.scss diff --git a/src/app/charts/chart-item/chart-item.component.spec.ts b/newgui/src/app/charts/chart-item/chart-item.component.spec.ts similarity index 100% rename from src/app/charts/chart-item/chart-item.component.spec.ts rename to newgui/src/app/charts/chart-item/chart-item.component.spec.ts diff --git a/src/app/charts/chart-item/chart-item.component.ts b/newgui/src/app/charts/chart-item/chart-item.component.ts similarity index 100% rename from src/app/charts/chart-item/chart-item.component.ts rename to newgui/src/app/charts/chart-item/chart-item.component.ts diff --git a/src/app/charts/chart/chart.component.html b/newgui/src/app/charts/chart/chart.component.html similarity index 100% rename from src/app/charts/chart/chart.component.html rename to newgui/src/app/charts/chart/chart.component.html diff --git a/src/app/charts/chart/chart.component.scss b/newgui/src/app/charts/chart/chart.component.scss similarity index 100% rename from src/app/charts/chart/chart.component.scss rename to newgui/src/app/charts/chart/chart.component.scss diff --git a/src/app/charts/chart/chart.component.spec.ts b/newgui/src/app/charts/chart/chart.component.spec.ts similarity index 100% rename from src/app/charts/chart/chart.component.spec.ts rename to newgui/src/app/charts/chart/chart.component.spec.ts diff --git a/src/app/charts/chart/chart.component.ts b/newgui/src/app/charts/chart/chart.component.ts similarity index 100% rename from src/app/charts/chart/chart.component.ts rename to newgui/src/app/charts/chart/chart.component.ts diff --git a/src/app/charts/donut-chart/donut-chart.component.html b/newgui/src/app/charts/donut-chart/donut-chart.component.html similarity index 100% rename from src/app/charts/donut-chart/donut-chart.component.html rename to newgui/src/app/charts/donut-chart/donut-chart.component.html diff --git a/src/app/charts/donut-chart/donut-chart.component.scss b/newgui/src/app/charts/donut-chart/donut-chart.component.scss similarity index 100% rename from src/app/charts/donut-chart/donut-chart.component.scss rename to newgui/src/app/charts/donut-chart/donut-chart.component.scss diff --git a/src/app/charts/donut-chart/donut-chart.component.spec.ts b/newgui/src/app/charts/donut-chart/donut-chart.component.spec.ts similarity index 100% rename from src/app/charts/donut-chart/donut-chart.component.spec.ts rename to newgui/src/app/charts/donut-chart/donut-chart.component.spec.ts diff --git a/src/app/charts/donut-chart/donut-chart.component.ts b/newgui/src/app/charts/donut-chart/donut-chart.component.ts similarity index 100% rename from src/app/charts/donut-chart/donut-chart.component.ts rename to newgui/src/app/charts/donut-chart/donut-chart.component.ts diff --git a/src/app/charts/tooltip.ts b/newgui/src/app/charts/tooltip.ts similarity index 100% rename from src/app/charts/tooltip.ts rename to newgui/src/app/charts/tooltip.ts diff --git a/src/app/completion.ts b/newgui/src/app/completion.ts similarity index 100% rename from src/app/completion.ts rename to newgui/src/app/completion.ts diff --git a/src/app/connections.ts b/newgui/src/app/connections.ts similarity index 100% rename from src/app/connections.ts rename to newgui/src/app/connections.ts diff --git a/src/app/dashboard/dashboard.component.html b/newgui/src/app/dashboard/dashboard.component.html similarity index 100% rename from src/app/dashboard/dashboard.component.html rename to newgui/src/app/dashboard/dashboard.component.html diff --git a/src/app/dashboard/dashboard.component.scss b/newgui/src/app/dashboard/dashboard.component.scss similarity index 100% rename from src/app/dashboard/dashboard.component.scss rename to newgui/src/app/dashboard/dashboard.component.scss diff --git a/src/app/dashboard/dashboard.component.spec.ts b/newgui/src/app/dashboard/dashboard.component.spec.ts similarity index 100% rename from src/app/dashboard/dashboard.component.spec.ts rename to newgui/src/app/dashboard/dashboard.component.spec.ts diff --git a/src/app/dashboard/dashboard.component.ts b/newgui/src/app/dashboard/dashboard.component.ts similarity index 100% rename from src/app/dashboard/dashboard.component.ts rename to newgui/src/app/dashboard/dashboard.component.ts diff --git a/src/app/device.ts b/newgui/src/app/device.ts similarity index 100% rename from src/app/device.ts rename to newgui/src/app/device.ts diff --git a/src/app/dialog/dialog.component.html b/newgui/src/app/dialog/dialog.component.html similarity index 100% rename from src/app/dialog/dialog.component.html rename to newgui/src/app/dialog/dialog.component.html diff --git a/src/app/dialog/dialog.component.scss b/newgui/src/app/dialog/dialog.component.scss similarity index 100% rename from src/app/dialog/dialog.component.scss rename to newgui/src/app/dialog/dialog.component.scss diff --git a/src/app/dialog/dialog.component.spec.ts b/newgui/src/app/dialog/dialog.component.spec.ts similarity index 100% rename from src/app/dialog/dialog.component.spec.ts rename to newgui/src/app/dialog/dialog.component.spec.ts diff --git a/src/app/dialog/dialog.component.ts b/newgui/src/app/dialog/dialog.component.ts similarity index 100% rename from src/app/dialog/dialog.component.ts rename to newgui/src/app/dialog/dialog.component.ts diff --git a/src/app/folder.ts b/newgui/src/app/folder.ts similarity index 100% rename from src/app/folder.ts rename to newgui/src/app/folder.ts diff --git a/src/app/http-interceptors/caching.interceptor.spec.ts b/newgui/src/app/http-interceptors/caching.interceptor.spec.ts similarity index 100% rename from src/app/http-interceptors/caching.interceptor.spec.ts rename to newgui/src/app/http-interceptors/caching.interceptor.spec.ts diff --git a/src/app/http-interceptors/caching.interceptor.ts b/newgui/src/app/http-interceptors/caching.interceptor.ts similarity index 100% rename from src/app/http-interceptors/caching.interceptor.ts rename to newgui/src/app/http-interceptors/caching.interceptor.ts diff --git a/src/app/http-interceptors/csrf.interceptor.spec.ts b/newgui/src/app/http-interceptors/csrf.interceptor.spec.ts similarity index 100% rename from src/app/http-interceptors/csrf.interceptor.spec.ts rename to newgui/src/app/http-interceptors/csrf.interceptor.spec.ts diff --git a/src/app/http-interceptors/csrf.interceptor.ts b/newgui/src/app/http-interceptors/csrf.interceptor.ts similarity index 100% rename from src/app/http-interceptors/csrf.interceptor.ts rename to newgui/src/app/http-interceptors/csrf.interceptor.ts diff --git a/src/app/http-interceptors/error.interceptor.spec.ts b/newgui/src/app/http-interceptors/error.interceptor.spec.ts similarity index 100% rename from src/app/http-interceptors/error.interceptor.spec.ts rename to newgui/src/app/http-interceptors/error.interceptor.spec.ts diff --git a/src/app/http-interceptors/error.interceptor.ts b/newgui/src/app/http-interceptors/error.interceptor.ts similarity index 100% rename from src/app/http-interceptors/error.interceptor.ts rename to newgui/src/app/http-interceptors/error.interceptor.ts diff --git a/src/app/http-interceptors/index.ts b/newgui/src/app/http-interceptors/index.ts similarity index 100% rename from src/app/http-interceptors/index.ts rename to newgui/src/app/http-interceptors/index.ts diff --git a/src/app/list-toggle/list-toggle.component.html b/newgui/src/app/list-toggle/list-toggle.component.html similarity index 100% rename from src/app/list-toggle/list-toggle.component.html rename to newgui/src/app/list-toggle/list-toggle.component.html diff --git a/src/app/list-toggle/list-toggle.component.scss b/newgui/src/app/list-toggle/list-toggle.component.scss similarity index 100% rename from src/app/list-toggle/list-toggle.component.scss rename to newgui/src/app/list-toggle/list-toggle.component.scss diff --git a/src/app/list-toggle/list-toggle.component.spec.ts b/newgui/src/app/list-toggle/list-toggle.component.spec.ts similarity index 100% rename from src/app/list-toggle/list-toggle.component.spec.ts rename to newgui/src/app/list-toggle/list-toggle.component.spec.ts diff --git a/src/app/list-toggle/list-toggle.component.ts b/newgui/src/app/list-toggle/list-toggle.component.ts similarity index 100% rename from src/app/list-toggle/list-toggle.component.ts rename to newgui/src/app/list-toggle/list-toggle.component.ts diff --git a/src/app/lists/device-list/device-list.component.html b/newgui/src/app/lists/device-list/device-list.component.html similarity index 100% rename from src/app/lists/device-list/device-list.component.html rename to newgui/src/app/lists/device-list/device-list.component.html diff --git a/src/app/lists/device-list/device-list.component.spec.ts b/newgui/src/app/lists/device-list/device-list.component.spec.ts similarity index 100% rename from src/app/lists/device-list/device-list.component.spec.ts rename to newgui/src/app/lists/device-list/device-list.component.spec.ts diff --git a/src/app/lists/device-list/device-list.component.ts b/newgui/src/app/lists/device-list/device-list.component.ts similarity index 100% rename from src/app/lists/device-list/device-list.component.ts rename to newgui/src/app/lists/device-list/device-list.component.ts diff --git a/src/app/lists/folder-list/folder-list.component.html b/newgui/src/app/lists/folder-list/folder-list.component.html similarity index 100% rename from src/app/lists/folder-list/folder-list.component.html rename to newgui/src/app/lists/folder-list/folder-list.component.html diff --git a/src/app/lists/folder-list/folder-list.component.spec.ts b/newgui/src/app/lists/folder-list/folder-list.component.spec.ts similarity index 100% rename from src/app/lists/folder-list/folder-list.component.spec.ts rename to newgui/src/app/lists/folder-list/folder-list.component.spec.ts diff --git a/src/app/lists/folder-list/folder-list.component.ts b/newgui/src/app/lists/folder-list/folder-list.component.ts similarity index 100% rename from src/app/lists/folder-list/folder-list.component.ts rename to newgui/src/app/lists/folder-list/folder-list.component.ts diff --git a/src/app/lists/status-list/status-list.component.html b/newgui/src/app/lists/status-list/status-list.component.html similarity index 100% rename from src/app/lists/status-list/status-list.component.html rename to newgui/src/app/lists/status-list/status-list.component.html diff --git a/src/app/lists/status-list/status-list.component.scss b/newgui/src/app/lists/status-list/status-list.component.scss similarity index 100% rename from src/app/lists/status-list/status-list.component.scss rename to newgui/src/app/lists/status-list/status-list.component.scss diff --git a/src/app/lists/status-list/status-list.component.spec.ts b/newgui/src/app/lists/status-list/status-list.component.spec.ts similarity index 100% rename from src/app/lists/status-list/status-list.component.spec.ts rename to newgui/src/app/lists/status-list/status-list.component.spec.ts diff --git a/src/app/lists/status-list/status-list.component.ts b/newgui/src/app/lists/status-list/status-list.component.ts similarity index 100% rename from src/app/lists/status-list/status-list.component.ts rename to newgui/src/app/lists/status-list/status-list.component.ts diff --git a/src/app/mocks/mock-db-completion.ts b/newgui/src/app/mocks/mock-db-completion.ts similarity index 100% rename from src/app/mocks/mock-db-completion.ts rename to newgui/src/app/mocks/mock-db-completion.ts diff --git a/src/app/mocks/mock-db-status.ts b/newgui/src/app/mocks/mock-db-status.ts similarity index 100% rename from src/app/mocks/mock-db-status.ts rename to newgui/src/app/mocks/mock-db-status.ts diff --git a/src/app/mocks/mock-system-config.ts b/newgui/src/app/mocks/mock-system-config.ts similarity index 100% rename from src/app/mocks/mock-system-config.ts rename to newgui/src/app/mocks/mock-system-config.ts diff --git a/src/app/mocks/mock-system-connections.ts b/newgui/src/app/mocks/mock-system-connections.ts similarity index 100% rename from src/app/mocks/mock-system-connections.ts rename to newgui/src/app/mocks/mock-system-connections.ts diff --git a/src/app/mocks/mock-system-status.ts b/newgui/src/app/mocks/mock-system-status.ts similarity index 100% rename from src/app/mocks/mock-system-status.ts rename to newgui/src/app/mocks/mock-system-status.ts diff --git a/src/app/services/cookie.service.spec.ts b/newgui/src/app/services/cookie.service.spec.ts similarity index 100% rename from src/app/services/cookie.service.spec.ts rename to newgui/src/app/services/cookie.service.spec.ts diff --git a/src/app/services/cookie.service.ts b/newgui/src/app/services/cookie.service.ts similarity index 100% rename from src/app/services/cookie.service.ts rename to newgui/src/app/services/cookie.service.ts diff --git a/src/app/services/db-completion.service.spec.ts b/newgui/src/app/services/db-completion.service.spec.ts similarity index 100% rename from src/app/services/db-completion.service.spec.ts rename to newgui/src/app/services/db-completion.service.spec.ts diff --git a/src/app/services/db-completion.service.ts b/newgui/src/app/services/db-completion.service.ts similarity index 100% rename from src/app/services/db-completion.service.ts rename to newgui/src/app/services/db-completion.service.ts diff --git a/src/app/services/db-status.service.spec.ts b/newgui/src/app/services/db-status.service.spec.ts similarity index 100% rename from src/app/services/db-status.service.spec.ts rename to newgui/src/app/services/db-status.service.spec.ts diff --git a/src/app/services/db-status.service.ts b/newgui/src/app/services/db-status.service.ts similarity index 100% rename from src/app/services/db-status.service.ts rename to newgui/src/app/services/db-status.service.ts diff --git a/src/app/services/device.service.spec.ts b/newgui/src/app/services/device.service.spec.ts similarity index 100% rename from src/app/services/device.service.spec.ts rename to newgui/src/app/services/device.service.spec.ts diff --git a/src/app/services/device.service.ts b/newgui/src/app/services/device.service.ts similarity index 100% rename from src/app/services/device.service.ts rename to newgui/src/app/services/device.service.ts diff --git a/src/app/services/filter.service.spec.ts b/newgui/src/app/services/filter.service.spec.ts similarity index 100% rename from src/app/services/filter.service.spec.ts rename to newgui/src/app/services/filter.service.spec.ts diff --git a/src/app/services/filter.service.ts b/newgui/src/app/services/filter.service.ts similarity index 100% rename from src/app/services/filter.service.ts rename to newgui/src/app/services/filter.service.ts diff --git a/src/app/services/folder.service.spec.ts b/newgui/src/app/services/folder.service.spec.ts similarity index 100% rename from src/app/services/folder.service.spec.ts rename to newgui/src/app/services/folder.service.spec.ts diff --git a/src/app/services/folder.service.ts b/newgui/src/app/services/folder.service.ts similarity index 100% rename from src/app/services/folder.service.ts rename to newgui/src/app/services/folder.service.ts diff --git a/src/app/services/in-memory-config-data.service.spec.ts b/newgui/src/app/services/in-memory-config-data.service.spec.ts similarity index 100% rename from src/app/services/in-memory-config-data.service.spec.ts rename to newgui/src/app/services/in-memory-config-data.service.spec.ts diff --git a/src/app/services/in-memory-config-data.service.ts b/newgui/src/app/services/in-memory-config-data.service.ts similarity index 100% rename from src/app/services/in-memory-config-data.service.ts rename to newgui/src/app/services/in-memory-config-data.service.ts diff --git a/src/app/services/message.service.spec.ts b/newgui/src/app/services/message.service.spec.ts similarity index 100% rename from src/app/services/message.service.spec.ts rename to newgui/src/app/services/message.service.spec.ts diff --git a/src/app/services/message.service.ts b/newgui/src/app/services/message.service.ts similarity index 100% rename from src/app/services/message.service.ts rename to newgui/src/app/services/message.service.ts diff --git a/src/app/services/progress.service.spec.ts b/newgui/src/app/services/progress.service.spec.ts similarity index 100% rename from src/app/services/progress.service.spec.ts rename to newgui/src/app/services/progress.service.spec.ts diff --git a/src/app/services/progress.service.ts b/newgui/src/app/services/progress.service.ts similarity index 100% rename from src/app/services/progress.service.ts rename to newgui/src/app/services/progress.service.ts diff --git a/src/app/services/request-cache.service.spec.ts b/newgui/src/app/services/request-cache.service.spec.ts similarity index 100% rename from src/app/services/request-cache.service.spec.ts rename to newgui/src/app/services/request-cache.service.spec.ts diff --git a/src/app/services/request-cache.service.ts b/newgui/src/app/services/request-cache.service.ts similarity index 100% rename from src/app/services/request-cache.service.ts rename to newgui/src/app/services/request-cache.service.ts diff --git a/src/app/services/system-config.service.spec.ts b/newgui/src/app/services/system-config.service.spec.ts similarity index 100% rename from src/app/services/system-config.service.spec.ts rename to newgui/src/app/services/system-config.service.spec.ts diff --git a/src/app/services/system-config.service.ts b/newgui/src/app/services/system-config.service.ts similarity index 100% rename from src/app/services/system-config.service.ts rename to newgui/src/app/services/system-config.service.ts diff --git a/src/app/services/system-connections.service.spec.ts b/newgui/src/app/services/system-connections.service.spec.ts similarity index 100% rename from src/app/services/system-connections.service.spec.ts rename to newgui/src/app/services/system-connections.service.spec.ts diff --git a/src/app/services/system-connections.service.ts b/newgui/src/app/services/system-connections.service.ts similarity index 100% rename from src/app/services/system-connections.service.ts rename to newgui/src/app/services/system-connections.service.ts diff --git a/src/app/services/system-status.service.spec.ts b/newgui/src/app/services/system-status.service.spec.ts similarity index 100% rename from src/app/services/system-status.service.spec.ts rename to newgui/src/app/services/system-status.service.spec.ts diff --git a/src/app/services/system-status.service.ts b/newgui/src/app/services/system-status.service.ts similarity index 100% rename from src/app/services/system-status.service.ts rename to newgui/src/app/services/system-status.service.ts diff --git a/src/app/style.ts b/newgui/src/app/style.ts similarity index 100% rename from src/app/style.ts rename to newgui/src/app/style.ts diff --git a/src/app/system-status.ts b/newgui/src/app/system-status.ts similarity index 100% rename from src/app/system-status.ts rename to newgui/src/app/system-status.ts diff --git a/src/app/trim.pipe.spec.ts b/newgui/src/app/trim.pipe.spec.ts similarity index 100% rename from src/app/trim.pipe.spec.ts rename to newgui/src/app/trim.pipe.spec.ts diff --git a/src/app/trim.pipe.ts b/newgui/src/app/trim.pipe.ts similarity index 100% rename from src/app/trim.pipe.ts rename to newgui/src/app/trim.pipe.ts diff --git a/src/app/type.ts b/newgui/src/app/type.ts similarity index 100% rename from src/app/type.ts rename to newgui/src/app/type.ts diff --git a/src/assets/.gitkeep b/newgui/src/assets/.gitkeep similarity index 100% rename from src/assets/.gitkeep rename to newgui/src/assets/.gitkeep diff --git a/src/assets/logo-horizontal.svg b/newgui/src/assets/logo-horizontal.svg similarity index 100% rename from src/assets/logo-horizontal.svg rename to newgui/src/assets/logo-horizontal.svg diff --git a/src/environments/environment.prod.ts b/newgui/src/environments/environment.prod.ts similarity index 100% rename from src/environments/environment.prod.ts rename to newgui/src/environments/environment.prod.ts diff --git a/src/environments/environment.ts b/newgui/src/environments/environment.ts similarity index 100% rename from src/environments/environment.ts rename to newgui/src/environments/environment.ts diff --git a/src/favicon.ico b/newgui/src/favicon.ico similarity index 100% rename from src/favicon.ico rename to newgui/src/favicon.ico diff --git a/src/index.html b/newgui/src/index.html similarity index 100% rename from src/index.html rename to newgui/src/index.html diff --git a/src/main.ts b/newgui/src/main.ts similarity index 100% rename from src/main.ts rename to newgui/src/main.ts diff --git a/src/polyfills.ts b/newgui/src/polyfills.ts similarity index 100% rename from src/polyfills.ts rename to newgui/src/polyfills.ts diff --git a/src/styles.scss b/newgui/src/styles.scss similarity index 100% rename from src/styles.scss rename to newgui/src/styles.scss diff --git a/src/test.ts b/newgui/src/test.ts similarity index 100% rename from src/test.ts rename to newgui/src/test.ts diff --git a/tsconfig.app.json b/newgui/tsconfig.app.json similarity index 100% rename from tsconfig.app.json rename to newgui/tsconfig.app.json diff --git a/tsconfig.json b/newgui/tsconfig.json similarity index 100% rename from tsconfig.json rename to newgui/tsconfig.json diff --git a/tsconfig.spec.json b/newgui/tsconfig.spec.json similarity index 100% rename from tsconfig.spec.json rename to newgui/tsconfig.spec.json diff --git a/tslint.json b/newgui/tslint.json similarity index 100% rename from tslint.json rename to newgui/tslint.json From 5788ad25290e96d55dd187b310b7506ad1e50757 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Wed, 10 Feb 2021 13:58:51 +0100 Subject: [PATCH 120/120] Reassign copyright to the Syncthing Authors --- newgui/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newgui/README.md b/newgui/README.md index 19b1398ce..4e747ac45 100644 --- a/newgui/README.md +++ b/newgui/README.md @@ -62,4 +62,4 @@ MPLv2 ## Copyright -Copyright (c) 2020 Kastelo Inc. +Copyright (c) 2020 The Syncthing Authors